mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 13:37:12 +00:00
Merge branch 'obsd-master' into master
This commit is contained in:
32
job.c
32
job.c
@ -50,6 +50,7 @@ struct job {
|
||||
|
||||
char *cmd;
|
||||
pid_t pid;
|
||||
char tty[TTY_NAME_MAX];
|
||||
int status;
|
||||
|
||||
int fd;
|
||||
@ -79,7 +80,7 @@ job_run(const char *cmd, int argc, char **argv, struct session *s,
|
||||
const char *home;
|
||||
sigset_t set, oldset;
|
||||
struct winsize ws;
|
||||
char **argvp;
|
||||
char **argvp, tty[TTY_NAME_MAX];
|
||||
|
||||
/*
|
||||
* Do not set TERM during .tmux.conf, it is nice to be able to use
|
||||
@ -94,7 +95,7 @@ job_run(const char *cmd, int argc, char **argv, struct session *s,
|
||||
memset(&ws, 0, sizeof ws);
|
||||
ws.ws_col = sx;
|
||||
ws.ws_row = sy;
|
||||
pid = fdforkpty(ptm_fd, &master, NULL, NULL, &ws);
|
||||
pid = fdforkpty(ptm_fd, &master, tty, NULL, &ws);
|
||||
} else {
|
||||
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, out) != 0)
|
||||
goto fail;
|
||||
@ -168,6 +169,7 @@ job_run(const char *cmd, int argc, char **argv, struct session *s,
|
||||
else
|
||||
job->cmd = cmd_stringify_argv(argc, argv);
|
||||
job->pid = pid;
|
||||
strlcpy(job->tty, tty, sizeof job->tty);
|
||||
job->status = 0;
|
||||
|
||||
LIST_INSERT_HEAD(&all_jobs, job, entry);
|
||||
@ -199,6 +201,32 @@ fail:
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Take job's file descriptor and free the job. */
|
||||
int
|
||||
job_transfer(struct job *job, pid_t *pid, char *tty, size_t ttylen)
|
||||
{
|
||||
int fd = job->fd;
|
||||
|
||||
log_debug("transfer job %p: %s", job, job->cmd);
|
||||
|
||||
if (pid != NULL)
|
||||
*pid = job->pid;
|
||||
if (tty != NULL)
|
||||
strlcpy(tty, job->tty, ttylen);
|
||||
|
||||
LIST_REMOVE(job, entry);
|
||||
free(job->cmd);
|
||||
|
||||
if (job->freecb != NULL && job->data != NULL)
|
||||
job->freecb(job->data);
|
||||
|
||||
if (job->event != NULL)
|
||||
bufferevent_free(job->event);
|
||||
|
||||
free(job);
|
||||
return (fd);
|
||||
}
|
||||
|
||||
/* Kill and free an individual job. */
|
||||
void
|
||||
job_free(struct job *job)
|
||||
|
Reference in New Issue
Block a user