-/* 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>
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
{
char *user = argv[i];
char *group = strchr(user, '/');
+ if (!group)
+ group = strchr(user, '.');
if (group)
*group++ = 0;
}
}
+ 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");