euidaccess: prefer POSIX over non-standard implementation
authorEric Blake <ebb9@byu.net>
Thu, 3 Sep 2009 19:43:12 +0000 (13:43 -0600)
committerEric Blake <ebb9@byu.net>
Fri, 4 Sep 2009 03:20:48 +0000 (21:20 -0600)
* 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>
ChangeLog
lib/euidaccess.c
m4/euidaccess.m4

index 288440e..4358759 100644 (file)
--- 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.
index 17eb724..5ba59b0 100644 (file)
@@ -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);
index 5882f58..f1a175c 100644 (file)
@@ -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 @@ AC_DEFUN([gl_FUNC_EUIDACCESS],
 
 # 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])