Lines Matching defs:job

1 /* $OpenBSD: job.c,v 1.69 2024/09/30 07:54:51 nicm Exp $ */
43 /* A single job. */
44 struct job {
66 LIST_ENTRY(job) entry;
70 static LIST_HEAD(joblist, job) all_jobs = LIST_HEAD_INITIALIZER(all_jobs);
72 /* Start a job running. */
73 struct job *
79 struct job *job;
186 job = xmalloc(sizeof *job);
187 job->state = JOB_RUNNING;
188 job->flags = flags;
191 job->cmd = xstrdup(cmd);
193 job->cmd = cmd_stringify_argv(argc, argv);
194 job->pid = pid;
195 strlcpy(job->tty, tty, sizeof job->tty);
196 job->status = 0;
198 LIST_INSERT_HEAD(&all_jobs, job, entry);
200 job->updatecb = updatecb;
201 job->completecb = completecb;
202 job->freecb = freecb;
203 job->data = data;
207 job->fd = out[0];
209 job->fd = master;
210 setblocking(job->fd, 0);
212 job->event = bufferevent_new(job->fd, job_read_callback,
213 job_write_callback, job_error_callback, job);
214 if (job->event == NULL)
216 bufferevent_enable(job->event, EV_READ|EV_WRITE);
218 log_debug("run job %p: %s, pid %ld", job, job->cmd, (long)job->pid);
219 return (job);
228 /* Take job's file descriptor and free the job. */
230 job_transfer(struct job *job, pid_t *pid, char *tty, size_t ttylen)
232 int fd = job->fd;
234 log_debug("transfer job %p: %s", job, job->cmd);
237 *pid = job->pid;
239 strlcpy(tty, job->tty, ttylen);
241 LIST_REMOVE(job, entry);
242 free(job->cmd);
244 if (job->freecb != NULL && job->data != NULL)
245 job->freecb(job->data);
247 if (job->event != NULL)
248 bufferevent_free(job->event);
250 free(job);
254 /* Kill and free an individual job. */
256 job_free(struct job *job)
258 log_debug("free job %p: %s", job, job->cmd);
260 LIST_REMOVE(job, entry);
261 free(job->cmd);
263 if (job->freecb != NULL && job->data != NULL)
264 job->freecb(job->data);
266 if (job->pid != -1)
267 kill(job->pid, SIGTERM);
268 if (job->event != NULL)
269 bufferevent_free(job->event);
270 if (job->fd != -1)
271 close(job->fd);
273 free(job);
276 /* Resize job. */
278 job_resize(struct job *job, u_int sx, u_int sy)
282 if (job->fd == -1 || (~job->flags & JOB_PTY))
285 log_debug("resize job %p: %ux%u", job, sx, sy);
290 if (ioctl(job->fd, TIOCSWINSZ, &ws) == -1)
298 struct job *job = data;
300 if (job->updatecb != NULL)
301 job->updatecb(job);
312 struct job *job = data;
313 size_t len = EVBUFFER_LENGTH(EVBUFFER_OUTPUT(job->event));
315 log_debug("job write %p: %s, pid %ld, output left %zu", job, job->cmd,
316 (long) job->pid, len);
318 if (len == 0 && (~job->flags & JOB_KEEPWRITE)) {
319 shutdown(job->fd, SHUT_WR);
320 bufferevent_disable(job->event, EV_WRITE);
329 struct job *job = data;
331 log_debug("job error %p: %s, pid %ld", job, job->cmd, (long) job->pid);
333 if (job->state == JOB_DEAD) {
334 if (job->completecb != NULL)
335 job->completecb(job);
336 job_free(job);
338 bufferevent_disable(job->event, EV_READ);
339 job->state = JOB_CLOSED;
347 struct job *job;
349 LIST_FOREACH(job, &all_jobs, entry) {
350 if (pid == job->pid)
353 if (job == NULL)
358 killpg(job->pid, SIGCONT);
361 log_debug("job died %p: %s, pid %ld", job, job->cmd, (long) job->pid);
363 job->status = status;
365 if (job->state == JOB_CLOSED) {
366 if (job->completecb != NULL)
367 job->completecb(job);
368 job_free(job);
370 job->pid = -1;
371 job->state = JOB_DEAD;
375 /* Get job status. */
377 job_get_status(struct job *job)
379 return (job->status);
382 /* Get job data. */
384 job_get_data(struct job *job)
386 return (job->data);
389 /* Get job event. */
391 job_get_event(struct job *job)
393 return (job->event);
400 struct job *job;
402 LIST_FOREACH(job, &all_jobs, entry) {
403 if (job->pid != -1)
404 kill(job->pid, SIGTERM);
412 struct job *job;
414 LIST_FOREACH(job, &all_jobs, entry) {
415 if ((~job->flags & JOB_NOWAIT) && job->state == JOB_RUNNING)
421 /* Print job summary. */
425 struct job *job;
428 LIST_FOREACH(job, &all_jobs, entry) {
434 n, job->cmd, job->fd, (long)job->pid, job->status);