changeset 11944:660d7f74a5e8

euidaccess: prefer POSIX over non-standard implementation * m4/euidaccess.m4 (gl_PREREQ_EUIDACCESS): Check for faccessat. * lib/euidaccess.c (euidaccess): Use it if available. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Thu, 03 Sep 2009 13:43:12 -0600
parents 6e808da2cce5
children 2cf208dc022b
files ChangeLog lib/euidaccess.c m4/euidaccess.m4
diffstat 3 files changed, 13 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2009-09-03  Eric Blake  <ebb9@byu.net>
 
+	euidaccess: prefer POSIX over non-standard implementation
+	* m4/euidaccess.m4 (gl_PREREQ_EUIDACCESS): Check for faccessat.
+	* lib/euidaccess.c (euidaccess): Use it if available.
+
 	openat: make template easier to use
 	* lib/at-func.c (CALL_FUNC): Allow AT_FUNC_USE_F1_COND and
 	AT_FUNC_F2 to be undefined.
--- a/lib/euidaccess.c
+++ b/lib/euidaccess.c
@@ -1,7 +1,7 @@
 /* euidaccess -- check if effective user id can access file
 
-   Copyright (C) 1990, 1991, 1995, 1998, 2000, 2003, 2004, 2005, 2006, 2008
-   Free Software Foundation, Inc.
+   Copyright (C) 1990, 1991, 1995, 1998, 2000, 2003, 2004, 2005, 2006,
+   2008, 2009 Free Software Foundation, Inc.
 
    This file is part of the GNU C Library.
 
@@ -77,7 +77,9 @@
 int
 euidaccess (const char *file, int mode)
 {
-#if defined EFF_ONLY_OK
+#if HAVE_FACCESSAT
+  return faccessat (AT_FDCWD, file, mode, AT_EACCESS);
+#elif defined EFF_ONLY_OK
   return access (file, mode | EFF_ONLY_OK);
 #elif defined ACC_SELF
   return accessx (file, mode, ACC_SELF);
--- a/m4/euidaccess.m4
+++ b/m4/euidaccess.m4
@@ -1,4 +1,4 @@
-# euidaccess.m4 serial 10
+# euidaccess.m4 serial 11
 dnl Copyright (C) 2002-2009 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -31,6 +31,9 @@
 
 # Prerequisites of lib/euidaccess.c.
 AC_DEFUN([gl_PREREQ_EUIDACCESS], [
+  dnl Prefer POSIX faccessat over non-standard euidaccess.
+  AC_CHECK_FUNCS_ONCE([faccessat])
+  dnl Try various other non-standard fallbacks.
   AC_CHECK_HEADERS_ONCE([libgen.h])
   AC_CHECK_DECLS_ONCE([setregid])
   AC_REQUIRE([AC_FUNC_GETGROUPS])