diff options
30 files changed, 147 insertions, 1580 deletions
@@ -1,3 +1,100 @@ +2014-06-20 Joseph Myers <joseph@codesourcery.com> + + * include/fcntl.h (__atfct_seterrno): Remove prototype. + (__atfct_seterrno_2): Likewise. + * sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c: Do not include + <kernel-features.h>. + (__ASSUME_ATFCTS): Do not undefine and redefine. + * sysdeps/unix/sysv/linux/alpha/fxstatat.c [__ASSUME_ATFCTS] + (__have_atfcts): Remove conditional definition. + (__fxstatat([__NR_fstatat64]: Make code unconditional. + (__fxstatat) [!__ASSUME_ATFCTS]: Remove conditional code and code + unreachable if [__ASSUME_ATFCTS]. + * sysdeps/unix/sysv/linux/dl-fxstatat64.c (__ASSUME_ATFCTS): Do + not undefine and redefine. + * sysdeps/unix/sysv/linux/faccessat.c: Do not include + <kernel-features.h>. + (faccessat) [__NR_faccessat]: Make code unconditional. + (faccessat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/fchmodat.c: Do not include + <kernel-features.h>. + (fchmodat) [__NR_fchmodat]: Make code unconditional. + (fchmodat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/fchownat.c: Do not include + <kernel-features.h>. + (fchownat) [__NR_fchownat]: Make code unconditional. + (fchownat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/futimesat.c: Do not include + <kernel-features.h>. + (futimesat) [__NR_futimesat]: Make code unconditional. + (futimesat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/fxstatat.c: Do not include + <kernel-features.h>. + (__fxstatat) [__NR_newfstatat]: Make code unconditional. + (__fxstatat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/fxstatat64.c: Do not include + <kernel-features.h>. + (__fxstatat64) [__NR_fstatat64]: Make code unconditional. + (__fxstatat64) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/i386/fchownat.c: Remove file. + * sysdeps/unix/sysv/linux/i386/fxstatat.c: Do not include + <kernel-features.h>. + (__fxstatat) [__NR_fstatat64]: Make code unconditional. + (__fxstatat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/linkat.c: Do not include + <kernel-features.h>. + (linkat) [__NR_linkat]: Make code unconditional. + (linkat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/m68k/fchownat.c: Remove file. + * sysdeps/unix/sysv/linux/mips/mips64/fxstatat64.c: Do not include + <kernel-features.h>. + (__fxstatat64) [__NR_newfstatat]: Make code unconditional. + (__fxstatat64) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/mkdirat.c: Do not include + <kernel-features.h>. + (mkdirat) [__NR_mkdirat]: Make code unconditional. + (mkdirat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/openat.c: Do not include + <kernel-features.h>. + [!__ASSUME_ATFCTS] (__atfct_seterrno): Remove function. + [!__ASSUME_ATFCTS] (__have_atfcts): Remove variable. + (OPENAT_NOT_CANCEL) [__NR_openat]: Make code unconditional. + (OPENAT_NOT_CANCEL) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/powerpc/fchownat.c: Remove file. + * sysdeps/unix/sysv/linux/readlinkat.c: Do not include + <kernel-features.h>. + (readlinkat) [__NR_readlinkat]: Make code unconditional. + (readlinkat) [!__ASSUME_ATFCTS]: Remove conditional code. Return + result of INLINE_SYSCALL directly, not via int variable. + * sysdeps/unix/sysv/linux/renameat.c: Do not include + <kernel-features.h>. + [!__ASSUME_ATFCTS] (__atfct_seterrno_2): Remove function. + (renameat) [__NR_renameat]: Make code unconditional. + (renameat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/s390/s390-32/fchownat.c: Remove file. + * sysdeps/unix/sysv/linux/sh/fchownat.c: Remove file. + * sysdeps/unix/sysv/linux/sparc/sparc32/fchownat.c: Remove file. + * sysdeps/unix/sysv/linux/sparc/sparc64/dl-fxstatat64.c + (__ASSUME_ATFCTS): Do not undefine and redefine. + * sysdeps/unix/sysv/linux/symlinkat.c: Do not include + <kernel-features.h>. + (symlinkat) [__NR_symlinkat]: Make code unconditional. + (symlinkat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/unlinkat.c: Do not include + <kernel-features.h>. + (unlinkat) [__NR_unlinkat]: Make code unconditional. + (unlinkat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/wordsize-64/dl-fxstatat64.c + (__ASSUME_ATFCTS): Do not undefine and redefine. + * sysdeps/unix/sysv/linux/wordsize-64/fxstatat.c: Do not include + <kernel-features.h>. + (__fxstatat) [__NR_newfstatat]: Make code unconditional. + (__fxstatat) [!__ASSUME_ATFCTS]: Remove conditional code. + * sysdeps/unix/sysv/linux/xmknodat.c: Do not include + <kernel-features.h>. + (__xmknodat) [__NR_mknodat]: Make code unconditional. + (__xmknodat) [!__ASSUME_ATFCTS]: Remove conditional code. + 2014-06-20 H.J. Lu <hongjiu.lu@intel.com> * sysdeps/x86_64/multiarch/rtld-strlen.S: Removed. diff --git a/include/fcntl.h b/include/fcntl.h index b645ffc000..a636f388f4 100644 --- a/include/fcntl.h +++ b/include/fcntl.h @@ -31,14 +31,6 @@ extern int __openat_2 (int __fd, const char *__path, int __oflag); extern int __openat64_2 (int __fd, const char *__path, int __oflag); -/* Helper functions for the various *at functions. For Linux. */ -extern void __atfct_seterrno (int errval, int fd, const char *buf) - attribute_hidden; -extern void __atfct_seterrno_2 (int errval, int fd1, const char *buf1, - int fd2, const char *buf2) - attribute_hidden; - - /* Flag determining whether the *at system calls are available. */ extern int __have_atfcts attribute_hidden; diff --git a/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c b/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c index 41e83bcf11..330b33f7c7 100644 --- a/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c +++ b/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c @@ -1,9 +1 @@ -/* In this implementation we do not really care whether the call fails - because of missing kernel support since we do not even call the - function in this case. */ -/* For Alpha, in <kernel-features.h> we redefine the default definition of - when __ASSUME_ATFCTS is present. The hack must wait until after that. */ -#include <kernel-features.h> -#undef __ASSUME_ATFCTS -#define __ASSUME_ATFCTS 1 #include "fxstatat.c" diff --git a/sysdeps/unix/sysv/linux/alpha/fxstatat.c b/sysdeps/unix/sysv/linux/alpha/fxstatat.c index a7312068e5..26fe428859 100644 --- a/sysdeps/unix/sysv/linux/alpha/fxstatat.c +++ b/sysdeps/unix/sysv/linux/alpha/fxstatat.c @@ -29,10 +29,6 @@ #undef __fxstatat64 -#ifdef __ASSUME_ATFCTS -# define __have_atfcts 1 -#endif - /* Get information about the file NAME in BUF. */ int __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) @@ -45,67 +41,11 @@ __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) cannot actually check this, lest the compiler not optimize the rest of the function away. */ -#ifdef __NR_fstatat64 - if (__have_atfcts >= 0) - { - result = INTERNAL_SYSCALL (fstatat64, err, 4, fd, file, st, flag); - if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) - return result; - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); -#ifndef __ASSUME_ATFCTS - if (errno_out == ENOSYS) - __have_atfcts = -1; - else -#endif - { - __set_errno (errno_out); - return -1; - } - } -#endif /* __NR_fstatat64 */ - - if (flag & ~AT_SYMLINK_NOFOLLOW) - { - __set_errno (EINVAL); - return -1; - } - - char *buf = NULL; - - if (fd != AT_FDCWD && file[0] != '/') - { - size_t filelen = strlen (file); - if (__builtin_expect (filelen == 0, 0)) - { - __set_errno (ENOENT); - return -1; - } - - static const char procfd[] = "/proc/self/fd/%d/%s"; - /* Buffer for the path name we are going to use. It consists of - - the string /proc/self/fd/ - - the file descriptor number - - the file name provided. - The final NUL is included in the sizeof. A bit of overhead - due to the format elements compensates for possible negative - numbers. */ - size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen; - buf = alloca (buflen); - - __snprintf (buf, buflen, procfd, fd, file); - file = buf; - } - - if (flag & AT_SYMLINK_NOFOLLOW) - result = INTERNAL_SYSCALL (lstat64, err, 2, file, st); - else - result = INTERNAL_SYSCALL (stat64, err, 2, file, st); + result = INTERNAL_SYSCALL (fstatat64, err, 4, fd, file, st, flag); if (__builtin_expect (!INTERNAL_SYSCALL_ERROR_P (result, err), 1)) return result; - errno_out = INTERNAL_SYSCALL_ERRNO (result, err); - __atfct_seterrno (errno_out, fd, buf); - + __set_errno (errno_out); return -1; } libc_hidden_def (__fxstatat) diff --git a/sysdeps/unix/sysv/linux/dl-fxstatat64.c b/sysdeps/unix/sysv/linux/dl-fxstatat64.c index 1f8c2e6415..d229d0ea0f 100644 --- a/sysdeps/unix/sysv/linux/dl-fxstatat64.c +++ b/sysdeps/unix/sysv/linux/dl-fxstatat64.c @@ -1,6 +1 @@ -/* In this implementation we do not really care whether the call fails - because of missing kernel support since we do not even call the - function in this case. */ -#undef __ASSUME_ATFCTS -#define __ASSUME_ATFCTS 1 #include <fxstatat64.c> diff --git a/sysdeps/unix/sysv/linux/faccessat.c b/sysdeps/unix/sysv/linux/faccessat.c index c00f431a45..4a6048ec79 100644 --- a/sysdeps/unix/sysv/linux/faccessat.c +++ b/sysdeps/unix/sysv/linux/faccessat.c @@ -24,7 +24,6 @@ #include <unistd.h> #include <sys/types.h> #include <alloca.h> -#include <kernel-features.h> #include <sysdep.h> @@ -41,76 +40,8 @@ faccessat (fd, file, mode, flag) return -1; } -#ifdef __NR_faccessat - if ((flag == 0 || ((flag & ~AT_EACCESS) == 0 && ! __libc_enable_secure)) -# ifndef __ASSUME_ATFCTS - && __have_atfcts >= 0 -# endif - ) - { - int result = INLINE_SYSCALL (faccessat, 3, fd, file, mode); -# ifndef __ASSUME_ATFCTS - if (result == -1 && errno == ENOSYS) - __have_atfcts = -1; - else -# endif - return result; - } -#endif - -#ifndef __ASSUME_ATFCTS - if ((!(flag & AT_EACCESS) || ! __libc_enable_secure) -# ifndef __NR_laccess /* Linux so far has no laccess syscall. */ - && !(flag & AT_SYMLINK_NOFOLLOW) -# endif - ) - { - /* If we are not set-uid or set-gid, access does the same. */ - char *buf = NULL; - - if (fd != AT_FDCWD && file[0] != '/') - { - size_t filelen = strlen (file); - if (__glibc_unlikely (filelen == 0)) - { - __set_errno (ENOENT); - return -1; - } - - static const char procfd[] = "/proc/self/fd/%d/%s"; - /* Buffer for the path name we are going to use. It consists of - - the string /proc/self/fd/ - - the file descriptor number - - the file name provided. - The final NUL is included in the sizeof. A bit of overhead - due to the format elements compensates for possible negative - numbers. */ - size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen; - buf = alloca (buflen); - - __snprintf (buf, buflen, procfd, fd, file); - file = buf; - } - - int result; - INTERNAL_SYSCALL_DECL (err); - -# ifdef __NR_laccess - if (flag & AT_SYMLINK_NOFOLLOW) - result = INTERNAL_SYSCALL (laccess, err, 2, file, mode); - else -# endif - result = INTERNAL_SYSCALL (access, err, 2, file, mode); - - if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) - { - __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf); - result = -1; - } - - return result; - } -#endif + if ((flag == 0 || ((flag & ~AT_EACCESS) == 0 && ! __libc_enable_secure))) + return INLINE_SYSCALL (faccessat, 3, fd, file, mode); struct stat64 stats; if (__fxstatat64 (_STAT_VER, fd, file, &stats, flag & AT_SYMLINK_NOFOLLOW)) diff --git a/sysdeps/unix/sysv/linux/fchmodat.c b/sysdeps/unix/sysv/linux/fchmodat.c index 4d3e43e371..446789958f 100644 --- a/sysdeps/unix/sysv/linux/fchmodat.c +++ b/sysdeps/unix/sysv/linux/fchmodat.c @@ -24,7 +24,6 @@ #include <unistd.h> #include <sys/types.h> #include <alloca.h> -#include <kernel-features.h> #include <sysdep.h> int @@ -47,65 +46,5 @@ fchmodat (fd, file, mode, flag) } #endif - int result; - -#ifdef __NR_fchmodat -# ifndef __ASSUME_ATFCTS - if (__have_atfcts >= 0) -# endif - { - result = INLINE_SYSCALL (fchmodat, 3, fd, file, mode); -# ifndef __ASSUME_ATFCTS - if (result == -1 && errno == ENOSYS) - __have_atfcts = -1; - else -# endif - return result; - } -#endif - -#ifndef __ASSUME_ATFCTS - char *buf = NULL; - - if (fd != AT_FDCWD && file[0] != '/') - { - size_t filelen = strlen (file); - if (__glibc_unlikely (filelen == 0)) - { - __set_errno (ENOENT); - return -1; - } - - static const char procfd[] = "/proc/self/fd/%d/%s"; - /* Buffer for the path name we are going to use. It consists of - - the string /proc/self/fd/ - - the file descriptor number - - the file name provided. - The final NUL is included in the sizeof. A bit of overhead - due to the format elements compensates for possible negative - numbers. */ - size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen; - buf = alloca (buflen); - - __snprintf (buf, buflen, procfd, fd, file); - file = buf; - } - - INTERNAL_SYSCALL_DECL (err); - -# ifdef __NR_lchmod - if (flag & AT_SYMLINK_NOFOLLOW) - result = INTERNAL_SYSCALL (lchmod, err, 2, file, mode); - else -# endif - result = INTERNAL_SYSCALL (chmod, err, 2, file, mode); - - if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) - { - __atfct_seterrno (INTERNAL_SYSCALL_ERRNO (result, err), fd, buf); - result = -1; - } - - return result; -#endif + return INLINE_SYSCALL (fchmodat, 3, fd, file, mode); } diff --git a/sysdeps/unix/sysv/linux/fchownat.c b/sysdeps/unix/sysv/linux/fchownat.c index 196b8005c3..fae1256af7 100644 --- a/sysdeps/unix/sysv/linux/fchownat.c +++ b/sysdeps/unix/sysv/linux/fchownat.c @@ -24,9 +24,10 @@ #include <sys/types.h> #include <alloca.h> #include <sysdep.h> -#include <kernel-features.h> +/* Consider moving to syscalls.list. */ + /* Change the owner and group of FILE. */ int fchownat (fd, file, owner, group, flag) @@ -36,69 +37,5 @@ fchownat (fd, file, owner, group, flag) gid_t group; int flag; { - int result; - -#ifdef __NR_fchownat -# ifndef __ASSUME_ATFCTS - if (__have_atfcts >= 0) -# endif - { - result = INLINE_SYSCALL (fchownat, 5, fd, file, owner, group, flag); -# ifndef __ASSUME_ATFCTS - if (result == -1 && errno == ENOSYS) - __have_atfcts = -1; - else -# endif - return result; - } -#endif - -#ifndef __ASSUME_ATFCTS - if (flag & ~AT_SYMLINK_NOFOLLOW) - { - __set_errno (EINVAL); - return -1; - } - - char *buf = NULL; - - if (fd != AT_FDCWD && file[0] != '/') - { - size_t filelen = strlen (file); - if (__glibc_unlikely (filelen == 0)) - { - __set_errno (ENOENT); - return -1; - } - - static const char procfd[] = "/proc/self/fd/%d/%s"; - /* Buffer for the path name we are going to use. It consists of - - the string /proc/self/fd/ - - the file descriptor number - - the file name provided. - The final NUL is included in the sizeof. A bit of overhead - due to the format elements compensates for possible negative - numbers. */ - size_t buflen = sizeof (procfd) + sizeof (int) * 3 + filelen; - buf = alloca (buflen); - - __snprintf (buf, buflen, procfd, fd, file); - file = buf; - } - - INTERNAL_SYSCALL_DECL (err); - - if (flag & AT_SYMLINK_NOFOLLOW) - result = INTERNAL_SYSCALL (lchown, err, 3, file, owner, group); - else - result = INTERNAL_SYSCALL (chown, err, 3, file, owner, group); - - if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) - { - __atfct_seterrno |
