]> pd.if.org Git - startuptools/blobdiff - setid.c
renamed chids to setid
[startuptools] / setid.c
diff --git a/setid.c b/setid.c
new file mode 100644 (file)
index 0000000..d37c405
--- /dev/null
+++ b/setid.c
@@ -0,0 +1,61 @@
+/*
+ * set id
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <pwd.h>
+
+#include <grp.h>
+
+       int getgrouplist(const char *user, gid_t group,
+                        gid_t *groups, int *ngroups);
+
+
+
+#include "exec.c"
+#if 0
+#include "die.c"
+#endif
+
+/*
+ * chids <uid> cmd... run command as uid, gid from passwd
+ * chids <uid:gid> cmd run command as uid, gid
+ * chids <uid:> 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;
+}