Lines Matching refs:job
33 * Job scheduling. Run queued commands in the background and record their
41 /* A single job. */
42 struct job {
64 LIST_ENTRY(job) entry;
68 static LIST_HEAD(joblist, job) all_jobs = LIST_HEAD_INITIALIZER(all_jobs);
70 /* Start a job running. */
71 struct job *
77 struct job *job;
198 job = xcalloc(1, sizeof *job);
199 job->state = JOB_RUNNING;
200 job->flags = flags;
203 job->cmd = xstrdup(cmd);
205 job->cmd = cmd_stringify_argv(argc, argv);
206 job->pid = pid;
208 strlcpy(job->tty, tty, sizeof job->tty);
209 job->status = 0;
211 LIST_INSERT_HEAD(&all_jobs, job, entry);
213 job->updatecb = updatecb;
214 job->completecb = completecb;
215 job->freecb = freecb;
216 job->data = data;
220 job->fd = out[0];
222 job->fd = master;
223 setblocking(job->fd, 0);
225 job->event = bufferevent_new(job->fd, job_read_callback,
226 job_write_callback, job_error_callback, job);
227 if (job->event == NULL)
229 bufferevent_enable(job->event, EV_READ|EV_WRITE);
231 log_debug("run job %p: %s, pid %ld", job, job->cmd, (long)job->pid);
232 return (job);
241 /* Take job's file descriptor and free the job. */
243 job_transfer(struct job *job, pid_t *pid, char *tty, size_t ttylen)
245 int fd = job->fd;
247 log_debug("transfer job %p: %s", job, job->cmd);
250 *pid = job->pid;
252 strlcpy(tty, job->tty, ttylen);
254 LIST_REMOVE(job, entry);
255 free(job->cmd);
257 if (job->freecb != NULL && job->data != NULL)
258 job->freecb(job->data);
260 if (job->event != NULL)
261 bufferevent_free(job->event);
263 free(job);
267 /* Kill and free an individual job. */
269 job_free(struct job *job)
271 log_debug("free job %p: %s", job, job->cmd);
273 LIST_REMOVE(job, entry);
274 free(job->cmd);
276 if (job->freecb != NULL && job->data != NULL)
277 job->freecb(job->data);
279 if (job->pid != -1)
280 kill(job->pid, SIGTERM);
281 if (job->event != NULL)
282 bufferevent_free(job->event);
283 if (job->fd != -1)
284 close(job->fd);
286 free(job);
289 /* Resize job. */
291 job_resize(struct job *job, u_int sx, u_int sy)
295 if (job->fd == -1 || (~job->flags & JOB_PTY))
298 log_debug("resize job %p: %ux%u", job, sx, sy);
303 if (ioctl(job->fd, TIOCSWINSZ, &ws) == -1)
307 /* Job buffer read callback. */
311 struct job *job = data;
313 if (job->updatecb != NULL)
314 job->updatecb(job);
318 * Job buffer write callback. Fired when the buffer falls below watermark
325 struct job *job = data;
326 size_t len = EVBUFFER_LENGTH(EVBUFFER_OUTPUT(job->event));
328 log_debug("job write %p: %s, pid %ld, output left %zu", job, job->cmd,
329 (long) job->pid, len);
331 if (len == 0 && (~job->flags & JOB_KEEPWRITE)) {
332 shutdown(job->fd, SHUT_WR);
333 bufferevent_disable(job->event, EV_WRITE);
337 /* Job buffer error callback. */
342 struct job *job = data;
344 log_debug("job error %p: %s, pid %ld", job, job->cmd, (long) job->pid);
346 if (job->state == JOB_DEAD) {
347 if (job->completecb != NULL)
348 job->completecb(job);
349 job_free(job);
351 bufferevent_disable(job->event, EV_READ);
352 job->state = JOB_CLOSED;
356 /* Job died (waitpid() returned its pid). */
360 struct job *job;
362 LIST_FOREACH(job, &all_jobs, entry) {
363 if (pid == job->pid)
366 if (job == NULL)
371 killpg(job->pid, SIGCONT);
374 log_debug("job died %p: %s, pid %ld", job, job->cmd, (long) job->pid);
376 job->status = status;
378 if (job->state == JOB_CLOSED) {
379 if (job->completecb != NULL)
380 job->completecb(job);
381 job_free(job);
383 job->pid = -1;
384 job->state = JOB_DEAD;
388 /* Get job status. */
390 job_get_status(struct job *job)
392 return (job->status);
395 /* Get job data. */
397 job_get_data(struct job *job)
399 return (job->data);
402 /* Get job event. */
404 job_get_event(struct job *job)
406 return (job->event);
413 struct job *job;
415 LIST_FOREACH(job, &all_jobs, entry) {
416 if (job->pid != -1)
417 kill(job->pid, SIGTERM);
425 struct job *job;
427 LIST_FOREACH(job, &all_jobs, entry) {
428 if ((~job->flags & JOB_NOWAIT) && job->state == JOB_RUNNING)
434 /* Print job summary. */
438 struct job *job;
441 LIST_FOREACH(job, &all_jobs, entry) {
446 cmdq_print(item, "Job %u: %s [fd=%d, pid=%ld, status=%d]",
447 n, job->cmd, job->fd, (long)job->pid, job->status);