summaryrefslogtreecommitdiffstats
path: root/job.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2021-03-02 12:01:25 +0000
committerThomas Adam <thomas@xteddy.org>2021-03-02 12:01:25 +0000
commit2301bee87ddfcdc307d8cb4e3f62eed9fb94d311 (patch)
treeff292eb08ed29269c7829f3908cc9e265663fe02 /job.c
parent48131c6d020220e6998512198b73819c5a085db9 (diff)
parent81f9a23d25237f2b0c52a2867ddd2db59cc8f368 (diff)
Merge branch 'obsd-master' into master
Diffstat (limited to 'job.c')
-rw-r--r--job.c46
1 files changed, 31 insertions, 15 deletions
diff --git a/job.c b/job.c
index 5bf53a76..a1fc0cf5 100644
--- a/job.c
+++ b/job.c
@@ -66,19 +66,20 @@ struct job {
/* 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
@@ -99,7 +100,13 @@ job_run(const char *cmd, struct session *s, const char *cwd,
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:
@@ -139,8 +146,14 @@ job_run(const char *cmd, struct session *s, const char *cwd,
}
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);
@@ -150,7 +163,10 @@ job_run(const char *cmd, struct session *s, const char *cwd,
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;