=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/job.c,v retrieving revision 1.67 retrieving revision 1.68 diff -c -r1.67 -r1.68 *** src/usr.bin/tmux/job.c 2022/02/01 12:05:42 1.67 --- src/usr.bin/tmux/job.c 2024/05/15 09:59:12 1.68 *************** *** 1,4 **** ! /* $OpenBSD: job.c,v 1.67 2022/02/01 12:05:42 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: job.c,v 1.68 2024/05/15 09:59:12 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott *************** *** 79,97 **** struct environ *env; pid_t pid; int nullfd, out[2], master; ! const char *home; sigset_t set, oldset; struct winsize ws; ! char **argvp, tty[TTY_NAME_MAX]; /* ! * 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. */ env = environ_for_session(s, !cfg_finished); if (e != NULL) environ_copy(e, env); sigfillset(&set); sigprocmask(SIG_BLOCK, &set, &oldset); --- 79,106 ---- struct environ *env; pid_t pid; int nullfd, out[2], master; ! const char *home, *shell; sigset_t set, oldset; struct winsize ws; ! char **argvp, tty[TTY_NAME_MAX], *argv0; /* ! * 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,116 **** } if (cmd == NULL) { cmd_log_argv(argc, argv, "%s:", __func__); ! log_debug("%s: cwd=%s", __func__, cwd == NULL ? "" : cwd); } else { ! log_debug("%s: cmd=%s, cwd=%s", __func__, cmd, ! cwd == NULL ? "" : cwd); } switch (pid) { --- 116,126 ---- } if (cmd == NULL) { cmd_log_argv(argc, argv, "%s:", __func__); ! log_debug("%s: cwd=%s, shell=%s", __func__, ! cwd == NULL ? "" : cwd, shell); } else { ! log_debug("%s: cmd=%s, cwd=%s, shell=%s", __func__, cmd, ! cwd == NULL ? "" : cwd, shell); } switch (pid) { *************** *** 152,158 **** closefrom(STDERR_FILENO + 1); if (cmd != NULL) { ! execl(_PATH_BSHELL, "sh", "-c", cmd, (char *) NULL); fatal("execl failed"); } else { argvp = cmd_copy_argv(argc, argv); --- 162,169 ---- closefrom(STDERR_FILENO + 1); if (cmd != NULL) { ! setenv("SHELL", shell, 1); ! execl(shell, argv0, "-c", cmd, (char *)NULL); fatal("execl failed"); } else { argvp = cmd_copy_argv(argc, argv); *************** *** 163,168 **** --- 174,180 ---- sigprocmask(SIG_SETMASK, &oldset, NULL); environ_free(env); + free(argv0); job = xmalloc(sizeof *job); job->state = JOB_RUNNING; *************** *** 196,207 **** 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); return (job); fail: sigprocmask(SIG_SETMASK, &oldset, NULL); environ_free(env); return (NULL); } --- 208,220 ---- 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); return (job); fail: sigprocmask(SIG_SETMASK, &oldset, NULL); environ_free(env); + free(argv0); return (NULL); }