Whamcloud - gitweb
smash the HEAD with the contents of b_cmd. HEAD_PRE_CMD_SMASH and
[fs/lustre-release.git] / lustre / tests / runas.c
index 91c9c7f..1e859aa 100644 (file)
@@ -6,22 +6,17 @@
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
-#include <ctype.h>
 #include <sys/types.h>
 #include <grp.h>
 #include <sys/wait.h>
 
 #define DEBUG 0
 
-#ifndef NGROUPS_MAX
-#define NGROUPS_MAX 32
-#endif
-
 static const char usage[] =
 "Usage: %s -u user_id [-g grp_id ] [ -G ] command\n"
-"  -u user_id           switch to UID user_id\n"
-"  -g grp_id            switch to GID grp_id\n"
-"  -G[gid0,gid1,...]    set supplementary groups\n";
+"  -u user_id      switch to UID user_id\n"
+"  -g grp_id       switch to GID grp_id\n"
+"  -G              clear supplementary groups\n";
 
 void Usage_and_abort(const char *name)
 {
@@ -31,17 +26,20 @@ void Usage_and_abort(const char *name)
 
 int main(int argc, char **argv)
 {
-        char **my_argv, *name = argv[0], *grp;
-        int status, c, i;
-        int gid_is_set = 0, uid_is_set = 0, num_supp = -1;
-        uid_t user_id = 0;
-        gid_t grp_id = 0, supp_groups[NGROUPS_MAX] = { 0 };
+        char **my_argv, *name = argv[0];
+        int status;
+        int c,i;
+        int gid_is_set = 0;
+        int uid_is_set = 0;
+        int clear_supp_groups = 0;
+        uid_t user_id;
+        gid_t grp_id;
 
         if (argc == 1)
                 Usage_and_abort(name);
 
         // get UID and GID
-        while ((c = getopt(argc, argv, "+u:g:hG::")) != -1) {
+        while ((c = getopt (argc, argv, "+u:g:hG")) != -1) {
                 switch (c) {
                 case 'u':
                         user_id = (uid_t)atoi(optarg);
@@ -56,15 +54,7 @@ int main(int argc, char **argv)
                         break;
 
                 case 'G':
-                        num_supp = 0;
-                        if (optarg == NULL || !isdigit(optarg[0]))
-                                break;
-                        while ((grp = strsep(&optarg, ",")) != NULL) {
-                                printf("adding supp group %d\n", atoi(grp));
-                                supp_groups[num_supp++] = atoi(grp);
-                                if (num_supp >= NGROUPS_MAX)
-                                        break;
-                        }
+                        clear_supp_groups = 1;
                         break;
 
                 default:
@@ -108,14 +98,14 @@ int main(int argc, char **argv)
                  exit(-1);
         }
 
-        if (num_supp >= 0) {
-                status = setgroups(num_supp, supp_groups);
+        if (clear_supp_groups) {
+                status = setgroups(0, NULL);
                 if (status == -1) {
-                        perror("setting supplementary groups");
+                        perror("clearing supplementary groups");
                         exit(-1);
                 }
         }
-
+        
         // set UID
         status = setreuid(user_id, user_id );
         if(status == -1) {
@@ -124,10 +114,8 @@ int main(int argc, char **argv)
                   exit(-1);
         }
 
-        fprintf(stderr, "running as UID %d, GID %d", user_id, grp_id);
-        for (i = 0; i < num_supp; i++)
-                fprintf(stderr, ":%d", supp_groups[i]);
-        fprintf(stderr, "\n");
+        fprintf(stderr, "running as UID %d, GID %d%s:", user_id, grp_id,
+                clear_supp_groups ? ", cleared groups" : "");
 
         for (i = 0; i < argc - optind; i++)
                  fprintf(stderr, " [%s]", my_argv[i]);