From: GOTO Masanori Date: Tue, 4 May 2010 03:25:04 +0000 (-0400) Subject: alpha: fix *xstat.c build failure for Linux headers < 2.6.4 X-Git-Tag: glibc-2.16-ports-merge^2~483 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6a84c77c7162a3bef67c5faf7e27457e2fb5fff7;p=platform%2Fupstream%2Fglibc.git alpha: fix *xstat.c build failure for Linux headers < 2.6.4 Fixes glibc bug 1026. http://sourceware.org/ml/libc-alpha/2005-02/msg00122.html Signed-off-by: Matt Turner --- diff --git a/ChangeLog.alpha b/ChangeLog.alpha index 80c57d3..80236fe 100644 --- a/ChangeLog.alpha +++ b/ChangeLog.alpha @@ -1,3 +1,16 @@ +2010-05-03 GOTO Masanori + + * sysdeps/unix/sysv/linux/alpha/kernel-features.h: Define + __ASSUME_STAT64_SYSCALL. + * sysdeps/unix/sysv/linux/alpha/fxstat.c: Check + __ASSUME_STAT64_SYSCALL. + * sysdeps/unix/sysv/linux/alpha/fxstatat.c: Likewise. + * sysdeps/unix/sysv/linux/alpha/lxstat.c: Likewise. + * sysdeps/unix/sysv/linux/alpha/xstat.c: Likewise. + * sysdeps/unix/sysv/linux/alpha/xstatconv.c: Don't define + __libc_missing_axp_stat64 when it's not needed. + * sysdeps/unix/sysv/linux/alpha/xstatconv.h: Likewise. + 2010-03-30 Richard Henderson * sysdeps/unix/sysv/linux/alpha/bits/socket.h (MSG_WAITFORONE): New. diff --git a/sysdeps/unix/sysv/linux/alpha/fxstat.c b/sysdeps/unix/sysv/linux/alpha/fxstat.c index 40e08fd..1989867 100644 --- a/sysdeps/unix/sysv/linux/alpha/fxstat.c +++ b/sysdeps/unix/sysv/linux/alpha/fxstat.c @@ -35,27 +35,39 @@ int __fxstat (int vers, int fd, struct stat *buf) { INTERNAL_SYSCALL_DECL (err); - int result, errno_out; + int result; struct kernel_stat kbuf; +#if __ASSUME_STAT64_SYSCALL > 0 + if (vers == _STAT_VER_KERNEL64) + { + result = INTERNAL_SYSCALL (fstat64, err, 2, fd, buf); + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) + return result; + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); + return -1; + } +#elif defined __NR_fstat64 if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) { + int errno_out; result = INTERNAL_SYSCALL (fstat64, err, 2, fd, buf); if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) return result; errno_out = INTERNAL_SYSCALL_ERRNO (result, err); if (errno_out != ENOSYS) - goto fail; + { + __set_errno (errno_out); + return -1; + } __libc_missing_axp_stat64 = 1; } +#endif result = INTERNAL_SYSCALL (fstat, err, 2, fd, &kbuf); if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) return __xstat_conv (vers, &kbuf, buf); - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); - - fail: - __set_errno (errno_out); + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); return -1; } hidden_def (__fxstat) diff --git a/sysdeps/unix/sysv/linux/alpha/fxstatat.c b/sysdeps/unix/sysv/linux/alpha/fxstatat.c index 66cf4f7..6fa3aeb 100644 --- a/sysdeps/unix/sysv/linux/alpha/fxstatat.c +++ b/sysdeps/unix/sysv/linux/alpha/fxstatat.c @@ -71,6 +71,20 @@ __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) int result, errno_out; struct kernel_stat kst; +#if __ASSUME_STAT64_SYSCALL > 0 + if (vers == _STAT_VER_KERNEL64) + { + if (flag & AT_SYMLINK_NOFOLLOW) + result = INTERNAL_SYSCALL (lstat64, err, 2, file, st); + else + result = INTERNAL_SYSCALL (stat64, err, 2, file, st); + + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) + return result; + errno_out = INTERNAL_SYSCALL_ERRNO (result, err); + goto fail; + } +#elif defined __NR_stat64 if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) { if (flag & AT_SYMLINK_NOFOLLOW) @@ -85,6 +99,7 @@ __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) goto fail; __libc_missing_axp_stat64 = 1; } +#endif if (flag & AT_SYMLINK_NOFOLLOW) result = INTERNAL_SYSCALL (lstat, err, 2, file, &kst); diff --git a/sysdeps/unix/sysv/linux/alpha/kernel-features.h b/sysdeps/unix/sysv/linux/alpha/kernel-features.h index 0f236a2..9c640f9 100644 --- a/sysdeps/unix/sysv/linux/alpha/kernel-features.h +++ b/sysdeps/unix/sysv/linux/alpha/kernel-features.h @@ -29,6 +29,11 @@ # define __ASSUME_TGKILL 1 #endif +/* Starting with version 2.6.4, the stat64 syscalls are available. */ +#if __LINUX_KERNEL_VERSION >= 0x020604 && defined __alpha__ +# define __ASSUME_STAT64_SYSCALL 1 +#endif + #define __ASSUME_UTIMES 1 /* Starting with version 2.6.9, SSI_IEEE_RAISE_EXCEPTION exists. */ diff --git a/sysdeps/unix/sysv/linux/alpha/lxstat.c b/sysdeps/unix/sysv/linux/alpha/lxstat.c index 38fac2e..8fa5868 100644 --- a/sysdeps/unix/sysv/linux/alpha/lxstat.c +++ b/sysdeps/unix/sysv/linux/alpha/lxstat.c @@ -35,27 +35,39 @@ int __lxstat (int vers, const char *name, struct stat *buf) { INTERNAL_SYSCALL_DECL (err); - int result, errno_out; + int result; struct kernel_stat kbuf; +#if __ASSUME_STAT64_SYSCALL > 0 + if (vers == _STAT_VER_KERNEL64) + { + result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf); + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) + return result; + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); + return -1; + } +#elif defined __NR_lstat64 if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) { + int errno_out; result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf); if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) return result; errno_out = INTERNAL_SYSCALL_ERRNO (result, err); if (errno_out != ENOSYS) - goto fail; + { + __set_errno (errno_out); + return -1; + } __libc_missing_axp_stat64 = 1; } +#endif result = INTERNAL_SYSCALL (lstat, err, 2, name, &kbuf); if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) return __xstat_conv (vers, &kbuf, buf); - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); - - fail: - __set_errno (errno_out); + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); return -1; } hidden_def (__lxstat) diff --git a/sysdeps/unix/sysv/linux/alpha/xstat.c b/sysdeps/unix/sysv/linux/alpha/xstat.c index b7488e4..530d399 100644 --- a/sysdeps/unix/sysv/linux/alpha/xstat.c +++ b/sysdeps/unix/sysv/linux/alpha/xstat.c @@ -35,27 +35,39 @@ int __xstat (int vers, const char *name, struct stat *buf) { INTERNAL_SYSCALL_DECL (err); - int result, errno_out; + int result; struct kernel_stat kbuf; +#if __ASSUME_STAT64_SYSCALL > 0 + if (vers == _STAT_VER_KERNEL64) + { + result = INTERNAL_SYSCALL (stat64, err, 2, name, buf); + if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) + return result; + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); + return -1; + } +#elif defined __NR_stat64 if (vers == _STAT_VER_KERNEL64 && !__libc_missing_axp_stat64) { + int errno_out; result = INTERNAL_SYSCALL (stat64, err, 2, name, buf); if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) return result; errno_out = INTERNAL_SYSCALL_ERRNO (result, err); if (errno_out != ENOSYS) - goto fail; + { + __set_errno (errno_out); + return -1; + } __libc_missing_axp_stat64 = 1; } +#endif result = INTERNAL_SYSCALL (stat, err, 2, name, &kbuf); if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) return __xstat_conv (vers, &kbuf, buf); - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); - - fail: - __set_errno (errno_out); + __set_errno (INTERNAL_SYSCALL_ERRNO (result, err)); return -1; } hidden_def (__xstat) diff --git a/sysdeps/unix/sysv/linux/alpha/xstatconv.c b/sysdeps/unix/sysv/linux/alpha/xstatconv.c index a193b62..86bb374 100644 --- a/sysdeps/unix/sysv/linux/alpha/xstatconv.c +++ b/sysdeps/unix/sysv/linux/alpha/xstatconv.c @@ -22,9 +22,14 @@ #include #include #include +#include +#ifdef __NR_stat64 +# if __ASSUME_STAT64_SYSCALL == 0 int __libc_missing_axp_stat64; +# endif +#endif int __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) diff --git a/sysdeps/unix/sysv/linux/alpha/xstatconv.h b/sysdeps/unix/sysv/linux/alpha/xstatconv.h index 094d11e..21e1de8 100644 --- a/sysdeps/unix/sysv/linux/alpha/xstatconv.h +++ b/sysdeps/unix/sysv/linux/alpha/xstatconv.h @@ -18,7 +18,12 @@ 02111-1307 USA. */ #include +#include +#ifdef __NR_stat64 +# if __ASSUME_STAT64_SYSCALL == 0 extern int __libc_missing_axp_stat64 attribute_hidden; +# endif +#endif extern int __xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) attribute_hidden;