/* Yash: yet another shell */
/* job.h: job control */
/* (C) 2007-2011 magicant */
/* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see . */
#ifndef YASH_JOB_H
#define YASH_JOB_H
#include
/* status of job/process */
typedef enum jobstatus_T {
JS_RUNNING, JS_STOPPED, JS_DONE,
} jobstatus_T;
/* info about a process in a job */
typedef struct process_T {
pid_t pr_pid; /* process ID */
jobstatus_T pr_status;
int pr_statuscode;
wchar_t *pr_name; /* process name made from command line */
} process_T;
/* If `pr_pid' is 0, the process was finished without `fork'ing from the shell.
* In this case, `pr_status' is JS_DONE and `pr_statuscode' is the exit status.
* If `pr_pid' is a positive number, it's the process ID. In this case,
* `pr_statuscode' is the status code returned by `waitpid'. */
/* info about a job */
typedef struct job_T {
pid_t j_pgid; /* process group ID */
jobstatus_T j_status;
_Bool j_statuschanged; /* job's status not yet reported? */
_Bool j_legacy; /* not a true child of the shell? */
_Bool j_nonotify; /* suppress printing job status? */
size_t j_pcount; /* # of processes in `j_procs' */
process_T j_procs[]; /* info about processes */
} job_T;
/* When job control is off, `j_pgid' is 0 since the job shares the process group
* ID with the shell.
* In subshells, the `j_legacy' flag is set to indicate that the job is not
* a direct child of the current shell process. */
/* job number of the active job */
#define ACTIVE_JOBNO 0
/* When a process is stopped/terminated by a signal, this value is added to the
* signal number to make the value of the exit status.
* 128 in bash/zsh/dash/pdksh/mksh/posh, 256 in ksh. */
#ifndef TERMSIGOFFSET
#define TERMSIGOFFSET 384
#endif
extern void init_job(void);
extern void set_active_job(job_T *job)
__attribute__((nonnull));
extern void add_job(_Bool current);
extern void remove_job(size_t jobnumber);
extern void remove_job_nofitying_signal(size_t jobnumber);
extern void remove_all_jobs(void);
extern void neglect_all_jobs(void);
extern size_t job_count(void)
__attribute__((pure));
extern size_t stopped_job_count(void)
__attribute__((pure));
extern void do_wait(void);
extern int wait_for_job(size_t jobnumber, _Bool return_on_stop,
_Bool interruptible, _Bool return_on_trap);
extern wchar_t **wait_for_child(pid_t cpid, pid_t cpgid, _Bool return_on_stop);
extern pid_t get_job_pgid(const wchar_t *jobname)
__attribute__((pure));
extern void put_foreground(pid_t pgrp);
extern void ensure_foreground(void);
extern int calc_status_of_job(const job_T *job)
__attribute__((pure,nonnull));
extern void print_job_status_all(void);
extern void notify_signaled_job(size_t jobnumber);
extern int jobs_builtin(int argc, void **argv)
__attribute__((nonnull));
extern int fg_builtin(int argc, void **argv)
__attribute__((nonnull));
extern int wait_builtin(int argc, void **argv)
__attribute__((nonnull));
extern int disown_builtin(int argc, void **argv)
__attribute__((nonnull));
extern const char *jobs_help[], *fg_help[], *bg_help[], *wait_help[],
*disown_help[];
#endif /* YASH_JOB_H */
/* vim: set ts=8 sts=4 sw=4 noet tw=80: */