X-Git-Url: https://pd.if.org/git/?p=startuptools;a=blobdiff_plain;f=setid.c;fp=setid.c;h=d37c40591fd497e230798ee887d70644309536da;hp=0000000000000000000000000000000000000000;hb=a99b3128aa7428fe93a85e48bc9169a2fe8c9746;hpb=257f33dd235edbdd9d2e185849b2f9cfc0617ea2 diff --git a/setid.c b/setid.c new file mode 100644 index 0000000..d37c405 --- /dev/null +++ b/setid.c @@ -0,0 +1,61 @@ +/* + * 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; +}