version 1.67, 2022/02/01 12:05:42 |
version 1.68, 2024/05/15 09:59:12 |
|
|
struct environ *env; |
struct environ *env; |
pid_t pid; |
pid_t pid; |
int nullfd, out[2], master; |
int nullfd, out[2], master; |
const char *home; |
const char *home, *shell; |
sigset_t set, oldset; |
sigset_t set, oldset; |
struct winsize ws; |
struct winsize ws; |
char **argvp, tty[TTY_NAME_MAX]; |
char **argvp, tty[TTY_NAME_MAX], *argv0; |
|
|
/* |
/* |
* Do not set TERM during .tmux.conf, it is nice to be able to use |
* Do not set TERM during .tmux.conf (second argument here), it is nice |
* if-shell to decide on default-terminal based on outside TERM. |
* to be able to use if-shell to decide on default-terminal based on |
|
* outside TERM. |
*/ |
*/ |
env = environ_for_session(s, !cfg_finished); |
env = environ_for_session(s, !cfg_finished); |
if (e != NULL) |
if (e != NULL) |
environ_copy(e, env); |
environ_copy(e, env); |
|
|
|
if (s != NULL) |
|
shell = options_get_string(s->options, "default-shell"); |
|
else |
|
shell = options_get_string(global_s_options, "default-shell"); |
|
if (!checkshell(shell)) |
|
shell = _PATH_BSHELL; |
|
argv0 = shell_argv0(shell, 0); |
|
|
sigfillset(&set); |
sigfillset(&set); |
sigprocmask(SIG_BLOCK, &set, &oldset); |
sigprocmask(SIG_BLOCK, &set, &oldset); |
|
|
|
|
} |
} |
if (cmd == NULL) { |
if (cmd == NULL) { |
cmd_log_argv(argc, argv, "%s:", __func__); |
cmd_log_argv(argc, argv, "%s:", __func__); |
log_debug("%s: cwd=%s", __func__, cwd == NULL ? "" : cwd); |
log_debug("%s: cwd=%s, shell=%s", __func__, |
|
cwd == NULL ? "" : cwd, shell); |
} else { |
} else { |
log_debug("%s: cmd=%s, cwd=%s", __func__, cmd, |
log_debug("%s: cmd=%s, cwd=%s, shell=%s", __func__, cmd, |
cwd == NULL ? "" : cwd); |
cwd == NULL ? "" : cwd, shell); |
} |
} |
|
|
switch (pid) { |
switch (pid) { |
|
|
closefrom(STDERR_FILENO + 1); |
closefrom(STDERR_FILENO + 1); |
|
|
if (cmd != NULL) { |
if (cmd != NULL) { |
execl(_PATH_BSHELL, "sh", "-c", cmd, (char *) NULL); |
setenv("SHELL", shell, 1); |
|
execl(shell, argv0, "-c", cmd, (char *)NULL); |
fatal("execl failed"); |
fatal("execl failed"); |
} else { |
} else { |
argvp = cmd_copy_argv(argc, argv); |
argvp = cmd_copy_argv(argc, argv); |
|
|
|
|
sigprocmask(SIG_SETMASK, &oldset, NULL); |
sigprocmask(SIG_SETMASK, &oldset, NULL); |
environ_free(env); |
environ_free(env); |
|
free(argv0); |
|
|
job = xmalloc(sizeof *job); |
job = xmalloc(sizeof *job); |
job->state = JOB_RUNNING; |
job->state = JOB_RUNNING; |
|
|
fatalx("out of memory"); |
fatalx("out of memory"); |
bufferevent_enable(job->event, EV_READ|EV_WRITE); |
bufferevent_enable(job->event, EV_READ|EV_WRITE); |
|
|
log_debug("run job %p: %s, pid %ld", job, job->cmd, (long) job->pid); |
log_debug("run job %p: %s, pid %ld", job, job->cmd, (long)job->pid); |
return (job); |
return (job); |
|
|
fail: |
fail: |
sigprocmask(SIG_SETMASK, &oldset, NULL); |
sigprocmask(SIG_SETMASK, &oldset, NULL); |
environ_free(env); |
environ_free(env); |
|
free(argv0); |
return (NULL); |
return (NULL); |
} |
} |
|
|