patches/glibc/2.9/440-alpha-glibc-2.4-xstat.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1201 c9967a6e3b25
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
     1 Original patch from: gentoo/src/patchsets/glibc/2.9/6001_all_alpha-glibc-2.4-xstat.patch
     2 
     3 -= BEGIN original header =-
     4 http://sources.redhat.com/bugzilla/show_bug.cgi?id=1026
     5 http://sourceware.org/ml/libc-alpha/2005-02/msg00122.html
     6 
     7 2005-02-26  GOTO Masanori  <gotom@debian.or.jp>
     8 
     9 	* sysdeps/unix/sysv/linux/kernel-features.h: Define
    10 	__ASSUME_STAT64_SYSCALL.
    11 	* sysdeps/unix/sysv/linux/alpha/fxstat.c: Check
    12 	__ASSUME_STAT64_SYSCALL.
    13 	* sysdeps/unix/sysv/linux/alpha/fxstatat.c: Likewise.
    14 	* sysdeps/unix/sysv/linux/alpha/lxstat.c: Likewise.
    15 	* sysdeps/unix/sysv/linux/alpha/xstat.c: Likewise.
    16 	* sysdeps/unix/sysv/linux/alpha/xstatconv.c: Don't define
    17 	__libc_missing_axp_stat64 when it's not needed.
    18 	* sysdeps/unix/sysv/linux/alpha/xstatconv.h: Likewise.
    19 
    20 -= END original header =-
    21 
    22 diff -durN glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/fxstat.c glibc-2_9/sysdeps/unix/sysv/linux/alpha/fxstat.c
    23 --- glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/fxstat.c	2004-03-11 03:58:44.000000000 +0100
    24 +++ glibc-2_9/sysdeps/unix/sysv/linux/alpha/fxstat.c	2009-02-02 22:01:30.000000000 +0100
    25 @@ -35,27 +35,39 @@
    26  __fxstat (int vers, int fd, struct stat *buf)
    27  {
    28    INTERNAL_SYSCALL_DECL (err);
    29 -  int result, errno_out;
    30 +  int result;
    31    struct kernel_stat kbuf;
    32  
    33 +#if __ASSUME_STAT64_SYSCALL > 0
    34 +  if (vers == _STAT_VER_KERNEL64)
    35 +    {
    36 +      result = INTERNAL_SYSCALL (fstat64, err, 2, fd, buf);
    37 +      if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
    38 +	return result;
    39 +      __set_errno (INTERNAL_SYSCALL_ERRNO (result, err));
    40 +      return -1;
    41 +    }
    42 +#elif defined __NR_fstat64
    43    if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64)
    44      {
    45 +      int errno_out;
    46        result = INTERNAL_SYSCALL (fstat64, err, 2, fd, buf);
    47        if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
    48  	return result;
    49        errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
    50        if (errno_out != ENOSYS)
    51 -	goto fail;
    52 +	{
    53 +	  __set_errno (errno_out);
    54 +	  return -1;
    55 +	}
    56        __libc_missing_axp_stat64 = 1;
    57      }
    58 +#endif
    59  
    60    result = INTERNAL_SYSCALL (fstat, err, 2, fd, &kbuf);
    61    if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
    62      return __xstat_conv (vers, &kbuf, buf);
    63 -  errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
    64 -  
    65 - fail:
    66 -  __set_errno (errno_out);
    67 +  __set_errno (INTERNAL_SYSCALL_ERRNO (result, err));
    68    return -1;
    69  }
    70  hidden_def (__fxstat)
    71 diff -durN glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/fxstatat.c glibc-2_9/sysdeps/unix/sysv/linux/alpha/fxstatat.c
    72 --- glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/fxstatat.c	2006-02-20 23:51:48.000000000 +0100
    73 +++ glibc-2_9/sysdeps/unix/sysv/linux/alpha/fxstatat.c	2009-02-02 22:01:30.000000000 +0100
    74 @@ -65,6 +65,20 @@
    75    int result, errno_out;
    76    struct kernel_stat kst;
    77  
    78 +#if __ASSUME_STAT64_SYSCALL > 0
    79 +  if (vers == _STAT_VER_KERNEL64)
    80 +    {
    81 +      if (flag & AT_SYMLINK_NOFOLLOW)
    82 +	result = INTERNAL_SYSCALL (lstat64, err, 2, file, st);
    83 +      else
    84 +	result = INTERNAL_SYSCALL (stat64, err, 2, file, st);
    85 +
    86 +      if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
    87 +	return result;
    88 +      errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
    89 +      goto fail;
    90 +    }
    91 +#elif defined __NR_stat64
    92    if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64)
    93      {
    94        if (flag & AT_SYMLINK_NOFOLLOW)
    95 @@ -79,6 +93,7 @@
    96  	goto fail;
    97        __libc_missing_axp_stat64 = 1;
    98      }
    99 +#endif
   100  
   101    if (flag & AT_SYMLINK_NOFOLLOW)
   102      result = INTERNAL_SYSCALL (lstat, err, 2, file, &kst);
   103 diff -durN glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/lxstat.c glibc-2_9/sysdeps/unix/sysv/linux/alpha/lxstat.c
   104 --- glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/lxstat.c	2004-03-11 03:58:44.000000000 +0100
   105 +++ glibc-2_9/sysdeps/unix/sysv/linux/alpha/lxstat.c	2009-02-02 22:01:30.000000000 +0100
   106 @@ -35,27 +35,39 @@
   107  __lxstat (int vers, const char *name, struct stat *buf)
   108  {
   109    INTERNAL_SYSCALL_DECL (err);
   110 -  int result, errno_out;
   111 +  int result;
   112    struct kernel_stat kbuf;
   113  
   114 +#if __ASSUME_STAT64_SYSCALL > 0
   115 +  if (vers == _STAT_VER_KERNEL64)
   116 +    {
   117 +      result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf);
   118 +      if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
   119 +	return result;
   120 +      __set_errno (INTERNAL_SYSCALL_ERRNO (result, err));
   121 +      return -1;
   122 +    }
   123 +#elif defined __NR_lstat64
   124    if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64)
   125      {
   126 +      int errno_out;
   127        result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf);
   128        if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
   129  	return result;
   130        errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
   131        if (errno_out != ENOSYS)
   132 -	goto fail;
   133 +	{
   134 +	  __set_errno (errno_out);
   135 +	  return -1;
   136 +	}
   137        __libc_missing_axp_stat64 = 1;
   138      }
   139 +#endif
   140  
   141    result = INTERNAL_SYSCALL (lstat, err, 2, name, &kbuf);
   142    if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
   143      return __xstat_conv (vers, &kbuf, buf);
   144 -  errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
   145 -  
   146 - fail:
   147 -  __set_errno (errno_out);
   148 +  __set_errno (INTERNAL_SYSCALL_ERRNO (result, err));
   149    return -1;
   150  }
   151  hidden_def (__lxstat)
   152 diff -durN glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/xstat.c glibc-2_9/sysdeps/unix/sysv/linux/alpha/xstat.c
   153 --- glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/xstat.c	2004-03-11 03:58:44.000000000 +0100
   154 +++ glibc-2_9/sysdeps/unix/sysv/linux/alpha/xstat.c	2009-02-02 22:01:30.000000000 +0100
   155 @@ -35,27 +35,39 @@
   156  __xstat (int vers, const char *name, struct stat *buf)
   157  {
   158    INTERNAL_SYSCALL_DECL (err);
   159 -  int result, errno_out;
   160 +  int result;
   161    struct kernel_stat kbuf;
   162  
   163 +#if __ASSUME_STAT64_SYSCALL > 0
   164 +  if (vers == _STAT_VER_KERNEL64)
   165 +    {
   166 +      result = INTERNAL_SYSCALL (stat64, err, 2, name, buf);
   167 +      if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
   168 +	return result;
   169 +      __set_errno (INTERNAL_SYSCALL_ERRNO (result, err));
   170 +      return -1;
   171 +    }
   172 +#elif defined __NR_stat64
   173    if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64)
   174      {
   175 +      int errno_out;
   176        result = INTERNAL_SYSCALL (stat64, err, 2, name, buf);
   177        if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
   178  	return result;
   179        errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
   180        if (errno_out != ENOSYS)
   181 -	goto fail;
   182 +	{
   183 +	  __set_errno (errno_out);
   184 +	  return -1;
   185 +	}
   186        __libc_missing_axp_stat64 = 1;
   187      }
   188 +#endif
   189  
   190    result = INTERNAL_SYSCALL (stat, err, 2, name, &kbuf);
   191    if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1))
   192      return __xstat_conv (vers, &kbuf, buf);
   193 -  errno_out = INTERNAL_SYSCALL_ERRNO (result, err);
   194 -  
   195 - fail:
   196 -  __set_errno (errno_out);
   197 +  __set_errno (INTERNAL_SYSCALL_ERRNO (result, err));
   198    return -1;
   199  }
   200  hidden_def (__xstat)
   201 diff -durN glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/xstatconv.c glibc-2_9/sysdeps/unix/sysv/linux/alpha/xstatconv.c
   202 --- glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/xstatconv.c	2004-03-11 03:58:44.000000000 +0100
   203 +++ glibc-2_9/sysdeps/unix/sysv/linux/alpha/xstatconv.c	2009-02-02 22:01:30.000000000 +0100
   204 @@ -22,9 +22,14 @@
   205  #include <sys/stat.h>
   206  #include <kernel_stat.h>
   207  #include <xstatconv.h>
   208 +#include <sys/syscall.h>
   209  
   210  
   211 +#ifdef __NR_stat64
   212 +# if __ASSUME_STAT64_SYSCALL == 0
   213  int __libc_missing_axp_stat64;
   214 +# endif
   215 +#endif
   216  
   217  int
   218  __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
   219 diff -durN glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/xstatconv.h glibc-2_9/sysdeps/unix/sysv/linux/alpha/xstatconv.h
   220 --- glibc-2_9.orig/sysdeps/unix/sysv/linux/alpha/xstatconv.h	2006-01-08 09:21:16.000000000 +0100
   221 +++ glibc-2_9/sysdeps/unix/sysv/linux/alpha/xstatconv.h	2009-02-02 22:01:30.000000000 +0100
   222 @@ -18,7 +18,12 @@
   223     02111-1307 USA.  */
   224  
   225  #include <kernel-features.h>
   226 +#include <sys/syscall.h>
   227  
   228 +#ifdef __NR_stat64
   229 +# if __ASSUME_STAT64_SYSCALL == 0
   230  extern int __libc_missing_axp_stat64 attribute_hidden;
   231 +# endif
   232 +#endif
   233  extern int __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf)
   234    attribute_hidden;
   235 diff -durN glibc-2_9.orig/sysdeps/unix/sysv/linux/kernel-features.h glibc-2_9/sysdeps/unix/sysv/linux/kernel-features.h
   236 --- glibc-2_9.orig/sysdeps/unix/sysv/linux/kernel-features.h	2008-08-01 23:51:04.000000000 +0200
   237 +++ glibc-2_9/sysdeps/unix/sysv/linux/kernel-features.h	2009-02-02 22:01:30.000000000 +0100
   238 @@ -395,6 +395,11 @@
   239  # define __ASSUME_GETDENTS32_D_TYPE	1
   240  #endif
   241  
   242 +/* Starting with version 2.6.4, alpha stat64 syscalls are available.  */
   243 +#if __LINUX_KERNEL_VERSION >= 0x020604 && defined __alpha__
   244 +# define __ASSUME_STAT64_SYSCALL	1
   245 +#endif
   246 +
   247  /* Starting with version 2.5.3, the initial location returned by `brk'
   248     after exec is always rounded up to the next page.  */
   249  #if __LINUX_KERNEL_VERSION >= 132355