-/* $OpenBSD: client.c,v 1.161 2023/07/10 12:00:08 nicm Exp $ */
+/* $OpenBSD: client.c,v 1.162 2024/05/15 09:59:12 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
static __dead void
client_exec(const char *shell, const char *shellcmd)
{
- const char *name, *ptr;
- char *argv0;
+ char *argv0;
log_debug("shell %s, command %s", shell, shellcmd);
-
- ptr = strrchr(shell, '/');
- if (ptr != NULL && *(ptr + 1) != '\0')
- name = ptr + 1;
- else
- name = shell;
- if (client_flags & CLIENT_LOGIN)
- xasprintf(&argv0, "-%s", name);
- else
- xasprintf(&argv0, "%s", name);
+ argv0 = shell_argv0(shell, !!(client_flags & CLIENT_LOGIN));
setenv("SHELL", shell, 1);
proc_clear_signals(client_proc, 1);
-/* $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>
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);
}
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) {
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);
sigprocmask(SIG_SETMASK, &oldset, NULL);
environ_free(env);
+ free(argv0);
job = xmalloc(sizeof *job);
job->state = JOB_RUNNING;
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);
}
-/* $OpenBSD: tmux.c,v 1.211 2023/04/17 18:00:19 nicm Exp $ */
+/* $OpenBSD: tmux.c,v 1.212 2024/05/15 09:59:12 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
return (NULL);
}
+char *
+shell_argv0(const char *shell, int is_login)
+{
+ const char *slash, *name;
+ char *argv0;
+
+ slash = strrchr(shell, '/');
+ if (slash != NULL && slash[1] != '\0')
+ name = slash + 1;
+ else
+ name = shell;
+ if (is_login)
+ xasprintf(&argv0, "-%s", name);
+ else
+ xasprintf(&argv0, "%s", name);
+ return (argv0);
+}
+
void
setblocking(int fd, int state)
{