summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/job.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2024-05-15 09:59:13 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2024-05-15 09:59:13 +0000
commit263815373d139cd2b02804faad11aa2c4e21b0b4 (patch)
tree009a97f98cd20ffac75aba024f0760c57cc3e4e5 /usr.bin/tmux/job.c
parent83445d02cf0722a8e0505a59fa60228f2de07ccb (diff)
Use default-shell for command prompt #() and popups as well
Diffstat (limited to 'usr.bin/tmux/job.c')
-rw-r--r--usr.bin/tmux/job.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/usr.bin/tmux/job.c b/usr.bin/tmux/job.c
index f13cb8d67fe..e92daaef81e 100644
--- a/usr.bin/tmux/job.c
+++ b/usr.bin/tmux/job.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: job.c,v 1.67 2022/02/01 12:05:42 nicm Exp $ */
+/* $OpenBSD: job.c,v 1.68 2024/05/15 09:59:12 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -79,19 +79,28 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio
struct environ *env;
pid_t pid;
int nullfd, out[2], master;
- const char *home;
+ const char *home, *shell;
sigset_t set, oldset;
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
- * if-shell to decide on default-terminal based on outside TERM.
+ * Do not set TERM during .tmux.conf (second argument here), it is nice
+ * to be able to use if-shell to decide on default-terminal based on
+ * outside TERM.
*/
env = environ_for_session(s, !cfg_finished);
if (e != NULL)
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);
sigprocmask(SIG_BLOCK, &set, &oldset);
@@ -107,10 +116,11 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio
}
if (cmd == NULL) {
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 {
- log_debug("%s: cmd=%s, cwd=%s", __func__, cmd,
- cwd == NULL ? "" : cwd);
+ log_debug("%s: cmd=%s, cwd=%s, shell=%s", __func__, cmd,
+ cwd == NULL ? "" : cwd, shell);
}
switch (pid) {
@@ -152,7 +162,8 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio
closefrom(STDERR_FILENO + 1);
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");
} else {
argvp = cmd_copy_argv(argc, argv);
@@ -163,6 +174,7 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio
sigprocmask(SIG_SETMASK, &oldset, NULL);
environ_free(env);
+ free(argv0);
job = xmalloc(sizeof *job);
job->state = JOB_RUNNING;
@@ -196,12 +208,13 @@ job_run(const char *cmd, int argc, char **argv, struct environ *e, struct sessio
fatalx("out of memory");
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);
fail:
sigprocmask(SIG_SETMASK, &oldset, NULL);
environ_free(env);
+ free(argv0);
return (NULL);
}