close(p[1]);
xdup2(p[0], STDIN_FILENO);
signal(SIGPIPE, SIG_DFL);
- execl(DEFAULT_SHELL, DEFAULT_SHELL_SHORT_NAME, "-c", archive_handle->tar__to_command, NULL);
- bb_perror_msg_and_die("can't execute '%s'", DEFAULT_SHELL);
+ execl(archive_handle->tar__to_command_shell,
+ archive_handle->tar__to_command_shell,
+ "-c",
+ archive_handle->tar__to_command,
+ NULL);
+ bb_perror_msg_and_die("can't execute '%s'", archive_handle->tar__to_command_shell);
}
close(p[0]);
/* Our caller is expected to do signal(SIGPIPE, SIG_IGN)
putenv((char*)"TAR_FILETYPE=f");
signal(SIGPIPE, SIG_IGN);
tar_handle->action_data = data_extract_to_command;
+ IF_FEATURE_TAR_TO_COMMAND(tar_handle->tar__to_command_shell = xstrdup(get_shell_name());)
}
if (opt & OPT_KEEP_OLD)
if (!argv[0]) {
argv--;
- argv[0] = getenv("SHELL");
- if (!argv[0])
- argv[0] = (char *) DEFAULT_SHELL;
+ argv[0] = (char *) get_shell_name();
/*argv[1] = NULL; - already is */
}
++argv;
if (!*argv) { /* no 2nd param (PROG), use shell */
argv -= 2;
- argv[0] = getenv("SHELL");
- if (!argv[0]) {
- argv[0] = (char *) DEFAULT_SHELL;
- }
- argv[1] = (char *) "-i";
+ argv[0] = (char *) get_shell_name();
+ argv[1] = (char *) "-i"; /* GNU coreutils 8.4 compat */
+ /*argv[2] = NULL; - already is */
}
BB_EXECVP_or_die(argv);
# endif
#if ENABLE_FEATURE_TAR_TO_COMMAND
char* tar__to_command;
+ const char* tar__to_command_shell;
#endif
# if ENABLE_FEATURE_TAR_SELINUX
char* tar__global_sctx;
/* Returns ptr to NUL */
char *bb_simplify_abs_path_inplace(char *path) FAST_FUNC;
-#define FAIL_DELAY 3
+#define LOGIN_FAIL_DELAY 3
extern void bb_do_delay(int seconds) FAST_FUNC;
extern void change_identity(const struct passwd *pw) FAST_FUNC;
extern void run_shell(const char *shell, int loginshell, const char *command, const char **additional_args) NORETURN FAST_FUNC;
+
+/* Returns $SHELL, getpwuid(getuid())->pw_shell, or DEFAULT_SHELL.
+ * Note that getpwuid result might need xstrdup'ing
+ * if there is a possibility of intervening getpwxxx() calls.
+ */
+const char *get_shell_name(void);
+
#if ENABLE_SELINUX
extern void renew_current_security_context(void) FAST_FUNC;
extern void set_current_security_context(security_context_t sid) FAST_FUNC;
}
pw.pw_gecos = (char *)"Linux User,,,";
- pw.pw_shell = (char *)DEFAULT_SHELL;
+ /* We assume that newly created users "inherit" root's shell setting */
+ pw.pw_shell = (char *)get_shell_name();
pw.pw_dir = NULL;
/* exactly one non-option arg */
int pid = xvfork();
if (pid == 0) {
struct termios termchild;
- char *shell = getenv("SHELL");
+ const char *shell = get_shell_name();
- if (!shell)
- shell = (char *) DEFAULT_SHELL;
signal(SIGHUP, SIG_IGN);
// set tty as a controlling tty
setsid();
static void edit_file(const struct passwd *pas, const char *file)
{
const char *ptr;
- int pid = xvfork();
+ pid_t pid;
+ pid = xvfork();
if (pid) { /* parent */
wait4pid(pid);
return;
/* CHILD - change user and run editor */
/* initgroups, setgid, setuid */
change_identity(pas);
- setup_environment(DEFAULT_SHELL,
+ setup_environment(pas->pw_shell,
SETUP_ENV_CHANGEENV | SETUP_ENV_TO_TMP,
pas);
ptr = getenv("VISUAL");
}
BB_EXECLP(ptr, ptr, file, NULL);
- bb_perror_msg_and_die("exec %s", ptr);
+ bb_perror_msg_and_die("can't execute '%s'", ptr);
}
static int open_as_user(const struct passwd *pas, const char *file)
struct globals {
char **my_environ;
const char *startup_PATH;
+ char *shell;
} FIX_ALIASING;
#define G (*(struct globals*)&bb_common_bufsiz1)
#define INIT_G() do { } while (0)
fflush_all();
child = vfork();
- switch (child) {
- case -1: /* failure */
+ if (child < 0) /* failure */
return 0;
- case 0: /* child */
- execle(DEFAULT_SHELL, DEFAULT_SHELL, "-c", str, (char *) NULL, G.my_environ);
+ if (child == 0) { /* child */
+ execle(G.shell, G.shell, "-c", str, (char *) NULL, G.my_environ);
_exit(127);
}
safe_waitpid(child, &status, 0);
INIT_G();
G.startup_PATH = getenv("PATH");
+ G.shell = xstrdup(get_shell_name());
cmds = iface_down;
if (applet_name[2] == 'u') {
unsigned nearest_rotate;
void* (*memRchr)(const void *, int, size_t);
+ char *shell;
smallint exitasap;
smallint rotateasap;
/* vfork'ed child trashes this byte, save... */
sv_ch = ld->fnsave[26];
+ if (!G.shell)
+ G.shell = xstrdup(get_shell_name());
+
while ((pid = vfork()) == -1)
pause2cannot("vfork for processor", ld->name);
if (!pid) {
fd = xopen("newstate", O_WRONLY|O_NDELAY|O_TRUNC|O_CREAT);
xmove_fd(fd, 5);
-// getenv("SHELL")?
- execl(DEFAULT_SHELL, DEFAULT_SHELL_SHORT_NAME, "-c", ld->processor, (char*) NULL);
+ execl(G.shell, G.shell, "-c", ld->processor, (char*) NULL);
bb_perror_msg_and_die(FATAL"can't %s processor %s", "run", ld->name);
}
ld->fnsave[26] = sv_ch; /* ...restore */
if (!(opt & OPT_q)) {
printf("Script started, file is %s\n", fname);
}
- shell = getenv("SHELL");
- if (shell == NULL) {
- shell = DEFAULT_SHELL;
- }
+ shell = get_shell_name();
pty = xgetpty(pty_line);