summaryrefslogtreecommitdiffstats
path: root/job.c
diff options
context:
space:
mode:
authornicm <nicm>2021-03-02 10:56:45 +0000
committernicm <nicm>2021-03-02 10:56:45 +0000
commitc44750792a9683c5cd6f9df5a69e7417b88772d2 (patch)
treec60638c0067f6238a670260ce48c94a42e03acfb /job.c
parentde3a898e8af335325039a4165525fff1d5e1a1b0 (diff)
Drop support for popups where the content is provided directly to tmux
(which does not have many practical uses) and only support running a program in the popup. display-popup is now simpler and can accept multiple arguments to avoid escaping problems (like the other commands).
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 6267336b..a972bc0e 100644
--- a/job.c
+++ b/job.c
@@ -68,19 +68,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
@@ -101,7 +102,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:
@@ -141,8 +148,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);
@@ -152,7 +165,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;