/* * set id */ #include #include #include #include #include #include #include int getgrouplist(const char *user, gid_t group, gid_t *groups, int *ngroups); #include "exec.c" #if 0 #include "die.c" #endif /* * chids cmd... run command as uid, gid from passwd * chids cmd run command as uid, gid * chids cmd run command as uid, gid from passwd,groups */ int main(int ac, char *av[]) { struct passwd *pw; uid_t uid; uid = geteuid(); pw = getpwnam(av[1]); if (!pw) { perror("getpwnam"); exit(EXIT_FAILURE); } if (uid == 0 && setgroups(0,0) == -1) { perror("setgroups"); exit(EXIT_FAILURE); }; if (setgid(pw->pw_gid) == -1) { perror("setgid"); exit(EXIT_FAILURE); }; if (setuid(pw->pw_uid) == -1) { perror("setuid"); exit(EXIT_FAILURE); }; do_exec(2, ac, av); /* shouldn't get here... */ return EXIT_FAILURE; }