+/*
+ * 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;
+}