/* sush.c - setuid shell executor
**
** v2 by Pegasus Epsilon <pegasus@pimpninjas.org>
** (C) 2013 Distribute Unmodified
** http://pegasus.pimpninjas.org/license
*/
#define TRUE 1
#define _XOPEN_SOURCE 600
/* >= 500 for setreuid() */
/* >= 600 for setenv(), unsetenv() */
#include <sys/types.h> /* geteuid(), setreuid() */
#include <unistd.h> /* geteuid(), setreuid() */
#include <stdio.h> /* perror() */
#include <stdlib.h> /* setenv(), unsetenv(), getenv() */
#include <pwd.h> /* struct passwd, getpwuid() */
int main(int argc, char *argv[], char *envp[]) {
uid_t uid;
struct passwd *pwd;
uid = geteuid();
if (setreuid(uid, uid))
perror("failed to set uid");
pwd = getpwuid(uid);
setenv("HOME", pwd->pw_dir, TRUE);
unsetenv("HISTFILE");
if (execve(getenv("SHELL"), argv, envp))
perror("failed to exec shell");
return -1;
}