|
|
|
@ -1139,23 +1139,29 @@ die(const char *errstr, ...) { |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
execsh(void) { |
|
|
|
|
char **args; |
|
|
|
|
char *envshell = getenv("SHELL"); |
|
|
|
|
const struct passwd *pass = getpwuid(getuid()); |
|
|
|
|
char **args, *sh; |
|
|
|
|
const struct passwd *pw; |
|
|
|
|
char buf[sizeof(long) * 8 + 1]; |
|
|
|
|
|
|
|
|
|
errno = 0; |
|
|
|
|
if((pw = getpwuid(getuid())) == NULL) { |
|
|
|
|
if(errno) |
|
|
|
|
die("getpwuid:%s\n", strerror(errno)); |
|
|
|
|
else |
|
|
|
|
die("who are you?\n"); |
|
|
|
|
} |
|
|
|
|
unsetenv("COLUMNS"); |
|
|
|
|
unsetenv("LINES"); |
|
|
|
|
unsetenv("TERMCAP"); |
|
|
|
|
|
|
|
|
|
if(pass) { |
|
|
|
|
setenv("LOGNAME", pass->pw_name, 1); |
|
|
|
|
setenv("USER", pass->pw_name, 1); |
|
|
|
|
setenv("SHELL", pass->pw_shell, 0); |
|
|
|
|
setenv("HOME", pass->pw_dir, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sh = (pw->pw_shell[0]) ? pw->pw_shell : shell; |
|
|
|
|
snprintf(buf, sizeof(buf), "%lu", xw.win); |
|
|
|
|
|
|
|
|
|
setenv("LOGNAME", pw->pw_name, 1); |
|
|
|
|
setenv("USER", pw->pw_name, 1); |
|
|
|
|
setenv("SHELL", sh, 1); |
|
|
|
|
setenv("HOME", pw->pw_dir, 1); |
|
|
|
|
setenv("TERM", termname, 1); |
|
|
|
|
setenv("WINDOWID", buf, 1); |
|
|
|
|
|
|
|
|
|
signal(SIGCHLD, SIG_DFL); |
|
|
|
@ -1165,9 +1171,7 @@ execsh(void) { |
|
|
|
|
signal(SIGTERM, SIG_DFL); |
|
|
|
|
signal(SIGALRM, SIG_DFL); |
|
|
|
|
|
|
|
|
|
DEFAULT(envshell, shell); |
|
|
|
|
setenv("TERM", termname, 1); |
|
|
|
|
args = opt_cmd ? opt_cmd : (char *[]){envshell, "-i", NULL}; |
|
|
|
|
args = opt_cmd ? opt_cmd : (char *[]){sh, "-i", NULL}; |
|
|
|
|
execvp(args[0], args); |
|
|
|
|
exit(EXIT_FAILURE); |
|
|
|
|
} |
|
|
|
|