http://slackware.bholcomb.com/slackware/slackware-11.0/source/xap/xscreensaver/xscree...
[xscreensaver] / driver / test-uid.c
index d0448f950b56c14559d06b2cd54764477a351170..6a1f9cc14024ec7e51ebb316fad9eb582794afd2 100644 (file)
@@ -1,5 +1,5 @@
-/* uid-test.c --- playing with setuid.
- * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+/* test-uid.c --- playing with setuid.
+ * xscreensaver, Copyright (c) 1998, 2005 Jamie Zawinski <jwz@jwz.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
 # include "config.h"
 #endif
 
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
 #include <ctype.h>
 #include <stdio.h>
 #include <string.h>
@@ -31,18 +36,38 @@ print(void)
   int egid = getegid();
   struct passwd *p = 0;
   struct group *g = 0;
+  gid_t groups[1024];
+  int n, size;
 
   p = getpwuid (uid);
   g = getgrgid (gid);
-  fprintf(stderr, "real user/group: %ld/%ld (%s/%s)\n", uid, gid,
+  fprintf(stderr, "real user/group: %ld/%ld (%s/%s)\n", (long) uid, (long) gid,
          (p && p->pw_name ? p->pw_name : "???"),
          (g && g->gr_name ? g->gr_name : "???"));
 
   p = getpwuid (euid);
   g = getgrgid (egid);
-  fprintf(stderr, "eff. user/group: %ld/%ld (%s/%s)\n", euid, egid,
+  fprintf(stderr, "eff. user/group: %ld/%ld (%s/%s)\n", (long)euid, (long)egid,
          (p && p->pw_name ? p->pw_name : "???"),
          (g && g->gr_name ? g->gr_name : "???"));
+
+  size = sizeof(groups) / sizeof(gid_t);
+  n = getgroups(size - 1, groups);
+  if (n < 0)
+    perror("getgroups failed");
+  else
+    {
+      int i;
+      fprintf (stderr, "eff. group list: [");
+      for (i = 0; i < n; i++)
+        {
+          g = getgrgid (groups[i]);
+          fprintf(stderr, "%s%s=%ld", (i == 0 ? "" : ", "),
+                  (g->gr_name ? g->gr_name : "???"),
+                  (long) groups[i]);
+        }
+      fprintf (stderr, "]\n");
+    }
 }
 
 int
@@ -69,6 +94,8 @@ main (int argc, char **argv)
     {
       char *user = argv[i];
       char *group = strchr(user, '/');
+      if (!group)
+       group = strchr(user, '.');
       if (group)
        *group++ = 0;
 
@@ -107,6 +134,15 @@ main (int argc, char **argv)
                }
            }
 
+         fprintf(stderr, "setgroups(1, [%ld]) \"%s\"", gid, group);
+          {
+            gid_t g2 = gid;
+            if (setgroups(1, &g2) == 0)
+              fprintf(stderr, " succeeded.\n");
+            else
+              perror(" failed");
+          }
+
          fprintf(stderr, "setgid(%ld) \"%s\"", gid, group);
          if (setgid(gid) == 0)
            fprintf(stderr, " succeeded.\n");