=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/job.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -r1.59 -r1.60 --- src/usr.bin/tmux/job.c 2021/02/19 09:09:16 1.59 +++ src/usr.bin/tmux/job.c 2021/03/02 10:56:45 1.60 @@ -1,4 +1,4 @@ -/* $OpenBSD: job.c,v 1.59 2021/02/19 09:09:16 nicm Exp $ */ +/* $OpenBSD: job.c,v 1.60 2021/03/02 10:56:45 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -68,19 +68,20 @@ /* All jobs list. */ static LIST_HEAD(joblist, job) all_jobs = LIST_HEAD_INITIALIZER(all_jobs); -/* Start a job running, if it isn't already. */ +/* Start a job running. */ struct job * -job_run(const char *cmd, struct session *s, const char *cwd, - job_update_cb updatecb, job_complete_cb completecb, job_free_cb freecb, - void *data, int flags, int sx, int sy) +job_run(const char *cmd, int argc, char **argv, struct session *s, + const char *cwd, job_update_cb updatecb, job_complete_cb completecb, + job_free_cb freecb, void *data, int flags, int sx, int sy) { - struct job *job; - struct environ *env; - pid_t pid; - int nullfd, out[2], master; - const char *home; - sigset_t set, oldset; - struct winsize ws; + struct job *job; + struct environ *env; + pid_t pid; + int nullfd, out[2], master; + const char *home; + sigset_t set, oldset; + struct winsize ws; + char **argvp; /* * Do not set TERM during .tmux.conf, it is nice to be able to use @@ -101,7 +102,13 @@ goto fail; pid = fork(); } - log_debug("%s: cmd=%s, cwd=%s", __func__, cmd, cwd == NULL ? "" : cwd); + 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) { case -1: @@ -141,8 +148,14 @@ } closefrom(STDERR_FILENO + 1); - execl(_PATH_BSHELL, "sh", "-c", cmd, (char *) NULL); - fatal("execl failed"); + if (cmd != NULL) { + execl(_PATH_BSHELL, "sh", "-c", cmd, (char *) NULL); + fatal("execl failed"); + } else { + argvp = cmd_copy_argv(argc, argv); + execvp(argvp[0], argvp); + fatal("execvp failed"); + } } sigprocmask(SIG_SETMASK, &oldset, NULL); @@ -152,7 +165,10 @@ job->state = JOB_RUNNING; job->flags = flags; - job->cmd = xstrdup(cmd); + if (cmd != NULL) + job->cmd = xstrdup(cmd); + else + job->cmd = cmd_stringify_argv(argc, argv); job->pid = pid; job->status = 0;