added missing dependencies to fix failing unistr/ tests
[gnulib.git] / lib / euidaccess.c
index 9db7bb4..29efc2b 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
-   Free Software Foundation, Inc.
+   Copyright (C) 1990-1991, 1995, 1998, 2000, 2003-2006, 2008-2010 Free
+   Software Foundation, Inc.
 
    This file is part of the GNU C Library.
 
@@ -23,9 +23,9 @@
 
 #ifndef _LIBC
 # include <config.h>
-# include "euidaccess.h"
 #endif
 
+#include <fcntl.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
 int
 euidaccess (const char *file, int mode)
 {
-#if defined EFF_ONLY_OK
+#if HAVE_FACCESSAT                      /* glibc */
+  return faccessat (AT_FDCWD, file, mode, AT_EACCESS);
+#elif defined EFF_ONLY_OK               /* IRIX, OSF/1, Interix */
   return access (file, mode | EFF_ONLY_OK);
-#elif defined ACC_SELF
+#elif defined ACC_SELF                  /* AIX */
   return accessx (file, mode, ACC_SELF);
-#elif HAVE_EACCESS
+#elif HAVE_EACCESS                      /* FreeBSD */
   return eaccess (file, mode);
-#else
+#else       /* MacOS X, NetBSD, OpenBSD, HP-UX, Solaris, Cygwin, mingw, BeOS */
 
   uid_t uid = getuid ();
   gid_t gid = getgid ();
@@ -109,18 +111,18 @@ euidaccess (const char *file, int mode)
       int saved_errno;
 
       if (uid != euid)
-       setreuid (euid, uid);
+        setreuid (euid, uid);
       if (gid != egid)
-       setregid (egid, gid);
+        setregid (egid, gid);
 
       result = access (file, mode);
       saved_errno = errno;
 
       /* Restore them.  */
       if (uid != euid)
-       setreuid (uid, euid);
+        setreuid (uid, euid);
       if (gid != egid)
-       setregid (gid, egid);
+        setregid (gid, egid);
 
       errno = saved_errno;
       return result;
@@ -143,7 +145,7 @@ euidaccess (const char *file, int mode)
   /* The super-user can read and write any file, and execute any file
      that anyone can execute.  */
   if (euid == 0 && ((mode & X_OK) == 0
-                   || (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))))
+                    || (stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))))
     return 0;
 
   /* Convert the mode to traditional form, clearing any bogus bits.  */
@@ -151,11 +153,11 @@ euidaccess (const char *file, int mode)
     mode &= 7;
   else
     mode = ((mode & R_OK ? 4 : 0)
-           + (mode & W_OK ? 2 : 0)
-           + (mode & X_OK ? 1 : 0));
+            + (mode & W_OK ? 2 : 0)
+            + (mode & X_OK ? 1 : 0));
 
   if (mode == 0)
-    return 0;                  /* The file exists.  */
+    return 0;                   /* The file exists.  */
 
   /* Convert the file's permission bits to traditional form.  */
   if (S_IRUSR == (4 << 6) && S_IWUSR == (2 << 6) && S_IXUSR == (1 << 6)
@@ -164,14 +166,14 @@ euidaccess (const char *file, int mode)
     granted = stats.st_mode;
   else
     granted = ((stats.st_mode & S_IRUSR ? 4 << 6 : 0)
-              + (stats.st_mode & S_IWUSR ? 2 << 6 : 0)
-              + (stats.st_mode & S_IXUSR ? 1 << 6 : 0)
-              + (stats.st_mode & S_IRGRP ? 4 << 3 : 0)
-              + (stats.st_mode & S_IWGRP ? 2 << 3 : 0)
-              + (stats.st_mode & S_IXGRP ? 1 << 3 : 0)
-              + (stats.st_mode & S_IROTH ? 4 << 0 : 0)
-              + (stats.st_mode & S_IWOTH ? 2 << 0 : 0)
-              + (stats.st_mode & S_IXOTH ? 1 << 0 : 0));
+               + (stats.st_mode & S_IWUSR ? 2 << 6 : 0)
+               + (stats.st_mode & S_IXUSR ? 1 << 6 : 0)
+               + (stats.st_mode & S_IRGRP ? 4 << 3 : 0)
+               + (stats.st_mode & S_IWGRP ? 2 << 3 : 0)
+               + (stats.st_mode & S_IXGRP ? 1 << 3 : 0)
+               + (stats.st_mode & S_IROTH ? 4 << 0 : 0)
+               + (stats.st_mode & S_IWOTH ? 2 << 0 : 0)
+               + (stats.st_mode & S_IXOTH ? 1 << 0 : 0));
 
   if (euid == stats.st_uid)
     granted >>= 6;