]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
Don't include group-member.h.
authorJim Meyering <jim@meyering.net>
Mon, 10 Feb 2003 09:01:48 +0000 (09:01 +0000)
committerJim Meyering <jim@meyering.net>
Mon, 10 Feb 2003 09:01:48 +0000 (09:01 +0000)
Include euidaccess.h.
(eaccess): Rewrite function to set the real uid and gid temporarily
to the effective uid and gid, then invoke 'access', and then set the
real uid and gid back.  On systems that lack setreuid or setregid,
fall back on the kludges in euidaccess.  Before, it would not work
for e.g., files with ACLs, files that were marked immutable,
or on file systems mounted read-only.

src/test.c

index e720ddd55aa87928cbfdc66f1ea19581160674b9..d52c3aef14c248ce148b8e0502ff1f724b695486 100644 (file)
@@ -39,8 +39,8 @@
 # include "filecntl.h"
 #else /* TEST_STANDALONE */
 # include "system.h"
-# include "group-member.h"
 # include "error.h"
+# include "euidaccess.h"
 # if !defined (S_IXUGO)
 #  define S_IXUGO 0111
 # endif /* S_IXUGO */
@@ -135,43 +135,43 @@ test_syntax_error (char const *format, char const *arg)
   test_exit (SHELL_BOOLEAN (FALSE));
 }
 
-/* Do the same thing access(2) does, but use the effective uid and gid,
-   and don't make the mistake of telling root that any file is executable.
-   But this loses when the containing filesystem is mounted e.g. read-only.  */
+#if HAVE_SETREUID && HAVE_SETREGID
+/* Do the same thing access(2) does, but use the effective uid and gid.  */
+
 static int
-eaccess (char *path, int mode)
+eaccess (char const *file, int mode)
 {
-  struct stat st;
-  static uid_t euid = -1;
-
-  if (stat (path, &st) < 0)
-    return (-1);
-
-  if (euid == (uid_t) -1)
-    euid = geteuid ();
+  static int have_ids;
+  static uid_t uid, euid;
+  static gid_t gid, egid;
+  int result;
 
-  if (euid == 0)
+  if (have_ids == 0)
     {
-      /* Root can read or write any file. */
-      if (mode != X_OK)
-       return (0);
-
-      /* Root can execute any file that has any one of the execute
-        bits set. */
-      if (st.st_mode & S_IXUGO)
-       return (0);
+      have_ids = 1;
+      uid = getuid ();
+      gid = getgid ();
+      euid = geteuid ();
+      egid = getegid ();
     }
 
-  if (st.st_uid == euid)        /* owner */
-    mode <<= 6;
-  else if (group_member (st.st_gid))
-    mode <<= 3;
+  if (uid != euid)
+    setreuid (euid, uid);
+  if (gid != egid)
+    setregid (egid, gid);
 
-  if (st.st_mode & mode)
-    return (0);
+  result = access (file, mode);
+
+  if (uid != euid)
+    setreuid (euid, uid);
+  if (gid != egid)
+    setregid (egid, gid);
 
-  return (-1);
+  return result;
 }
+#else
+# define eaccess(F, M) euidaccess (F, M)
+#endif
 
 /* Increment our position in the argument list.  Check that we're not
    past the end of the argument list.  This check is supressed if the