#define _BSD_SOURCE #include #include #include #include #include int main(int argc, char **argv) { if(argc < 3) { fprintf(stderr, "Usage: %s username command [arguments]\n", argv[0]); return 1; } const char *username = argv[1]; errno = 0; struct passwd *passwd_entry = getpwnam(username); if(passwd_entry == NULL) { perror("getpwnam"); return 1; } uid_t ruid = passwd_entry->pw_uid; if(setreuid(ruid, -1) != 0) { perror("getpwnam"); return 1; } char **daemon_argv = &argv[2]; const char *daemon_command = daemon_argv[0]; execvp(daemon_command, daemon_argv); perror("execvp"); return 1; }