1da2e3ebdSchin /*********************************************************************** 2da2e3ebdSchin * * 3da2e3ebdSchin * This software is part of the ast package * 4*3e14f97fSRoger A. Faulkner * Copyright (c) 1982-2010 AT&T Intellectual Property * 5da2e3ebdSchin * and is licensed under the * 6da2e3ebdSchin * Common Public License, Version 1.0 * 77c2fbfb3SApril Chin * by AT&T Intellectual Property * 8da2e3ebdSchin * * 9da2e3ebdSchin * A copy of the License is available at * 10da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt * 11da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12da2e3ebdSchin * * 13da2e3ebdSchin * Information and Software Systems Research * 14da2e3ebdSchin * AT&T Research * 15da2e3ebdSchin * Florham Park NJ * 16da2e3ebdSchin * * 17da2e3ebdSchin * David Korn <dgk@research.att.com> * 18da2e3ebdSchin * * 19da2e3ebdSchin ***********************************************************************/ 20da2e3ebdSchin #pragma prototyped 21da2e3ebdSchin #ifndef JOB_NFLAG 22da2e3ebdSchin /* 23da2e3ebdSchin * Interface to job control for shell 24da2e3ebdSchin * written by David Korn 25da2e3ebdSchin * 26da2e3ebdSchin */ 27da2e3ebdSchin 28da2e3ebdSchin #define JOBTTY 2 29da2e3ebdSchin 30da2e3ebdSchin #include <ast.h> 31da2e3ebdSchin #include <sfio.h> 32da2e3ebdSchin #ifndef SIGINT 33da2e3ebdSchin # include <signal.h> 34da2e3ebdSchin #endif /* !SIGINT */ 35da2e3ebdSchin #include "FEATURE/options" 36da2e3ebdSchin 37da2e3ebdSchin #undef JOBS 38da2e3ebdSchin #if defined(SIGCLD) && !defined(SIGCHLD) 39da2e3ebdSchin # define SIGCHLD SIGCLD 40da2e3ebdSchin #endif 41da2e3ebdSchin #ifdef SIGCHLD 42da2e3ebdSchin # define JOBS 1 43da2e3ebdSchin # include "terminal.h" 44da2e3ebdSchin # ifdef FIOLOOKLD 45da2e3ebdSchin /* Ninth edition */ 46da2e3ebdSchin extern int tty_ld, ntty_ld; 47da2e3ebdSchin # define OTTYDISC tty_ld 48da2e3ebdSchin # define NTTYDISC ntty_ld 49da2e3ebdSchin # endif /* FIOLOOKLD */ 50da2e3ebdSchin #else 51da2e3ebdSchin # undef SIGTSTP 52da2e3ebdSchin # undef SH_MONITOR 53da2e3ebdSchin # define SH_MONITOR 0 54da2e3ebdSchin # define job_set(x) 55da2e3ebdSchin # define job_reset(x) 56da2e3ebdSchin #endif 57da2e3ebdSchin 58da2e3ebdSchin struct process 59da2e3ebdSchin { 60da2e3ebdSchin struct process *p_nxtjob; /* next job structure */ 61da2e3ebdSchin struct process *p_nxtproc; /* next process in current job */ 62da2e3ebdSchin pid_t p_pid; /* process id */ 63da2e3ebdSchin pid_t p_pgrp; /* process group */ 64da2e3ebdSchin pid_t p_fgrp; /* process group when stopped */ 65da2e3ebdSchin short p_job; /* job number of process */ 66da2e3ebdSchin unsigned short p_exit; /* exit value or signal number */ 677c2fbfb3SApril Chin unsigned short p_exitmin; /* minimum exit value for xargs */ 68da2e3ebdSchin unsigned short p_flag; /* flags - see below */ 69da2e3ebdSchin int p_env; /* subshell environment number */ 70da2e3ebdSchin #ifdef JOBS 71da2e3ebdSchin off_t p_name; /* history file offset for command */ 72da2e3ebdSchin struct termios p_stty; /* terminal state for job */ 73da2e3ebdSchin #endif /* JOBS */ 74da2e3ebdSchin }; 75da2e3ebdSchin 76da2e3ebdSchin struct jobs 77da2e3ebdSchin { 78da2e3ebdSchin struct process *pwlist; /* head of process list */ 79da2e3ebdSchin pid_t curpgid; /* current process gid id */ 80da2e3ebdSchin pid_t parent; /* set by fork() */ 81da2e3ebdSchin pid_t mypid; /* process id of shell */ 82da2e3ebdSchin pid_t mypgid; /* process group id of shell */ 83da2e3ebdSchin pid_t mytgid; /* terminal group id of shell */ 84da2e3ebdSchin unsigned int in_critical; /* >0 => in critical region */ 85da2e3ebdSchin int savesig; /* active signal */ 86da2e3ebdSchin int numpost; /* number of posted jobs */ 8734f9b3eeSRoland Mainz #ifdef SHOPT_BGX 8834f9b3eeSRoland Mainz int numbjob; /* number of background jobs */ 8934f9b3eeSRoland Mainz #endif /* SHOPT_BGX */ 90da2e3ebdSchin short fd; /* tty descriptor number */ 91da2e3ebdSchin #ifdef JOBS 92da2e3ebdSchin int suspend; /* suspend character */ 93da2e3ebdSchin int linedisc; /* line dicipline */ 94da2e3ebdSchin #endif /* JOBS */ 95da2e3ebdSchin char jobcontrol; /* turned on for real job control */ 96da2e3ebdSchin char waitsafe; /* wait will not block */ 97da2e3ebdSchin char waitall; /* wait for all jobs in pipe */ 98da2e3ebdSchin char toclear; /* job table needs clearing */ 99da2e3ebdSchin unsigned char *freejobs; /* free jobs numbers */ 100da2e3ebdSchin }; 101da2e3ebdSchin 102da2e3ebdSchin /* flags for joblist */ 103da2e3ebdSchin #define JOB_LFLAG 1 104da2e3ebdSchin #define JOB_NFLAG 2 105da2e3ebdSchin #define JOB_PFLAG 4 106da2e3ebdSchin #define JOB_NLFLAG 8 107da2e3ebdSchin 108da2e3ebdSchin extern struct jobs job; 109da2e3ebdSchin 110da2e3ebdSchin #ifdef JOBS 111da2e3ebdSchin 1127c2fbfb3SApril Chin #if !_std_malloc 1137c2fbfb3SApril Chin #include <vmalloc.h> 1147c2fbfb3SApril Chin #if VMALLOC_VERSION >= 20070911L 1157c2fbfb3SApril Chin #define vmbusy() (vmstat(0,0)!=0) 1167c2fbfb3SApril Chin #endif 1177c2fbfb3SApril Chin #endif 1187c2fbfb3SApril Chin #ifndef vmbusy 1197c2fbfb3SApril Chin #define vmbusy() 0 1207c2fbfb3SApril Chin #endif 1217c2fbfb3SApril Chin 122da2e3ebdSchin #define job_lock() (job.in_critical++) 12334f9b3eeSRoland Mainz #define job_unlock() \ 12434f9b3eeSRoland Mainz do { \ 12534f9b3eeSRoland Mainz int sig; \ 12634f9b3eeSRoland Mainz if (!--job.in_critical && (sig = job.savesig)) \ 12734f9b3eeSRoland Mainz { \ 12834f9b3eeSRoland Mainz if (!job.in_critical++ && !vmbusy()) \ 12934f9b3eeSRoland Mainz job_reap(sig); \ 13034f9b3eeSRoland Mainz job.in_critical--; \ 13134f9b3eeSRoland Mainz } \ 13234f9b3eeSRoland Mainz } while(0) 133da2e3ebdSchin 134da2e3ebdSchin extern const char e_jobusage[]; 135da2e3ebdSchin extern const char e_done[]; 136da2e3ebdSchin extern const char e_running[]; 137da2e3ebdSchin extern const char e_coredump[]; 138da2e3ebdSchin extern const char e_no_proc[]; 139da2e3ebdSchin extern const char e_no_job[]; 140da2e3ebdSchin extern const char e_jobsrunning[]; 141da2e3ebdSchin extern const char e_nlspace[]; 142da2e3ebdSchin extern const char e_access[]; 143da2e3ebdSchin extern const char e_terminate[]; 144da2e3ebdSchin extern const char e_no_jctl[]; 145da2e3ebdSchin extern const char e_signo[]; 146da2e3ebdSchin #ifdef SIGTSTP 147da2e3ebdSchin extern const char e_no_start[]; 148da2e3ebdSchin #endif /* SIGTSTP */ 149da2e3ebdSchin #ifdef NTTYDISC 150da2e3ebdSchin extern const char e_newtty[]; 151da2e3ebdSchin extern const char e_oldtty[]; 152da2e3ebdSchin #endif /* NTTYDISC */ 153da2e3ebdSchin #endif /* JOBS */ 154da2e3ebdSchin 155da2e3ebdSchin /* 156da2e3ebdSchin * The following are defined in jobs.c 157da2e3ebdSchin */ 158da2e3ebdSchin 159da2e3ebdSchin extern void job_clear(void); 160da2e3ebdSchin extern void job_bwait(char**); 161da2e3ebdSchin extern int job_walk(Sfio_t*,int(*)(struct process*,int),int,char*[]); 162da2e3ebdSchin extern int job_kill(struct process*,int); 1637c2fbfb3SApril Chin extern int job_wait(pid_t); 164da2e3ebdSchin extern int job_post(pid_t,pid_t); 165da2e3ebdSchin extern void *job_subsave(void); 166da2e3ebdSchin extern void job_subrestore(void*); 16734f9b3eeSRoland Mainz #ifdef SHOPT_BGX 16834f9b3eeSRoland Mainz extern void job_chldtrap(Shell_t*, const char*,int); 16934f9b3eeSRoland Mainz #endif /* SHOPT_BGX */ 170da2e3ebdSchin #ifdef JOBS 1717c2fbfb3SApril Chin extern void job_init(Shell_t*,int); 1727c2fbfb3SApril Chin extern int job_close(Shell_t*); 173da2e3ebdSchin extern int job_list(struct process*,int); 174da2e3ebdSchin extern int job_terminate(struct process*,int); 175da2e3ebdSchin extern int job_switch(struct process*,int); 176da2e3ebdSchin extern void job_fork(pid_t); 177da2e3ebdSchin extern int job_reap(int); 178da2e3ebdSchin #else 1797c2fbfb3SApril Chin # define job_init(s,flag) 1807c2fbfb3SApril Chin # define job_close(s) (0) 181da2e3ebdSchin # define job_fork(p) 182da2e3ebdSchin #endif /* JOBS */ 183da2e3ebdSchin 184da2e3ebdSchin 185da2e3ebdSchin #endif /* !JOB_NFLAG */ 186