yann@1625: http://sources.redhat.com/bugzilla/show_bug.cgi?id=1026 yann@1625: http://sourceware.org/ml/libc-alpha/2005-02/msg00122.html yann@1625: yann@1625: 2005-02-26 GOTO Masanori yann@1625: yann@1625: * sysdeps/unix/sysv/linux/kernel-features.h: Define yann@1625: __ASSUME_STAT64_SYSCALL. yann@1625: * sysdeps/unix/sysv/linux/alpha/fxstat.c: Check yann@1625: __ASSUME_STAT64_SYSCALL. yann@1625: * sysdeps/unix/sysv/linux/alpha/fxstatat.c: Likewise. yann@1625: * sysdeps/unix/sysv/linux/alpha/lxstat.c: Likewise. yann@1625: * sysdeps/unix/sysv/linux/alpha/xstat.c: Likewise. yann@1625: * sysdeps/unix/sysv/linux/alpha/xstatconv.c: Don't define yann@1625: __libc_missing_axp_stat64 when it's not needed. yann@1625: * sysdeps/unix/sysv/linux/alpha/xstatconv.h: Likewise. yann@1625: yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstat.c glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstat.c yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstat.c 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstat.c 2009-11-13 00:50:45.000000000 +0100 yann@1625: @@ -35,27 +35,39 @@ yann@1625: __fxstat (int vers, int fd, struct stat *buf) yann@1625: { yann@1625: INTERNAL_SYSCALL_DECL (err); yann@1625: - int result, errno_out; yann@1625: + int result; yann@1625: struct kernel_stat kbuf; yann@1625: yann@1625: +#if __ASSUME_STAT64_SYSCALL > 0 yann@1625: + if (vers == _STAT_VER_KERNEL64) yann@1625: + { yann@1625: + result = INTERNAL_SYSCALL (fstat64, err, 2, fd, buf); yann@1625: + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: + return result; yann@1625: + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); yann@1625: + return -1; yann@1625: + } yann@1625: +#elif defined __NR_fstat64 yann@1625: if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) yann@1625: { yann@1625: + int errno_out; yann@1625: result = INTERNAL_SYSCALL (fstat64, err, 2, fd, buf); yann@1625: if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: return result; yann@1625: errno_out = INTERNAL_SYSCALL_ERRNO (result, err); yann@1625: if (errno_out != ENOSYS) yann@1625: - goto fail; yann@1625: + { yann@1625: + __set_errno (errno_out); yann@1625: + return -1; yann@1625: + } yann@1625: __libc_missing_axp_stat64 = 1; yann@1625: } yann@1625: +#endif yann@1625: yann@1625: result = INTERNAL_SYSCALL (fstat, err, 2, fd, &kbuf); yann@1625: if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: return __xstat_conv (vers, &kbuf, buf); yann@1625: - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); yann@1625: - yann@1625: - fail: yann@1625: - __set_errno (errno_out); yann@1625: + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); yann@1625: return -1; yann@1625: } yann@1625: hidden_def (__fxstat) yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstatat.c glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstatat.c yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstatat.c 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/fxstatat.c 2009-11-13 00:50:45.000000000 +0100 yann@1625: @@ -65,6 +65,20 @@ yann@1625: int result, errno_out; yann@1625: struct kernel_stat kst; yann@1625: yann@1625: +#if __ASSUME_STAT64_SYSCALL > 0 yann@1625: + if (vers == _STAT_VER_KERNEL64) yann@1625: + { yann@1625: + if (flag & AT_SYMLINK_NOFOLLOW) yann@1625: + result = INTERNAL_SYSCALL (lstat64, err, 2, file, st); yann@1625: + else yann@1625: + result = INTERNAL_SYSCALL (stat64, err, 2, file, st); yann@1625: + yann@1625: + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: + return result; yann@1625: + errno_out = INTERNAL_SYSCALL_ERRNO (result, err); yann@1625: + goto fail; yann@1625: + } yann@1625: +#elif defined __NR_stat64 yann@1625: if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) yann@1625: { yann@1625: if (flag & AT_SYMLINK_NOFOLLOW) yann@1625: @@ -79,6 +93,7 @@ yann@1625: goto fail; yann@1625: __libc_missing_axp_stat64 = 1; yann@1625: } yann@1625: +#endif yann@1625: yann@1625: if (flag & AT_SYMLINK_NOFOLLOW) yann@1625: result = INTERNAL_SYSCALL (lstat, err, 2, file, &kst); yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/lxstat.c glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/lxstat.c yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/lxstat.c 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/lxstat.c 2009-11-13 00:50:45.000000000 +0100 yann@1625: @@ -35,27 +35,39 @@ yann@1625: __lxstat (int vers, const char *name, struct stat *buf) yann@1625: { yann@1625: INTERNAL_SYSCALL_DECL (err); yann@1625: - int result, errno_out; yann@1625: + int result; yann@1625: struct kernel_stat kbuf; yann@1625: yann@1625: +#if __ASSUME_STAT64_SYSCALL > 0 yann@1625: + if (vers == _STAT_VER_KERNEL64) yann@1625: + { yann@1625: + result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf); yann@1625: + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: + return result; yann@1625: + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); yann@1625: + return -1; yann@1625: + } yann@1625: +#elif defined __NR_lstat64 yann@1625: if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) yann@1625: { yann@1625: + int errno_out; yann@1625: result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf); yann@1625: if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: return result; yann@1625: errno_out = INTERNAL_SYSCALL_ERRNO (result, err); yann@1625: if (errno_out != ENOSYS) yann@1625: - goto fail; yann@1625: + { yann@1625: + __set_errno (errno_out); yann@1625: + return -1; yann@1625: + } yann@1625: __libc_missing_axp_stat64 = 1; yann@1625: } yann@1625: +#endif yann@1625: yann@1625: result = INTERNAL_SYSCALL (lstat, err, 2, name, &kbuf); yann@1625: if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: return __xstat_conv (vers, &kbuf, buf); yann@1625: - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); yann@1625: - yann@1625: - fail: yann@1625: - __set_errno (errno_out); yann@1625: + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); yann@1625: return -1; yann@1625: } yann@1625: hidden_def (__lxstat) yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstat.c glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstat.c yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstat.c 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstat.c 2009-11-13 00:50:45.000000000 +0100 yann@1625: @@ -35,27 +35,39 @@ yann@1625: __xstat (int vers, const char *name, struct stat *buf) yann@1625: { yann@1625: INTERNAL_SYSCALL_DECL (err); yann@1625: - int result, errno_out; yann@1625: + int result; yann@1625: struct kernel_stat kbuf; yann@1625: yann@1625: +#if __ASSUME_STAT64_SYSCALL > 0 yann@1625: + if (vers == _STAT_VER_KERNEL64) yann@1625: + { yann@1625: + result = INTERNAL_SYSCALL (stat64, err, 2, name, buf); yann@1625: + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: + return result; yann@1625: + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); yann@1625: + return -1; yann@1625: + } yann@1625: +#elif defined __NR_stat64 yann@1625: if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) yann@1625: { yann@1625: + int errno_out; yann@1625: result = INTERNAL_SYSCALL (stat64, err, 2, name, buf); yann@1625: if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: return result; yann@1625: errno_out = INTERNAL_SYSCALL_ERRNO (result, err); yann@1625: if (errno_out != ENOSYS) yann@1625: - goto fail; yann@1625: + { yann@1625: + __set_errno (errno_out); yann@1625: + return -1; yann@1625: + } yann@1625: __libc_missing_axp_stat64 = 1; yann@1625: } yann@1625: +#endif yann@1625: yann@1625: result = INTERNAL_SYSCALL (stat, err, 2, name, &kbuf); yann@1625: if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) yann@1625: return __xstat_conv (vers, &kbuf, buf); yann@1625: - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); yann@1625: - yann@1625: - fail: yann@1625: - __set_errno (errno_out); yann@1625: + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); yann@1625: return -1; yann@1625: } yann@1625: hidden_def (__xstat) yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.c glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.c yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.c 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.c 2009-11-13 00:50:45.000000000 +0100 yann@1625: @@ -22,9 +22,14 @@ yann@1625: #include yann@1625: #include yann@1625: #include yann@1625: +#include yann@1625: yann@1625: yann@1625: +#ifdef __NR_stat64 yann@1625: +# if __ASSUME_STAT64_SYSCALL == 0 yann@1625: int __libc_missing_axp_stat64; yann@1625: +# endif yann@1625: +#endif yann@1625: yann@1625: int yann@1625: __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) yann@1625: diff -durN glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.h glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.h yann@1625: --- glibc-2.10.1.orig/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.h 2009-05-16 10:36:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/glibc-ports-2.10.1/sysdeps/unix/sysv/linux/alpha/xstatconv.h 2009-11-13 00:50:45.000000000 +0100 yann@1625: @@ -18,7 +18,12 @@ yann@1625: 02111-1307 USA. */ yann@1625: yann@1625: #include yann@1625: +#include yann@1625: yann@1625: +#ifdef __NR_stat64 yann@1625: +# if __ASSUME_STAT64_SYSCALL == 0 yann@1625: extern int __libc_missing_axp_stat64 attribute_hidden; yann@1625: +# endif yann@1625: +#endif yann@1625: extern int __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) yann@1625: attribute_hidden; yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/unix/sysv/linux/alpha/fxstat.c glibc-2.10.1/ports/sysdeps/unix/sysv/linux/alpha/fxstat.c yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/unix/sysv/linux/alpha/fxstatat.c glibc-2.10.1/ports/sysdeps/unix/sysv/linux/alpha/fxstatat.c yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/unix/sysv/linux/alpha/lxstat.c glibc-2.10.1/ports/sysdeps/unix/sysv/linux/alpha/lxstat.c yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/unix/sysv/linux/alpha/xstat.c glibc-2.10.1/ports/sysdeps/unix/sysv/linux/alpha/xstat.c yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/unix/sysv/linux/alpha/xstatconv.c glibc-2.10.1/ports/sysdeps/unix/sysv/linux/alpha/xstatconv.c yann@1625: diff -durN glibc-2.10.1.orig/ports/sysdeps/unix/sysv/linux/alpha/xstatconv.h glibc-2.10.1/ports/sysdeps/unix/sysv/linux/alpha/xstatconv.h yann@1625: diff -durN glibc-2.10.1.orig/sysdeps/unix/sysv/linux/kernel-features.h glibc-2.10.1/sysdeps/unix/sysv/linux/kernel-features.h yann@1625: --- glibc-2.10.1.orig/sysdeps/unix/sysv/linux/kernel-features.h 2009-05-09 08:54:20.000000000 +0200 yann@1625: +++ glibc-2.10.1/sysdeps/unix/sysv/linux/kernel-features.h 2009-11-13 00:50:45.000000000 +0100 yann@1625: @@ -395,6 +395,11 @@ yann@1625: # define __ASSUME_GETDENTS32_D_TYPE 1 yann@1625: #endif yann@1625: yann@1625: +/* Starting with version 2.6.4, alpha stat64 syscalls are available. */ yann@1625: +#if __LINUX_KERNEL_VERSION >= 0x020604 && defined __alpha__ yann@1625: +# define __ASSUME_STAT64_SYSCALL 1 yann@1625: +#endif yann@1625: + yann@1625: /* Starting with version 2.5.3, the initial location returned by `brk' yann@1625: after exec is always rounded up to the next page. */ yann@1625: #if __LINUX_KERNEL_VERSION >= 132355