From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16472 invoked by alias); 9 Feb 2012 04:36:22 -0000 Received: (qmail 16104 invoked by uid 22791); 9 Feb 2012 04:36:20 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_FX X-Spam-Check-By: sourceware.org Received: from mail-qy0-f169.google.com (HELO mail-qy0-f169.google.com) (209.85.216.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 09 Feb 2012 04:36:08 +0000 Received: by qcsd16 with SMTP id d16so864653qcs.0 for ; Wed, 08 Feb 2012 20:36:07 -0800 (PST) Received: by 10.229.136.196 with SMTP id s4mr125099qct.71.1328761761685; Wed, 08 Feb 2012 20:29:21 -0800 (PST) Received: from anchor.twiddle.home.com ([173.160.232.49]) by mx.google.com with ESMTPS id gd3sm3337362qab.6.2012.02.08.20.29.20 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 08 Feb 2012 20:29:21 -0800 (PST) From: Richard Henderson To: libc-ports@sourceware.org Subject: [PATCH 07/10] alpha: Support __NR_fstatat64. Date: Thu, 09 Feb 2012 04:36:00 -0000 Message-Id: <1328761745-24481-8-git-send-email-rth@twiddle.net> In-Reply-To: <1328761745-24481-1-git-send-email-rth@twiddle.net> References: <1328761745-24481-1-git-send-email-rth@twiddle.net> X-IsSubscribed: yes Mailing-List: contact libc-ports-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: libc-ports-owner@sourceware.org X-SW-Source: 2012-02/txt/msg00020.txt.bz2 --- sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c | 9 ++++ sysdeps/unix/sysv/linux/alpha/fxstatat.c | 63 ++++++++++++++++-------- 2 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c diff --git a/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c b/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c new file mode 100644 index 0000000..41e83bc --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/dl-fxstatat64.c @@ -0,0 +1,9 @@ +/* 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 we redefine the default definition of + when __ASSUME_ATFCTS is present. The hack must wait until after that. */ +#include +#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 6fa3aeb..a6fd06b 100644 --- a/sysdeps/unix/sysv/linux/alpha/fxstatat.c +++ b/sysdeps/unix/sysv/linux/alpha/fxstatat.c @@ -30,11 +30,44 @@ #undef __fxstatat64 +#ifdef __ASSUME_ATFCTS +# define __have_atfcts 1 +#endif +#ifdef __ASSUME_STAT64_SYSCALL +# define __libc_missing_axp_stat64 0 +#endif /* Get information about the file NAME in BUF. */ int __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) { + INTERNAL_SYSCALL_DECL (err); + int result, errno_out; + + /* ??? The __fxstatat entry point is new enough that it must be using + vers == _STAT_VER_KERNEL64. For the benefit of dl-fxstatat64.c, we + 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); @@ -67,12 +100,8 @@ __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) file = buf; } - INTERNAL_SYSCALL_DECL (err); - int result, errno_out; - struct kernel_stat kst; - -#if __ASSUME_STAT64_SYSCALL > 0 - if (vers == _STAT_VER_KERNEL64) +#ifdef __NR_stat64 + if (!__libc_missing_axp_stat64) { if (flag & AT_SYMLINK_NOFOLLOW) result = INTERNAL_SYSCALL (lstat64, err, 2, file, st); @@ -82,24 +111,16 @@ __fxstatat (int vers, int fd, const char *file, struct stat *st, int flag) 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) - result = INTERNAL_SYSCALL (lstat64, err, 2, file, st); +# if __ASSUME_STAT64_SYSCALL == 0 + if (errno_out == ENOSYS) + __libc_missing_axp_stat64 = 1; 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); - if (errno_out != ENOSYS) +# endif goto fail; - __libc_missing_axp_stat64 = 1; } -#endif +#endif /* __NR_stat64 */ + + struct kernel_stat kst; if (flag & AT_SYMLINK_NOFOLLOW) result = INTERNAL_SYSCALL (lstat, err, 2, file, &kst); -- 1.7.7.6