X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Frunas.c;h=f43dc08e87eda400b4e1f3ab70562efba2835439;hb=1a2b381616b372efb5e386ef5fff3aa2f76873a4;hp=07d0c28c948fb557ecf01c97356f1c7dc93ccf71;hpb=0f8dca08a4f68cba82c2c822998ecc309d3b7aaf;p=fs%2Flustre-release.git diff --git a/lustre/tests/runas.c b/lustre/tests/runas.c index 07d0c28..f43dc08 100644 --- a/lustre/tests/runas.c +++ b/lustre/tests/runas.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -17,11 +15,7 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ @@ -61,181 +55,184 @@ static const char usage[] = void Usage_and_abort(const char *name) { - fprintf(stderr, usage, name); - exit(-1); + fprintf(stderr, usage, name); + exit(-1); } 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 }; - int euid_is_set = 0, egid_is_set = 0; - uid_t euid = 0; - gid_t egid = 0; - - if (argc == 1) { - fprintf(stderr, "No parameter count\n"); - Usage_and_abort(name); - } - - // get UID and GID - while ((c = getopt(argc, argv, "+u:g:v:j:hG::")) != -1) { - switch (c) { - case 'u': - if (!isdigit(optarg[0])) { - struct passwd *pw = getpwnam(optarg); - if (pw == NULL) { - fprintf(stderr, "parameter '%s' bad\n", - optarg); - Usage_and_abort(name); - } - user_id = pw->pw_uid; - } else { - user_id = (uid_t)atoi(optarg); - } - uid_is_set = 1; - if (!gid_is_set) - grp_id = user_id; - break; - - case 'g': - if (!isdigit(optarg[0])) { - struct group *gr = getgrnam(optarg); - if (gr == NULL) { - fprintf(stderr, "getgrname %s failed\n", - optarg); - Usage_and_abort(name); - } - grp_id = gr->gr_gid; - } else { - grp_id = (gid_t)atoi(optarg); - } - gid_is_set = 1; - break; - - case 'v': - if (!isdigit(optarg[0])) { - struct passwd *pw = getpwnam(optarg); - if (pw == NULL) { - fprintf(stderr, "parameter '%s' bad\n", - optarg); - Usage_and_abort(name); - } - euid = pw->pw_uid; - } else { - euid = (uid_t)atoi(optarg); - } - euid_is_set = 1; - break; - - case 'j': - if (!isdigit(optarg[0])) { - struct group *gr = getgrnam(optarg); - if (gr == NULL) { - fprintf(stderr, "getgrname %s failed\n", - optarg); - Usage_and_abort(name); - } - egid = gr->gr_gid; - } else { - egid = (gid_t)atoi(optarg); - } - egid_is_set = 1; - 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; - } - break; - - default: - case 'h': - Usage_and_abort(name); - break; - } - } - - if (!uid_is_set) { - fprintf(stderr, "Must specify uid to run.\n"); - Usage_and_abort(name); - } - - if (optind == argc) { - fprintf(stderr, "Must specify command to run.\n"); - Usage_and_abort(name); - } - - // assemble the command - my_argv = (char**)malloc(sizeof(char*)*(argc+1-optind)); - if (my_argv == NULL) { - fprintf(stderr, "Error in allocating memory. (%s)\n", - strerror(errno)); - exit(-1); - } - - for (i = optind; i < argc; i++) { - my_argv[i-optind] = argv[i]; - //printf("%s\n",my_argv[i-optind]); - } - my_argv[i-optind] = NULL; + 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 }; + int euid_is_set = 0, egid_is_set = 0; + uid_t euid = 0; + gid_t egid = 0; + + if (argc == 1) { + fprintf(stderr, "No parameter count\n"); + Usage_and_abort(name); + } + + /* get UID and GID */ + while ((c = getopt(argc, argv, "+u:g:v:j:hG::")) != -1) { + switch (c) { + case 'u': + if (!isdigit(optarg[0])) { + struct passwd *pw = getpwnam(optarg); + + if (!pw) { + fprintf(stderr, "parameter '%s' bad\n", + optarg); + Usage_and_abort(name); + } + user_id = pw->pw_uid; + } else { + user_id = (uid_t)atoi(optarg); + } + uid_is_set = 1; + if (!gid_is_set) + grp_id = user_id; + break; + + case 'g': + if (!isdigit(optarg[0])) { + struct group *gr = getgrnam(optarg); + + if (!gr) { + fprintf(stderr, "getgrname %s failed\n", + optarg); + Usage_and_abort(name); + } + grp_id = gr->gr_gid; + } else { + grp_id = (gid_t)atoi(optarg); + } + gid_is_set = 1; + break; + + case 'v': + if (!isdigit(optarg[0])) { + struct passwd *pw = getpwnam(optarg); + + if (!pw) { + fprintf(stderr, "parameter '%s' bad\n", + optarg); + Usage_and_abort(name); + } + euid = pw->pw_uid; + } else { + euid = (uid_t)atoi(optarg); + } + euid_is_set = 1; + break; + + case 'j': + if (!isdigit(optarg[0])) { + struct group *gr = getgrnam(optarg); + + if (!gr) { + fprintf(stderr, "getgrname %s failed\n", + optarg); + Usage_and_abort(name); + } + egid = gr->gr_gid; + } else { + egid = (gid_t)atoi(optarg); + } + egid_is_set = 1; + break; + + case 'G': + num_supp = 0; + if (!optarg || !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; + } + break; + + default: + case 'h': + Usage_and_abort(name); + break; + } + } + + if (!uid_is_set) { + fprintf(stderr, "Must specify uid to run.\n"); + Usage_and_abort(name); + } + + if (optind == argc) { + fprintf(stderr, "Must specify command to run.\n"); + Usage_and_abort(name); + } + + /* assemble the command */ + my_argv = (char **)malloc(sizeof(char *) * (argc + 1 - optind)); + if (!my_argv) { + fprintf(stderr, "Error in allocating memory. (%s)\n", + strerror(errno)); + exit(-1); + } + + for (i = optind; i < argc; i++) + my_argv[i - optind] = argv[i]; + + my_argv[i - optind] = NULL; #if DEBUG - system("whoami"); + system("whoami"); #endif - // set GID - if (!egid_is_set) - egid = grp_id; - status = setregid(grp_id, egid); - if (status == -1) { - fprintf(stderr, "Cannot change gid to %d/%d, errno=%d (%s)\n", - grp_id, egid, errno, strerror(errno) ); - exit(-1); - } - - if (num_supp >= 0) { - status = setgroups(num_supp, supp_groups); - if (status == -1) { - perror("setting supplementary groups"); - exit(-1); - } - } - - // set UID - if (!euid_is_set) - euid = user_id; - status = setreuid(user_id, euid); - if(status == -1) { - fprintf(stderr,"Cannot change uid to %d/%d, errno=%d (%s)\n", - user_id, euid, errno, strerror(errno) ); - exit(-1); - } - - fprintf(stderr, "running as uid/gid/euid/egid %d/%d/%d/%d, groups:", - user_id, grp_id, euid, egid); - for (i = 0; i < num_supp; i++) - fprintf(stderr, " %d", supp_groups[i]); - fprintf(stderr, "\n"); - - for (i = 0; i < argc - optind; i++) - fprintf(stderr, " [%s]", my_argv[i]); - - fprintf(stderr, "\n"); - fflush(stderr); - - // The command to be run - execvp(my_argv[0], my_argv); - fprintf(stderr, "execvp fails running %s (%d): %s\n", my_argv[0], - errno, strerror(errno)); - exit(-1); + /* set GID */ + if (!egid_is_set) + egid = grp_id; + status = setregid(grp_id, egid); + if (status == -1) { + fprintf(stderr, "Cannot change gid to %d/%d, errno=%d (%s)\n", + grp_id, egid, errno, strerror(errno)); + exit(-1); + } + + if (num_supp >= 0) { + status = setgroups(num_supp, supp_groups); + if (status == -1) { + perror("setting supplementary groups"); + exit(-1); + } + } + + /* set UID */ + if (!euid_is_set) + euid = user_id; + status = setreuid(user_id, euid); + if (status == -1) { + fprintf(stderr, "Cannot change uid to %d/%d, errno=%d (%s)\n", + user_id, euid, errno, strerror(errno)); + exit(-1); + } + + fprintf(stderr, "running as uid/gid/euid/egid %d/%d/%d/%d, groups:", + user_id, grp_id, euid, egid); + for (i = 0; i < num_supp; i++) + fprintf(stderr, " %d", supp_groups[i]); + fprintf(stderr, "\n"); + + for (i = 0; i < argc - optind; i++) + fprintf(stderr, " [%s]", my_argv[i]); + + fprintf(stderr, "\n"); + fflush(stderr); + + /* The command to be run */ + execvp(my_argv[0], my_argv); + fprintf(stderr, "execvp fails running %s (%d): %s\n", my_argv[0], + errno, strerror(errno)); + exit(-1); }