X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Frunas.c;h=416d251efc57402e5f738eaa2706f8d9ae84df48;hb=870d2ee8dc232f8c4c431f4dd206d11478d62db9;hp=4db76176848799d655e648feb0e1f0ee34a74903;hpb=113303973ec9f8484eb2355a1a6ef3c4c7fd6a56;p=fs%2Flustre-release.git diff --git a/lustre/tests/runas.c b/lustre/tests/runas.c index 4db7617..416d251 100644 --- a/lustre/tests/runas.c +++ b/lustre/tests/runas.c @@ -19,9 +19,11 @@ #endif static const char usage[] = -"Usage: %s -u user_id [-g grp_id] [-G[gid0,gid1,...]] command\n" +"Usage: %s -u user_id [-g grp_id] [-v euid] [-j egid] [-G[gid0,gid1,...]] command\n" " -u user_id switch to UID user_id\n" " -g grp_id switch to GID grp_id\n" +" -v euid switch euid to UID\n" +" -j egid switch egid to GID\n" " -G[gid0,gid1,...] set supplementary groups\n"; void Usage_and_abort(const char *name) @@ -37,6 +39,9 @@ int main(int argc, char **argv) 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"); @@ -44,7 +49,7 @@ int main(int argc, char **argv) } // get UID and GID - while ((c = getopt(argc, argv, "+u:g:hG::")) != -1) { + while ((c = getopt(argc, argv, "+u:g:v:j:hG::")) != -1) { switch (c) { case 'u': if (!isdigit(optarg[0])) { @@ -78,6 +83,36 @@ int main(int argc, char **argv) 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])) @@ -126,10 +161,12 @@ int main(int argc, char **argv) #endif // set GID - status = setregid(grp_id, grp_id); + if (!egid_is_set) + egid = grp_id; + status = setregid(grp_id, egid); if (status == -1) { - fprintf(stderr, "Cannot change grp_ID to %d, errno=%d (%s)\n", - grp_id, errno, strerror(errno) ); + fprintf(stderr, "Cannot change gid to %d/%d, errno=%d (%s)\n", + grp_id, egid, errno, strerror(errno) ); exit(-1); } @@ -142,16 +179,19 @@ int main(int argc, char **argv) } // set UID - status = setreuid(user_id, user_id ); + if (!euid_is_set) + euid = user_id; + status = setreuid(user_id, euid); if(status == -1) { - fprintf(stderr,"Cannot change user_ID to %d, errno=%d (%s)\n", - user_id, errno, strerror(errno) ); + 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 %d, GID %d", user_id, grp_id); + 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, " %d", supp_groups[i]); fprintf(stderr, "\n"); for (i = 0; i < argc - optind; i++)