commit bash-20050127 snapshot
[platform/upstream/bash.git] / jobs.c
1 /* The thing that makes children, remembers them, and contains wait loops. */
2
3 /* This file works with both POSIX and BSD systems.  It implements job
4    control. */
5
6 /* Copyright (C) 1989-2005 Free Software Foundation, Inc.
7
8    This file is part of GNU Bash, the Bourne Again SHell.
9
10    Bash is free software; you can redistribute it and/or modify it under
11    the terms of the GNU General Public License as published by the Free
12    Software Foundation; either version 2, or (at your option) any later
13    version.
14
15    Bash is distributed in the hope that it will be useful, but WITHOUT ANY
16    WARRANTY; without even the implied warranty of MERCHANTABILITY or
17    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18    for more details.
19
20    You should have received a copy of the GNU General Public License along
21    with Bash; see the file COPYING.  If not, write to the Free Software
22    Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
23
24 #include "config.h"
25
26 #include "bashtypes.h"
27 #include "trap.h"
28 #include <stdio.h>
29 #include <signal.h>
30 #include <errno.h>
31
32 #if defined (HAVE_UNISTD_H)
33 #  include <unistd.h>
34 #endif
35
36 #include "posixtime.h"
37
38 #if defined (HAVE_SYS_RESOURCE_H) && defined (HAVE_WAIT3) && !defined (_POSIX_VERSION) && !defined (RLIMTYPE)
39 #  include <sys/resource.h>
40 #endif /* !_POSIX_VERSION && HAVE_SYS_RESOURCE_H && HAVE_WAIT3 && !RLIMTYPE */
41
42 #if defined (HAVE_SYS_FILE_H)
43 #  include <sys/file.h>
44 #endif
45
46 #include "filecntl.h"
47 #include <sys/ioctl.h>
48 #include <sys/param.h>
49
50 #if defined (BUFFERED_INPUT)
51 #  include "input.h"
52 #endif
53
54 /* Need to include this up here for *_TTY_DRIVER definitions. */
55 #include "shtty.h"
56
57 /* Define this if your output is getting swallowed.  It's a no-op on
58    machines with the termio or termios tty drivers. */
59 /* #define DRAIN_OUTPUT */
60
61 /* For the TIOCGPGRP and TIOCSPGRP ioctl parameters on HP-UX */
62 #if defined (hpux) && !defined (TERMIOS_TTY_DRIVER)
63 #  include <bsdtty.h>
64 #endif /* hpux && !TERMIOS_TTY_DRIVER */
65
66 #if !defined (STRUCT_WINSIZE_IN_SYS_IOCTL)
67 /* For struct winsize on SCO */
68 /*   sys/ptem.h has winsize but needs mblk_t from sys/stream.h */
69 #  if defined (HAVE_SYS_PTEM_H) && defined (TIOCGWINSZ) && defined (SIGWINCH)
70 #    if defined (HAVE_SYS_STREAM_H)
71 #      include <sys/stream.h>
72 #    endif
73 #    include <sys/ptem.h>
74 #  endif /* HAVE_SYS_PTEM_H && TIOCGWINSZ && SIGWINCH */
75 #endif /* !STRUCT_WINSIZE_IN_SYS_IOCTL */
76
77 #include "bashansi.h"
78 #include "bashintl.h"
79 #include "shell.h"
80 #include "jobs.h"
81 #include "flags.h"
82
83 #include "builtins/builtext.h"
84 #include "builtins/common.h"
85
86 #if !defined (errno)
87 extern int errno;
88 #endif /* !errno */
89
90 #define DEFAULT_CHILD_MAX 32
91 #define MAX_JOBS_IN_ARRAY 4096          /* testing */
92
93 /* Take care of system dependencies that must be handled when waiting for
94    children.  The arguments to the WAITPID macro match those to the Posix.1
95    waitpid() function. */
96
97 #if defined (ultrix) && defined (mips) && defined (_POSIX_VERSION)
98 #  define WAITPID(pid, statusp, options) \
99         wait3 ((union wait *)statusp, options, (struct rusage *)0)
100 #else
101 #  if defined (_POSIX_VERSION) || defined (HAVE_WAITPID)
102 #    define WAITPID(pid, statusp, options) \
103         waitpid ((pid_t)pid, statusp, options)
104 #  else
105 #    if defined (HAVE_WAIT3)
106 #      define WAITPID(pid, statusp, options) \
107         wait3 (statusp, options, (struct rusage *)0)
108 #    else
109 #      define WAITPID(pid, statusp, options) \
110         wait3 (statusp, options, (int *)0)
111 #    endif /* HAVE_WAIT3 */
112 #  endif /* !_POSIX_VERSION && !HAVE_WAITPID*/
113 #endif /* !(Ultrix && mips && _POSIX_VERSION) */
114
115 /* getpgrp () varies between systems.  Even systems that claim to be
116    Posix.1 compatible lie sometimes (Ultrix, SunOS4, apollo). */
117 #if defined (GETPGRP_VOID)
118 #  define getpgid(p) getpgrp ()
119 #else
120 #  define getpgid(p) getpgrp (p)
121 #endif /* !GETPGRP_VOID */
122
123 /* If the system needs it, REINSTALL_SIGCHLD_HANDLER will reinstall the
124    handler for SIGCHLD. */
125 #if defined (MUST_REINSTALL_SIGHANDLERS)
126 #  define REINSTALL_SIGCHLD_HANDLER signal (SIGCHLD, sigchld_handler)
127 #else
128 #  define REINSTALL_SIGCHLD_HANDLER
129 #endif /* !MUST_REINSTALL_SIGHANDLERS */
130
131 /* Some systems let waitpid(2) tell callers about stopped children. */
132 #if !defined (WCONTINUED) || defined (WCONTINUED_BROKEN)
133 #  undef WCONTINUED
134 #  define WCONTINUED 0
135 #endif
136 #if !defined (WIFCONTINUED)
137 #  define WIFCONTINUED(s)       (0)
138 #endif
139
140 /* The number of additional slots to allocate when we run out. */
141 #define JOB_SLOTS 8
142
143 typedef int sh_job_map_func_t __P((JOB *, int, int, int));
144
145 #if defined (READLINE)
146 extern void rl_set_screen_size __P((int, int));
147 #endif
148
149 /* Variables used here but defined in other files. */
150 extern int subshell_environment, line_number;
151 extern int posixly_correct, shell_level;
152 extern int interrupt_immediately;
153 extern int last_command_exit_value, last_command_exit_signal;
154 extern int loop_level, breaking;
155 extern int sourcelevel;
156 extern sh_builtin_func_t *this_shell_builtin;
157 extern char *shell_name, *this_command_name;
158 extern sigset_t top_level_mask;
159 extern procenv_t wait_intr_buf;
160 extern int wait_signal_received;
161 extern WORD_LIST *subst_assign_varlist;
162
163 struct jobstats js = { -1L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NO_JOB, NO_JOB };
164
165 /* The array of known jobs. */
166 JOB **jobs = (JOB **)NULL;
167
168 #if 0
169 /* The number of slots currently allocated to JOBS. */
170 int job_slots = 0;
171 #endif
172
173 /* The controlling tty for this shell. */
174 int shell_tty = -1;
175
176 /* The shell's process group. */
177 pid_t shell_pgrp = NO_PID;
178
179 /* The terminal's process group. */
180 pid_t terminal_pgrp = NO_PID;
181
182 /* The process group of the shell's parent. */
183 pid_t original_pgrp = NO_PID;
184
185 /* The process group of the pipeline currently being made. */
186 pid_t pipeline_pgrp = (pid_t)0;
187
188 #if defined (PGRP_PIPE)
189 /* Pipes which each shell uses to communicate with the process group leader
190    until all of the processes in a pipeline have been started.  Then the
191    process leader is allowed to continue. */
192 int pgrp_pipe[2] = { -1, -1 };
193 #endif
194
195 #if 0
196 /* The job which is current; i.e. the one that `%+' stands for. */
197 int current_job = NO_JOB;
198
199 /* The previous job; i.e. the one that `%-' stands for. */
200 int previous_job = NO_JOB;
201 #endif
202
203 /* Last child made by the shell.  */
204 pid_t last_made_pid = NO_PID;
205
206 /* Pid of the last asynchronous child. */
207 pid_t last_asynchronous_pid = NO_PID;
208
209 /* The pipeline currently being built. */
210 PROCESS *the_pipeline = (PROCESS *)NULL;
211
212 /* If this is non-zero, do job control. */
213 int job_control = 1;
214
215 /* Call this when you start making children. */
216 int already_making_children = 0;
217
218 /* If this is non-zero, $LINES and $COLUMNS are reset after every process
219    exits from get_tty_state(). */
220 int check_window_size;
221
222 /* Functions local to this file. */
223
224 static void get_new_window_size __P((int));
225
226 static void run_sigchld_trap __P((int));
227
228 static sighandler wait_sigint_handler __P((int));
229 static sighandler sigchld_handler __P((int));
230 static sighandler sigwinch_sighandler __P((int));
231 static sighandler sigcont_sighandler __P((int));
232 static sighandler sigstop_sighandler __P((int));
233
234 static int waitchld __P((pid_t, int));
235
236 static PROCESS *find_pipeline __P((pid_t, int, int *));
237
238 static char *current_working_directory __P((void));
239 static char *job_working_directory __P((void));
240 static char *j_strsignal __P((int));
241 static char *printable_job_status __P((int, PROCESS *, int));
242
243 static pid_t find_last_pid __P((int, int));
244
245 static int set_new_line_discipline __P((int));
246 static int map_over_jobs __P((sh_job_map_func_t *, int, int));
247 static int job_last_stopped __P((int));
248 static int job_last_running __P((int));
249 static int most_recent_job_in_state __P((int, JOB_STATE));
250 static int find_job __P((pid_t, int));
251 static int print_job __P((JOB *, int, int, int));
252 static int process_exit_status __P((WAIT));
253 static int process_exit_signal __P((WAIT));
254 static int job_exit_status __P((int));
255 static int job_exit_signal __P((int));
256 static int set_job_status_and_cleanup __P((int));
257
258 static WAIT raw_job_exit_status __P((int));
259
260 static void notify_of_job_status __P((void));
261 static void reset_job_indices __P((void));
262 static void cleanup_dead_jobs __P((void));
263 static int processes_in_job __P((int));
264 static void realloc_jobs_list __P((void));
265 static int compact_jobs_list __P((int));
266 static int discard_pipeline __P((PROCESS *));
267 static void add_process __P((char *, pid_t));
268 static void print_pipeline __P((PROCESS *, int, int, FILE *));
269 static void pretty_print_job __P((int, int, FILE *));
270 static void set_current_job __P((int));
271 static void reset_current __P((void));
272 static void set_job_running __P((int));
273 static void setjstatus __P((int));
274 static void mark_all_jobs_as_dead __P((void));
275 static void mark_dead_jobs_as_notified __P((int));
276 static void restore_sigint_handler __P((void));
277 #if defined (PGRP_PIPE)
278 static void pipe_read __P((int *));
279 static void pipe_close __P((int *));
280 #endif
281
282 #if defined (ARRAY_VARS)
283 static int *pstatuses;          /* list of pipeline statuses */
284 static int statsize;
285 #endif
286
287 /* Used to synchronize between wait_for and other functions and the SIGCHLD
288    signal handler. */
289 static int sigchld;
290 static int queue_sigchld;
291
292 #define QUEUE_SIGCHLD(os)       (os) = sigchld, queue_sigchld++
293
294 #define UNQUEUE_SIGCHLD(os) \
295         do { \
296           queue_sigchld--; \
297           if (queue_sigchld == 0 && os != sigchld) \
298             waitchld (-1, 0); \
299         } while (0)
300
301 static SigHandler *old_tstp, *old_ttou, *old_ttin;
302 static SigHandler *old_cont = (SigHandler *)SIG_DFL;
303
304 #if defined (TIOCGWINSZ) && defined (SIGWINCH)
305 static SigHandler *old_winch = (SigHandler *)SIG_DFL;
306 #endif
307
308 /* A place to temporarily save the current pipeline. */
309 static PROCESS *saved_pipeline;
310 static int saved_already_making_children;
311
312 /* Set this to non-zero whenever you don't want the jobs list to change at
313    all: no jobs deleted and no status change notifications.  This is used,
314    for example, when executing SIGCHLD traps, which may run arbitrary
315    commands. */
316 static int jobs_list_frozen;
317
318 static char retcode_name_buffer[64];
319
320 #if !defined (_POSIX_VERSION)
321
322 /* These are definitions to map POSIX 1003.1 functions onto existing BSD
323    library functions and system calls. */
324 #define setpgid(pid, pgrp)      setpgrp (pid, pgrp)
325 #define tcsetpgrp(fd, pgrp)     ioctl ((fd), TIOCSPGRP, &(pgrp))
326
327 pid_t
328 tcgetpgrp (fd)
329      int fd;
330 {
331   pid_t pgrp;
332
333   /* ioctl will handle setting errno correctly. */
334   if (ioctl (fd, TIOCGPGRP, &pgrp) < 0)
335     return (-1);
336   return (pgrp);
337 }
338
339 #endif /* !_POSIX_VERSION */
340
341 /* Return the working directory for the current process.  Unlike
342    job_working_directory, this does not call malloc (), nor do any
343    of the functions it calls.  This is so that it can safely be called
344    from a signal handler. */
345 static char *
346 current_working_directory ()
347 {
348   char *dir;
349   static char d[PATH_MAX];
350
351   dir = get_string_value ("PWD");
352
353   if (dir == 0 && the_current_working_directory && no_symbolic_links)
354     dir = the_current_working_directory;
355
356   if (dir == 0)
357     {
358       dir = getcwd (d, sizeof(d));
359       if (dir)
360         dir = d;
361     }
362
363   return (dir == 0) ? "<unknown>" : dir;
364 }
365
366 /* Return the working directory for the current process. */
367 static char *
368 job_working_directory ()
369 {
370   char *dir;
371
372   dir = get_string_value ("PWD");
373   if (dir)
374     return (savestring (dir));
375
376   dir = get_working_directory ("job-working-directory");
377   if (dir)
378     return (dir);
379
380   return (savestring ("<unknown>"));
381 }
382
383 void
384 making_children ()
385 {
386   if (already_making_children)
387     return;
388
389   already_making_children = 1;
390   start_pipeline ();
391 }
392
393 void
394 stop_making_children ()
395 {
396   already_making_children = 0;
397 }
398
399 void
400 cleanup_the_pipeline ()
401 {
402   if (the_pipeline)
403     {
404       discard_pipeline (the_pipeline);
405       the_pipeline = (PROCESS *)NULL;
406     }
407 }
408
409 void
410 save_pipeline (clear)
411      int clear;
412 {
413   saved_pipeline = the_pipeline;
414   saved_already_making_children = already_making_children;
415   if (clear)
416     the_pipeline = (PROCESS *)NULL;
417 }
418
419 void
420 restore_pipeline (discard)
421      int discard;
422 {
423   PROCESS *old_pipeline;
424
425   old_pipeline = the_pipeline;
426   the_pipeline = saved_pipeline;
427   already_making_children = saved_already_making_children;
428   if (discard)
429     discard_pipeline (old_pipeline);
430 }
431
432 /* Start building a pipeline.  */
433 void
434 start_pipeline ()
435 {
436   if (the_pipeline)
437     {
438       cleanup_the_pipeline ();
439       pipeline_pgrp = 0;
440 #if defined (PGRP_PIPE)
441       pipe_close (pgrp_pipe);
442 #endif
443     }
444
445 #if defined (PGRP_PIPE)
446   if (job_control)
447     {
448       if (pipe (pgrp_pipe) == -1)
449         sys_error ("start_pipeline: pgrp pipe");
450     }
451 #endif
452 }
453
454 /* Stop building a pipeline.  Install the process list in the job array.
455    This returns the index of the newly installed job.
456    DEFERRED is a command structure to be executed upon satisfactory
457    execution exit of this pipeline. */
458 int
459 stop_pipeline (async, deferred)
460      int async;
461      COMMAND *deferred;
462 {
463   register int i, j;
464   JOB *newjob;
465   sigset_t set, oset;
466
467   BLOCK_CHILD (set, oset);
468
469 #if defined (PGRP_PIPE)
470   /* The parent closes the process group synchronization pipe. */
471   pipe_close (pgrp_pipe);
472 #endif
473
474   cleanup_dead_jobs ();
475
476   if (js.j_jobslots == 0)
477     {
478       js.j_jobslots = JOB_SLOTS;
479       jobs = (JOB **)xmalloc (js.j_jobslots * sizeof (JOB *));
480
481       /* Now blank out these new entries. */
482       for (i = 0; i < js.j_jobslots; i++)
483         jobs[i] = (JOB *)NULL;
484
485       js.j_firstj = js.j_lastj = js.j_njobs = 0;
486     }
487
488   /* Scan from the last slot backward, looking for the next free one. */
489   /* XXX - revisit this interactive assumption */
490   /* XXX - this way for now */
491   if (interactive)
492     {
493       for (i = js.j_jobslots; i; i--)
494         if (jobs[i - 1])
495           break;
496     }
497   else
498     {
499 #if 0
500       /* This wraps around, but makes it inconvenient to extend the array */
501       for (i = js.j_lastj+1; i != js.j_lastj; i++)
502         {
503           if (i >= js.j_jobslots)
504             i = 0;
505           if (jobs[i] == 0)
506             break;
507         }       
508       if (i == js.j_lastj)
509         i = js.j_jobslots;
510 #else
511       /* This doesn't wrap around yet. */
512       for (i = js.j_lastj ? js.j_lastj + 1 : js.j_lastj; i < js.j_jobslots; i++)
513         if (jobs[i] == 0)
514           break;
515 #endif
516     }
517
518   /* Do we need more room? */
519
520   /* First try compaction */
521   if ((interactive_shell == 0 || subshell_environment) && i == js.j_jobslots && js.j_jobslots >= MAX_JOBS_IN_ARRAY)
522     i = compact_jobs_list (0);
523
524   /* If we can't compact, reallocate */
525   if (i == js.j_jobslots)
526     {
527       js.j_jobslots += JOB_SLOTS;
528       jobs = (JOB **)xrealloc (jobs, (js.j_jobslots * sizeof (JOB *)));
529
530       for (j = i; j < js.j_jobslots; j++)
531         jobs[j] = (JOB *)NULL;
532     }
533
534   /* Add the current pipeline to the job list. */
535   if (the_pipeline)
536     {
537       register PROCESS *p;
538       int any_alive, any_stopped, n;
539
540       newjob = (JOB *)xmalloc (sizeof (JOB));
541
542       for (n = 1, p = the_pipeline; p->next != the_pipeline; n++, p = p->next)
543         ;
544       p->next = (PROCESS *)NULL;
545       newjob->pipe = REVERSE_LIST (the_pipeline, PROCESS *);
546       for (p = newjob->pipe; p->next; p = p->next)
547         ;
548       p->next = newjob->pipe;
549
550       the_pipeline = (PROCESS *)NULL;
551       newjob->pgrp = pipeline_pgrp;
552       pipeline_pgrp = 0;
553
554       newjob->flags = 0;
555
556       /* Flag to see if in another pgrp. */
557       if (job_control)
558         newjob->flags |= J_JOBCONTROL;
559
560       /* Set the state of this pipeline. */
561       p = newjob->pipe;
562       any_alive = any_stopped = 0;
563       do
564         {
565           any_alive |= p->running;
566           any_stopped |= WIFSTOPPED (p->status);
567           p = p->next;
568         }
569       while (p != newjob->pipe);
570
571       newjob->state = any_alive ? JRUNNING : (any_stopped ? JSTOPPED : JDEAD);
572       newjob->wd = job_working_directory ();
573       newjob->deferred = deferred;
574
575       newjob->j_cleanup = (sh_vptrfunc_t *)NULL;
576       newjob->cleanarg = (PTR_T) NULL;
577
578       jobs[i] = newjob;
579       if (newjob->state == JDEAD && (newjob->flags & J_FOREGROUND))
580         setjstatus (i);
581       if (newjob->state == JDEAD)
582         {
583           js.c_reaped += n;     /* wouldn't have been done since this was not part of a job */
584           js.j_ndead++;
585         }
586       js.c_injobs += n;
587
588       js.j_lastj = i;
589       js.j_njobs++;
590     }
591   else
592     newjob = (JOB *)NULL;
593
594   if (async)
595     {
596       if (newjob)
597         newjob->flags &= ~J_FOREGROUND;
598       reset_current ();
599     }
600   else
601     {
602       if (newjob)
603         {
604           newjob->flags |= J_FOREGROUND;
605           /*
606            *            !!!!! NOTE !!!!!  (chet@ins.cwru.edu)
607            *
608            * The currently-accepted job control wisdom says to set the
609            * terminal's process group n+1 times in an n-step pipeline:
610            * once in the parent and once in each child.  This is where
611            * the parent gives it away.
612            *
613            */
614           if (job_control && newjob->pgrp)
615             give_terminal_to (newjob->pgrp, 0);
616         }
617     }
618
619   stop_making_children ();
620   UNBLOCK_CHILD (oset);
621   return (js.j_current);
622 }
623
624 /* Reset the values of js.j_lastj and js.j_firstj after one or both have
625    been deleted.  The caller should check whether js.j_njobs is 0 before
626    calling this. */
627 static void
628 reset_job_indices ()
629 {
630   int old;
631
632   if (jobs[js.j_firstj] == 0)
633     {
634       old = js.j_firstj++;
635       while (js.j_firstj != old)
636         {
637           if (js.j_firstj >= js.j_jobslots)
638             js.j_firstj = 0;
639           if (jobs[js.j_firstj])
640             break;
641           js.j_firstj++;
642         }
643       if (js.j_firstj == old)
644         js.j_firstj = js.j_lastj = js.j_njobs = 0;
645     }
646   if (jobs[js.j_lastj] == 0)
647     {
648       old = js.j_lastj--;
649       while (js.j_lastj != old)
650         {
651           if (js.j_lastj < 0)
652             js.j_lastj = js.j_jobslots - 1;
653           if (jobs[js.j_lastj])
654             break;
655           js.j_lastj--;
656         }
657       if (js.j_lastj == old)
658         js.j_firstj = js.j_lastj = js.j_njobs = 0;
659     }
660 }
661       
662 /* Delete all DEAD jobs that the user had received notification about. */
663 static void
664 cleanup_dead_jobs ()
665 {
666   register int i;
667   int os;
668
669   if (js.j_jobslots == 0 || jobs_list_frozen)
670     return;
671
672   QUEUE_SIGCHLD(os);
673
674   /* XXX could use js.j_firstj here */
675   for (i = 0; i < js.j_jobslots; i++)
676 {
677 if (i < js.j_firstj && jobs[i])
678   itrace("cleanup_dead_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
679
680     if (jobs[i] && DEADJOB (i) && IS_NOTIFIED (i))
681       delete_job (i, 0);
682 }
683   UNQUEUE_SIGCHLD(os);
684 }
685
686 static int
687 processes_in_job (job)
688 {
689   int nproc;
690   register PROCESS *p;
691
692   nproc = 0;
693   p = jobs[job]->pipe;
694   do
695     {
696       p = p->next;
697       nproc++;
698     }
699   while (p != jobs[job]->pipe);
700
701   return nproc;
702 }
703
704 /* Reallocate and compress the jobs list.  This returns with a jobs array
705    whose size is a multiple of JOB_SLOTS and can hold the current number of
706    jobs.  Heuristics are used to minimize the number of new reallocs. */
707 static void
708 realloc_jobs_list ()
709 {
710   sigset_t set, oset;
711   int nsize, i, j;
712   JOB **nlist;
713
714   nsize = ((js.j_njobs + JOB_SLOTS - 1) / JOB_SLOTS);
715   nsize *= JOB_SLOTS;
716   i = js.j_njobs % JOB_SLOTS;
717   if (i == 0 || i > (JOB_SLOTS >> 1))
718     nsize += JOB_SLOTS;
719
720   BLOCK_CHILD (set, oset);
721   nlist = (JOB **) xmalloc (nsize * sizeof (JOB *));
722   for (i = j = 0; i < js.j_jobslots; i++)
723     if (jobs[i])
724       nlist[j++] = jobs[i];
725
726   js.j_firstj = 0;
727   js.j_lastj = (j > 0) ? j - 1: 0;
728   js.j_jobslots = nsize;
729
730   free (jobs);
731   jobs = nlist;
732
733   UNBLOCK_CHILD (oset);
734 }
735
736 /* Compact the jobs list by removing dead jobs.  Assumed that we have filled
737    the jobs array to some predefined maximum.  Called when the shell is not
738    the foreground process (subshell_environment != 0).  Returns the first
739    available slot in the compacted list.  If that value is js.j_jobslots, then
740    the list needs to be reallocated.  The jobs array is in new memory if
741    this returns > 0 and < js.j_jobslots.  FLAGS is reserved for future use. */
742 static int
743 compact_jobs_list (flags)
744      int flags;
745 {
746   if (js.j_jobslots == 0 || jobs_list_frozen)
747     return js.j_jobslots;
748
749   reap_dead_jobs ();
750   realloc_jobs_list ();
751
752   return (js.j_lastj);
753 }
754
755 /* Delete the job at INDEX from the job list.  Must be called
756    with SIGCHLD blocked. */
757 void
758 delete_job (job_index, warn_stopped)
759      int job_index, warn_stopped;
760 {
761   register JOB *temp;
762   int ndel;
763
764   if (js.j_jobslots == 0 || jobs_list_frozen)
765     return;
766
767   if (warn_stopped && subshell_environment == 0 && STOPPED (job_index))
768     internal_warning (_("deleting stopped job %d with process group %ld"), job_index+1, (long)jobs[job_index]->pgrp);
769
770   temp = jobs[job_index];
771   if (job_index == js.j_current || job_index == js.j_previous)
772     reset_current ();
773
774   jobs[job_index] = (JOB *)NULL;
775
776   free (temp->wd);
777   ndel = discard_pipeline (temp->pipe);
778
779   js.c_injobs -= ndel;
780   if (temp->state == JDEAD)
781     {
782       js.c_reaped -= ndel;
783 if (js.c_reaped < 0)
784   itrace("delete_job (%d): js.c_reaped (%d) < 0 ndel = %d", job_index, js.c_reaped, ndel);
785       js.j_ndead--;
786     }
787
788   if (temp->deferred)
789     dispose_command (temp->deferred);
790
791   free (temp);
792
793   js.j_njobs--;
794   if (js.j_njobs == 0)
795     js.j_firstj = js.j_lastj = 0;
796   else if (jobs[js.j_firstj] == 0 || jobs[js.j_lastj] == 0)
797     reset_job_indices ();
798 }
799
800 /* Must be called with SIGCHLD blocked. */
801 void
802 nohup_job (job_index)
803      int job_index;
804 {
805   register JOB *temp;
806
807   if (js.j_jobslots == 0)
808     return;
809
810   if (temp = jobs[job_index])
811     temp->flags |= J_NOHUP;
812 }
813
814 /* Get rid of the data structure associated with a process chain. */
815 static int
816 discard_pipeline (chain)
817      register PROCESS *chain;
818 {
819   register PROCESS *this, *next;
820   int n;
821
822   this = chain;
823   n = 0;
824   do
825     {
826       next = this->next;
827       FREE (this->command);
828       free (this);
829       n++;
830       this = next;
831     }
832   while (this != chain);
833
834   return n;
835 }
836
837 /* Add this process to the chain being built in the_pipeline.
838    NAME is the command string that will be exec'ed later.
839    PID is the process id of the child. */
840 static void
841 add_process (name, pid)
842      char *name;
843      pid_t pid;
844 {
845   PROCESS *t, *p;
846
847   t = (PROCESS *)xmalloc (sizeof (PROCESS));
848   t->next = the_pipeline;
849   t->pid = pid;
850   WSTATUS (t->status) = 0;
851   t->running = PS_RUNNING;
852   t->command = name;
853   the_pipeline = t;
854
855   if (t->next == 0)
856     t->next = t;
857   else
858     {
859       p = t->next;
860       while (p->next != t->next)
861         p = p->next;
862       p->next = t;
863     }
864 }
865
866 #if 0
867 /* Take the last job and make it the first job.  Must be called with
868    SIGCHLD blocked. */
869 int
870 rotate_the_pipeline ()
871 {
872   PROCESS *p;
873
874   if (the_pipeline->next == the_pipeline)
875     return;
876   for (p = the_pipeline; p->next != the_pipeline; p = p->next)
877     ;
878   the_pipeline = p;
879 }
880
881 /* Reverse the order of the processes in the_pipeline.  Must be called with
882    SIGCHLD blocked. */
883 int
884 reverse_the_pipeline ()
885 {
886   PROCESS *p, *n;
887
888   if (the_pipeline->next == the_pipeline)
889     return;
890
891   for (p = the_pipeline; p->next != the_pipeline; p = p->next)
892     ;
893   p->next = (PROCESS *)NULL;
894
895   n = REVERSE_LIST (the_pipeline, PROCESS *);
896
897   the_pipeline = n;
898   for (p = the_pipeline; p->next; p = p->next)
899     ;
900   p->next = the_pipeline;
901 }
902 #endif
903
904 /* Map FUNC over the list of jobs.  If FUNC returns non-zero,
905    then it is time to stop mapping, and that is the return value
906    for map_over_jobs.  FUNC is called with a JOB, arg1, arg2,
907    and INDEX. */
908 static int
909 map_over_jobs (func, arg1, arg2)
910      sh_job_map_func_t *func;
911      int arg1, arg2;
912 {
913   register int i;
914   int result;
915   sigset_t set, oset;
916
917   if (js.j_jobslots == 0)
918     return 0;
919
920   BLOCK_CHILD (set, oset);
921
922   /* XXX could use js.j_firstj here */
923   for (i = result = 0; i < js.j_jobslots; i++)
924     {
925 if (i < js.j_firstj && jobs[i])
926   itrace("map_over_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
927       if (jobs[i])
928         {
929           result = (*func)(jobs[i], arg1, arg2, i);
930           if (result)
931             break;
932         }
933     }
934
935   UNBLOCK_CHILD (oset);
936
937   return (result);
938 }
939
940 /* Cause all the jobs in the current pipeline to exit. */
941 void
942 terminate_current_pipeline ()
943 {
944   if (pipeline_pgrp && pipeline_pgrp != shell_pgrp)
945     {
946       killpg (pipeline_pgrp, SIGTERM);
947       killpg (pipeline_pgrp, SIGCONT);
948     }
949 }
950
951 /* Cause all stopped jobs to exit. */
952 void
953 terminate_stopped_jobs ()
954 {
955   register int i;
956
957   /* XXX could use js.j_firstj here */
958   for (i = 0; i < js.j_jobslots; i++)
959     {
960       if (jobs[i] && STOPPED (i))
961         {
962           killpg (jobs[i]->pgrp, SIGTERM);
963           killpg (jobs[i]->pgrp, SIGCONT);
964         }
965     }
966 }
967
968 /* Cause all jobs, running or stopped, to receive a hangup signal.  If
969    a job is marked J_NOHUP, don't send the SIGHUP. */
970 void
971 hangup_all_jobs ()
972 {
973   register int i;
974
975   /* XXX could use js.j_firstj here */
976   for (i = 0; i < js.j_jobslots; i++)
977     {
978       if (jobs[i])
979         {
980           if  ((jobs[i]->flags & J_NOHUP) == 0)
981             killpg (jobs[i]->pgrp, SIGHUP);
982           if (STOPPED (i))
983             killpg (jobs[i]->pgrp, SIGCONT);
984         }
985     }
986 }
987
988 void
989 kill_current_pipeline ()
990 {
991   stop_making_children ();
992   start_pipeline ();
993 }
994
995 /* Return the pipeline that PID belongs to.  Note that the pipeline
996    doesn't have to belong to a job.  Must be called with SIGCHLD blocked. */
997 static PROCESS *
998 find_pipeline (pid, running_only, jobp)
999      pid_t pid;
1000      int running_only;
1001      int *jobp;         /* index into jobs list or NO_JOB */
1002 {
1003   int job;
1004   register PROCESS *p;
1005
1006   /* See if this process is in the pipeline that we are building. */
1007   if (jobp)
1008     *jobp = NO_JOB;
1009   if (the_pipeline)
1010     {
1011       p = the_pipeline;
1012       do
1013         {
1014           /* Return it if we found it. */
1015           if (p->pid == pid)
1016             {
1017               if ((running_only && PALIVE(p)) || (running_only == 0))
1018                 return (p);
1019             }
1020
1021           p = p->next;
1022         }
1023       while (p != the_pipeline);
1024     }
1025
1026   job = find_job (pid, running_only);
1027   if (jobp)
1028     *jobp = job;
1029   return (job == NO_JOB) ? (PROCESS *)NULL : jobs[job]->pipe;
1030 }
1031
1032 /* Return the job index that PID belongs to, or NO_JOB if it doesn't
1033    belong to any job.  Must be called with SIGCHLD blocked. */
1034 static int
1035 find_job (pid, running_only)
1036      pid_t pid;
1037      int running_only;
1038 {
1039   register int i;
1040   register PROCESS *p;
1041
1042   /* XXX could use js.j_firstj here */
1043   for (i = 0; i < js.j_jobslots; i++)
1044     {
1045 if (i < js.j_firstj && jobs[i])
1046   itrace("find_job: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
1047       if (jobs[i])
1048         {
1049           p = jobs[i]->pipe;
1050
1051           do
1052             {
1053               if (p->pid == pid)
1054                 {
1055                   if ((running_only && PALIVE(p)) || (running_only == 0))
1056                     return (i);
1057                 }
1058
1059               p = p->next;
1060             }
1061           while (p != jobs[i]->pipe);
1062         }
1063     }
1064
1065   return (NO_JOB);
1066 }
1067
1068 /* Find a job given a PID.  If BLOCK is non-zero, block SIGCHLD as
1069    required by find_job. */
1070 int
1071 get_job_by_pid (pid, block)
1072      pid_t pid;
1073      int block;
1074 {
1075   int job;
1076   sigset_t set, oset;
1077
1078   if (block)
1079     BLOCK_CHILD (set, oset);
1080
1081   job = find_job (pid, 0);
1082
1083   if (block)
1084     UNBLOCK_CHILD (oset);
1085
1086   return job;
1087 }
1088
1089 /* Print descriptive information about the job with leader pid PID. */
1090 void
1091 describe_pid (pid)
1092      pid_t pid;
1093 {
1094   int job;
1095   sigset_t set, oset;
1096
1097   BLOCK_CHILD (set, oset);
1098
1099   job = find_job (pid, 0);
1100
1101   if (job != NO_JOB)
1102     fprintf (stderr, "[%d] %ld\n", job + 1, (long)pid);
1103   else
1104     programming_error (_("describe_pid: %ld: no such pid"), (long)pid);
1105
1106   UNBLOCK_CHILD (oset);
1107 }
1108
1109 static char *
1110 j_strsignal (s)
1111      int s;
1112 {
1113   char *x;
1114
1115   x = strsignal (s);
1116   if (x == 0)
1117     {
1118       x = retcode_name_buffer;
1119       sprintf (x, "Signal %d", s);
1120     }
1121   return x;
1122 }
1123
1124 static char *
1125 printable_job_status (j, p, format)
1126      int j;
1127      PROCESS *p;
1128      int format;
1129 {
1130   static char *temp;
1131   int es;
1132
1133   temp = "Done";
1134
1135   if (STOPPED (j) && format == 0)
1136     {
1137       if (posixly_correct == 0 || p == 0 || (WIFSTOPPED (p->status) == 0))
1138         temp = "Stopped";
1139       else
1140         {
1141           temp = retcode_name_buffer;
1142           sprintf (temp, "Stopped(%s)", signal_name (WSTOPSIG (p->status)));
1143         }
1144     }
1145   else if (RUNNING (j))
1146     temp = "Running";
1147   else
1148     {
1149       if (WIFSTOPPED (p->status))
1150         temp = j_strsignal (WSTOPSIG (p->status));
1151       else if (WIFSIGNALED (p->status))
1152         temp = j_strsignal (WTERMSIG (p->status));
1153       else if (WIFEXITED (p->status))
1154         {
1155           temp = retcode_name_buffer;
1156           es = WEXITSTATUS (p->status);
1157           if (es == 0)
1158             strcpy (temp, "Done");
1159           else if (posixly_correct)
1160             sprintf (temp, "Done(%d)", es);
1161           else
1162             sprintf (temp, "Exit %d", es);
1163         }
1164       else
1165         temp = "Unknown status";
1166     }
1167
1168   return temp;
1169 }
1170
1171 /* This is the way to print out information on a job if you
1172    know the index.  FORMAT is:
1173
1174     JLIST_NORMAL)   [1]+ Running           emacs
1175     JLIST_LONG  )   [1]+ 2378 Running      emacs
1176     -1    )   [1]+ 2378       emacs
1177
1178     JLIST_NORMAL)   [1]+ Stopped           ls | more
1179     JLIST_LONG  )   [1]+ 2369 Stopped      ls
1180                          2367       | more
1181     JLIST_PID_ONLY)
1182         Just list the pid of the process group leader (really
1183         the process group).
1184     JLIST_CHANGED_ONLY)
1185         Use format JLIST_NORMAL, but list only jobs about which
1186         the user has not been notified. */
1187
1188 /* Print status for pipeline P.  If JOB_INDEX is >= 0, it is the index into
1189    the JOBS array corresponding to this pipeline.  FORMAT is as described
1190    above.  Must be called with SIGCHLD blocked.
1191
1192    If you're printing a pipeline that's not in the jobs array, like the
1193    current pipeline as it's being created, pass -1 for JOB_INDEX */
1194 static void
1195 print_pipeline (p, job_index, format, stream)
1196      PROCESS *p;
1197      int job_index, format;
1198      FILE *stream;
1199 {
1200   PROCESS *first, *last, *show;
1201   int es, name_padding;
1202   char *temp;
1203
1204   if (p == 0)
1205     return;
1206
1207   first = last = p;
1208   while (last->next != first)
1209     last = last->next;
1210
1211   for (;;)
1212     {
1213       if (p != first)
1214         fprintf (stream, format ? "     " : " |");
1215
1216       if (format != JLIST_STANDARD)
1217         fprintf (stream, "%5ld", (long)p->pid);
1218
1219       fprintf (stream, " ");
1220
1221       if (format > -1 && job_index >= 0)
1222         {
1223           show = format ? p : last;
1224           temp = printable_job_status (job_index, show, format);
1225
1226           if (p != first)
1227             {
1228               if (format)
1229                 {
1230                   if (show->running == first->running &&
1231                       WSTATUS (show->status) == WSTATUS (first->status))
1232                     temp = "";
1233                 }
1234               else
1235                 temp = (char *)NULL;
1236             }
1237
1238           if (temp)
1239             {
1240               fprintf (stream, "%s", temp);
1241
1242               es = STRLEN (temp);
1243               if (es == 0)
1244                 es = 2; /* strlen ("| ") */
1245               name_padding = LONGEST_SIGNAL_DESC - es;
1246
1247               fprintf (stream, "%*s", name_padding, "");
1248
1249               if ((WIFSTOPPED (show->status) == 0) &&
1250                   (WIFCONTINUED (show->status) == 0) &&
1251                   WIFCORED (show->status))
1252                 fprintf (stream, "(core dumped) ");
1253             }
1254         }
1255
1256       if (p != first && format)
1257         fprintf (stream, "| ");
1258
1259       if (p->command)
1260         fprintf (stream, "%s", p->command);
1261
1262       if (p == last && job_index >= 0)
1263         {
1264           temp = current_working_directory ();
1265
1266           if (RUNNING (job_index) && (IS_FOREGROUND (job_index) == 0))
1267             fprintf (stream, " &");
1268
1269           if (strcmp (temp, jobs[job_index]->wd) != 0)
1270             fprintf (stream,
1271               "  (wd: %s)", polite_directory_format (jobs[job_index]->wd));
1272         }
1273
1274       if (format || (p == last))
1275         {
1276           /* We need to add a CR only if this is an interactive shell, and
1277              we're reporting the status of a completed job asynchronously.
1278              We can't really check whether this particular job is being
1279              reported asynchronously, so just add the CR if the shell is
1280              currently interactive and asynchronous notification is enabled. */
1281           if (asynchronous_notification && interactive)
1282             fprintf (stream, "\r\n");
1283           else
1284             fprintf (stream, "\n");
1285         }
1286
1287       if (p == last)
1288         break;
1289       p = p->next;
1290     }
1291   fflush (stream);
1292 }
1293
1294 /* Print information to STREAM about jobs[JOB_INDEX] according to FORMAT.
1295    Must be called with SIGCHLD blocked or queued with queue_sigchld */
1296 static void
1297 pretty_print_job (job_index, format, stream)
1298      int job_index, format;
1299      FILE *stream;
1300 {
1301   register PROCESS *p;
1302
1303   /* Format only pid information about the process group leader? */
1304   if (format == JLIST_PID_ONLY)
1305     {
1306       fprintf (stream, "%ld\n", (long)jobs[job_index]->pipe->pid);
1307       return;
1308     }
1309
1310   if (format == JLIST_CHANGED_ONLY)
1311     {
1312       if (IS_NOTIFIED (job_index))
1313         return;
1314       format = JLIST_STANDARD;
1315     }
1316
1317   if (format != JLIST_NONINTERACTIVE)
1318     fprintf (stream, "[%d]%c ", job_index + 1,
1319               (job_index == js.j_current) ? '+':
1320                 (job_index == js.j_previous) ? '-' : ' ');
1321
1322   if (format == JLIST_NONINTERACTIVE)
1323     format = JLIST_LONG;
1324
1325   p = jobs[job_index]->pipe;
1326
1327   print_pipeline (p, job_index, format, stream);
1328
1329   /* We have printed information about this job.  When the job's
1330      status changes, waitchld () sets the notification flag to 0. */
1331   jobs[job_index]->flags |= J_NOTIFIED;
1332 }
1333
1334 static int
1335 print_job (job, format, state, job_index)
1336      JOB *job;
1337      int format, state, job_index;
1338 {
1339   if (state == -1 || (JOB_STATE)state == job->state)
1340     pretty_print_job (job_index, format, stdout);
1341   return (0);
1342 }
1343
1344 void
1345 list_one_job (job, format, ignore, job_index)
1346      JOB *job;
1347      int format, ignore, job_index;
1348 {
1349   pretty_print_job (job_index, format, stdout);
1350 }
1351
1352 void
1353 list_stopped_jobs (format)
1354      int format;
1355 {
1356   cleanup_dead_jobs ();
1357   map_over_jobs (print_job, format, (int)JSTOPPED);
1358 }
1359
1360 void
1361 list_running_jobs (format)
1362      int format;
1363 {
1364   cleanup_dead_jobs ();
1365   map_over_jobs (print_job, format, (int)JRUNNING);
1366 }
1367
1368 /* List jobs.  If FORMAT is non-zero, then the long form of the information
1369    is printed, else just a short version. */
1370 void
1371 list_all_jobs (format)
1372      int format;
1373 {
1374   cleanup_dead_jobs ();
1375   map_over_jobs (print_job, format, -1);
1376 }
1377
1378 /* Fork, handling errors.  Returns the pid of the newly made child, or 0.
1379    COMMAND is just for remembering the name of the command; we don't do
1380    anything else with it.  ASYNC_P says what to do with the tty.  If
1381    non-zero, then don't give it away. */
1382 pid_t
1383 make_child (command, async_p)
1384      char *command;
1385      int async_p;
1386 {
1387   sigset_t set, oset;
1388   pid_t pid;
1389
1390   sigemptyset (&set);
1391   sigaddset (&set, SIGCHLD);
1392   sigaddset (&set, SIGINT);
1393   sigemptyset (&oset);
1394   sigprocmask (SIG_BLOCK, &set, &oset);
1395
1396   making_children ();
1397
1398 #if defined (BUFFERED_INPUT)
1399   /* If default_buffered_input is active, we are reading a script.  If
1400      the command is asynchronous, we have already duplicated /dev/null
1401      as fd 0, but have not changed the buffered stream corresponding to
1402      the old fd 0.  We don't want to sync the stream in this case. */
1403   if (default_buffered_input != -1 &&
1404       (!async_p || default_buffered_input > 0))
1405     sync_buffered_stream (default_buffered_input);
1406 #endif /* BUFFERED_INPUT */
1407
1408   /* Create the child, handle severe errors. */
1409   if ((pid = fork ()) < 0)
1410     {
1411       sys_error ("fork");
1412
1413       /* Kill all of the processes in the current pipeline. */
1414       terminate_current_pipeline ();
1415
1416       /* Discard the current pipeline, if any. */
1417       if (the_pipeline)
1418         kill_current_pipeline ();
1419
1420       throw_to_top_level ();    /* Reset signals, etc. */
1421     }
1422
1423   if (pid == 0)
1424     {
1425       /* In the child.  Give this child the right process group, set the
1426          signals to the default state for a new process. */
1427       pid_t mypid;
1428
1429       mypid = getpid ();
1430 #if defined (BUFFERED_INPUT)
1431       /* Close default_buffered_input if it's > 0.  We don't close it if it's
1432          0 because that's the file descriptor used when redirecting input,
1433          and it's wrong to close the file in that case. */
1434       unset_bash_input (0);
1435 #endif /* BUFFERED_INPUT */
1436
1437       /* Restore top-level signal mask. */
1438       sigprocmask (SIG_SETMASK, &top_level_mask, (sigset_t *)NULL);
1439
1440       if (job_control)
1441         {
1442           /* All processes in this pipeline belong in the same
1443              process group. */
1444
1445           if (pipeline_pgrp == 0)       /* This is the first child. */
1446             pipeline_pgrp = mypid;
1447
1448           /* Check for running command in backquotes. */
1449           if (pipeline_pgrp == shell_pgrp)
1450             ignore_tty_job_signals ();
1451           else
1452             default_tty_job_signals ();
1453
1454           /* Set the process group before trying to mess with the terminal's
1455              process group.  This is mandated by POSIX. */
1456           /* This is in accordance with the Posix 1003.1 standard,
1457              section B.7.2.4, which says that trying to set the terminal
1458              process group with tcsetpgrp() to an unused pgrp value (like
1459              this would have for the first child) is an error.  Section
1460              B.4.3.3, p. 237 also covers this, in the context of job control
1461              shells. */
1462           if (setpgid (mypid, pipeline_pgrp) < 0)
1463             sys_error ("child setpgid (%ld to %ld)", (long)mypid, (long)pipeline_pgrp);
1464
1465           /* By convention (and assumption above), if
1466              pipeline_pgrp == shell_pgrp, we are making a child for
1467              command substitution.
1468              In this case, we don't want to give the terminal to the
1469              shell's process group (we could be in the middle of a
1470              pipeline, for example). */
1471           if (async_p == 0 && pipeline_pgrp != shell_pgrp)
1472             give_terminal_to (pipeline_pgrp, 0);
1473
1474 #if defined (PGRP_PIPE)
1475           if (pipeline_pgrp == mypid)
1476             pipe_read (pgrp_pipe);
1477 #endif
1478         }
1479       else                      /* Without job control... */
1480         {
1481           if (pipeline_pgrp == 0)
1482             pipeline_pgrp = shell_pgrp;
1483
1484           /* If these signals are set to SIG_DFL, we encounter the curious
1485              situation of an interactive ^Z to a running process *working*
1486              and stopping the process, but being unable to do anything with
1487              that process to change its state.  On the other hand, if they
1488              are set to SIG_IGN, jobs started from scripts do not stop when
1489              the shell running the script gets a SIGTSTP and stops. */
1490
1491           default_tty_job_signals ();
1492         }
1493
1494 #if defined (PGRP_PIPE)
1495       /* Release the process group pipe, since our call to setpgid ()
1496          is done.  The last call to pipe_close is done in stop_pipeline. */
1497       pipe_close (pgrp_pipe);
1498 #endif /* PGRP_PIPE */
1499
1500       if (async_p)
1501         last_asynchronous_pid = getpid ();
1502     }
1503   else
1504     {
1505       /* In the parent.  Remember the pid of the child just created
1506          as the proper pgrp if this is the first child. */
1507
1508       if (job_control)
1509         {
1510           if (pipeline_pgrp == 0)
1511             {
1512               pipeline_pgrp = pid;
1513               /* Don't twiddle terminal pgrps in the parent!  This is the bug,
1514                  not the good thing of twiddling them in the child! */
1515               /* give_terminal_to (pipeline_pgrp, 0); */
1516             }
1517           /* This is done on the recommendation of the Rationale section of
1518              the POSIX 1003.1 standard, where it discusses job control and
1519              shells.  It is done to avoid possible race conditions. (Ref.
1520              1003.1 Rationale, section B.4.3.3, page 236). */
1521           setpgid (pid, pipeline_pgrp);
1522         }
1523       else
1524         {
1525           if (pipeline_pgrp == 0)
1526             pipeline_pgrp = shell_pgrp;
1527         }
1528
1529       /* Place all processes into the jobs array regardless of the
1530          state of job_control. */
1531       add_process (command, pid);
1532
1533       if (async_p)
1534         last_asynchronous_pid = pid;
1535
1536       last_made_pid = pid;
1537
1538       /* keep stats */
1539       js.c_totforked++;
1540       js.c_living++;
1541
1542       /* Unblock SIGINT and SIGCHLD unless creating a pipeline, in which case
1543          SIGCHLD remains blocked until all commands in the pipeline have been
1544          created. */
1545       sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
1546     }
1547
1548   return (pid);
1549 }
1550
1551 /* These two functions are called only in child processes. */
1552 void
1553 ignore_tty_job_signals ()
1554 {
1555   set_signal_handler (SIGTSTP, SIG_IGN);
1556   set_signal_handler (SIGTTIN, SIG_IGN);
1557   set_signal_handler (SIGTTOU, SIG_IGN);
1558 }
1559
1560 void
1561 default_tty_job_signals ()
1562 {
1563   set_signal_handler (SIGTSTP, SIG_DFL);
1564   set_signal_handler (SIGTTIN, SIG_DFL);
1565   set_signal_handler (SIGTTOU, SIG_DFL);
1566 }
1567
1568 /* When we end a job abnormally, or if we stop a job, we set the tty to the
1569    state kept in here.  When a job ends normally, we set the state in here
1570    to the state of the tty. */
1571
1572 static TTYSTRUCT shell_tty_info;
1573
1574 #if defined (NEW_TTY_DRIVER)
1575 static struct tchars shell_tchars;
1576 static struct ltchars shell_ltchars;
1577 #endif /* NEW_TTY_DRIVER */
1578
1579 #if defined (NEW_TTY_DRIVER) && defined (DRAIN_OUTPUT)
1580 /* Since the BSD tty driver does not allow us to change the tty modes
1581    while simultaneously waiting for output to drain and preserving
1582    typeahead, we have to drain the output ourselves before calling
1583    ioctl.  We cheat by finding the length of the output queue, and
1584    using select to wait for an appropriate length of time.  This is
1585    a hack, and should be labeled as such (it's a hastily-adapted
1586    mutation of a `usleep' implementation).  It's only reason for
1587    existing is the flaw in the BSD tty driver. */
1588
1589 static int ttspeeds[] =
1590 {
1591   0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
1592   1800, 2400, 4800, 9600, 19200, 38400
1593 };
1594
1595 static void
1596 draino (fd, ospeed)
1597      int fd, ospeed;
1598 {
1599   register int delay = ttspeeds[ospeed];
1600   int n;
1601
1602   if (!delay)
1603     return;
1604
1605   while ((ioctl (fd, TIOCOUTQ, &n) == 0) && n)
1606     {
1607       if (n > (delay / 100))
1608         {
1609           struct timeval tv;
1610
1611           n *= 10;              /* 2 bits more for conservativeness. */
1612           tv.tv_sec = n / delay;
1613           tv.tv_usec = ((n % delay) * 1000000) / delay;
1614           select (fd, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
1615         }
1616       else
1617         break;
1618     }
1619 }
1620 #endif /* NEW_TTY_DRIVER && DRAIN_OUTPUT */
1621
1622 /* Return the fd from which we are actually getting input. */
1623 #define input_tty() (shell_tty != -1) ? shell_tty : fileno (stderr)
1624
1625 /* Fill the contents of shell_tty_info with the current tty info. */
1626 int
1627 get_tty_state ()
1628 {
1629   int tty;
1630
1631   tty = input_tty ();
1632   if (tty != -1)
1633     {
1634 #if defined (NEW_TTY_DRIVER)
1635       ioctl (tty, TIOCGETP, &shell_tty_info);
1636       ioctl (tty, TIOCGETC, &shell_tchars);
1637       ioctl (tty, TIOCGLTC, &shell_ltchars);
1638 #endif /* NEW_TTY_DRIVER */
1639
1640 #if defined (TERMIO_TTY_DRIVER)
1641       ioctl (tty, TCGETA, &shell_tty_info);
1642 #endif /* TERMIO_TTY_DRIVER */
1643
1644 #if defined (TERMIOS_TTY_DRIVER)
1645       if (tcgetattr (tty, &shell_tty_info) < 0)
1646         {
1647 #if 0
1648           /* Only print an error message if we're really interactive at
1649              this time. */
1650           if (interactive)
1651             sys_error ("[%ld: %d] tcgetattr", (long)getpid (), shell_level);
1652 #endif
1653           return -1;
1654         }
1655 #endif /* TERMIOS_TTY_DRIVER */
1656       if (check_window_size)
1657         get_new_window_size (0);
1658     }
1659   return 0;
1660 }
1661
1662 /* Make the current tty use the state in shell_tty_info. */
1663 int
1664 set_tty_state ()
1665 {
1666   int tty;
1667
1668   tty = input_tty ();
1669   if (tty != -1)
1670     {
1671 #if defined (NEW_TTY_DRIVER)
1672 #  if defined (DRAIN_OUTPUT)
1673       draino (tty, shell_tty_info.sg_ospeed);
1674 #  endif /* DRAIN_OUTPUT */
1675       ioctl (tty, TIOCSETN, &shell_tty_info);
1676       ioctl (tty, TIOCSETC, &shell_tchars);
1677       ioctl (tty, TIOCSLTC, &shell_ltchars);
1678 #endif /* NEW_TTY_DRIVER */
1679
1680 #if defined (TERMIO_TTY_DRIVER)
1681       ioctl (tty, TCSETAW, &shell_tty_info);
1682 #endif /* TERMIO_TTY_DRIVER */
1683
1684 #if defined (TERMIOS_TTY_DRIVER)
1685       if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
1686         {
1687           /* Only print an error message if we're really interactive at
1688              this time. */
1689           if (interactive)
1690             sys_error ("[%ld: %d] tcsetattr", (long)getpid (), shell_level);
1691           return -1;
1692         }
1693 #endif /* TERMIOS_TTY_DRIVER */
1694     }
1695   return 0;
1696 }
1697
1698 /* Given an index into the jobs array JOB, return the pid of the last
1699    process in that job's pipeline.  This is the one whose exit status
1700    counts.  Must be called with SIGCHLD blocked or queued. */
1701 static pid_t
1702 find_last_pid (job, block)
1703      int job;
1704      int block;
1705 {
1706   register PROCESS *p;
1707   sigset_t set, oset;
1708
1709   if (block)
1710     BLOCK_CHILD (set, oset);
1711
1712   p = jobs[job]->pipe;
1713   while (p->next != jobs[job]->pipe)
1714     p = p->next;
1715
1716   if (block)
1717     UNBLOCK_CHILD (oset);
1718
1719   return (p->pid);
1720 }
1721
1722 /* Wait for a particular child of the shell to finish executing.
1723    This low-level function prints an error message if PID is not
1724    a child of this shell.  It returns -1 if it fails, or whatever
1725    wait_for returns otherwise.  If the child is not found in the
1726    jobs table, it returns 127. */
1727 int
1728 wait_for_single_pid (pid)
1729      pid_t pid;
1730 {
1731   register PROCESS *child;
1732   sigset_t set, oset;
1733   int r, job;
1734
1735   BLOCK_CHILD (set, oset);
1736   child = find_pipeline (pid, 0, (int *)NULL);
1737   UNBLOCK_CHILD (oset);
1738
1739   if (child == 0)
1740     {
1741       internal_error (_("wait: pid %ld is not a child of this shell"), (long)pid);
1742       return (127);
1743     }
1744
1745   r = wait_for (pid);
1746
1747   /* POSIX.2: if we just waited for a job, we can remove it from the jobs
1748      table. */
1749   BLOCK_CHILD (set, oset);
1750   job = find_job (pid, 0);
1751   if (job != NO_JOB && jobs[job] && DEADJOB (job))
1752     jobs[job]->flags |= J_NOTIFIED;
1753   UNBLOCK_CHILD (oset);
1754
1755   return r;
1756 }
1757
1758 /* Wait for all of the backgrounds of this shell to finish. */
1759 void
1760 wait_for_background_pids ()
1761 {
1762   register int i, r, waited_for;
1763   sigset_t set, oset;
1764   pid_t pid;
1765
1766   for (waited_for = 0;;)
1767     {
1768       BLOCK_CHILD (set, oset);
1769
1770       /* find first running job; if none running in foreground, break */
1771       /* XXX could use js.j_firstj here */
1772       for (i = 0; i < js.j_jobslots; i++)
1773 {
1774 if (i < js.j_firstj && jobs[i])
1775   itrace("wait_for_background_pids: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
1776         if (jobs[i] && RUNNING (i) && IS_FOREGROUND (i) == 0)
1777           break;
1778 }
1779       if (i == js.j_jobslots)
1780         {
1781           UNBLOCK_CHILD (oset);
1782           break;
1783         }
1784
1785       /* now wait for the last pid in that job. */
1786       pid = find_last_pid (i, 0);
1787       UNBLOCK_CHILD (oset);
1788       QUIT;
1789       errno = 0;                /* XXX */
1790       r = wait_for_single_pid (pid);
1791       if (r == -1)
1792         {
1793           /* If we're mistaken about job state, compensate. */
1794           if (errno == ECHILD)
1795             mark_all_jobs_as_dead ();
1796         }
1797       else
1798         waited_for++;
1799     }
1800
1801   /* POSIX.2 says the shell can discard the statuses of all completed jobs if
1802      `wait' is called with no arguments. */
1803   mark_dead_jobs_as_notified (1);
1804   cleanup_dead_jobs ();
1805 }
1806
1807 /* Make OLD_SIGINT_HANDLER the SIGINT signal handler. */
1808 #define INVALID_SIGNAL_HANDLER (SigHandler *)wait_for_background_pids
1809 static SigHandler *old_sigint_handler = INVALID_SIGNAL_HANDLER;
1810
1811 static void
1812 restore_sigint_handler ()
1813 {
1814   if (old_sigint_handler != INVALID_SIGNAL_HANDLER)
1815     {
1816       set_signal_handler (SIGINT, old_sigint_handler);
1817       old_sigint_handler = INVALID_SIGNAL_HANDLER;
1818     }
1819 }
1820
1821 static int wait_sigint_received;
1822
1823 /* Handle SIGINT while we are waiting for children in a script to exit.
1824    The `wait' builtin should be interruptible, but all others should be
1825    effectively ignored (i.e. not cause the shell to exit). */
1826 static sighandler
1827 wait_sigint_handler (sig)
1828      int sig;
1829 {
1830   SigHandler *sigint_handler;
1831
1832   if (interrupt_immediately ||
1833       (this_shell_builtin && this_shell_builtin == wait_builtin))
1834     {
1835       last_command_exit_value = EXECUTION_FAILURE;
1836       restore_sigint_handler ();
1837       /* If we got a SIGINT while in `wait', and SIGINT is trapped, do
1838          what POSIX.2 says (see builtins/wait.def for more info). */
1839       if (this_shell_builtin && this_shell_builtin == wait_builtin &&
1840           signal_is_trapped (SIGINT) &&
1841           ((sigint_handler = trap_to_sighandler (SIGINT)) == trap_handler))
1842         {
1843           interrupt_immediately = 0;
1844           trap_handler (SIGINT);        /* set pending_traps[SIGINT] */
1845           wait_signal_received = SIGINT;
1846           longjmp (wait_intr_buf, 1);
1847         }
1848       
1849       ADDINTERRUPT;
1850       QUIT;
1851     }
1852
1853   /* XXX - should this be interrupt_state?  If it is, the shell will act
1854      as if it got the SIGINT interrupt. */
1855   wait_sigint_received = 1;
1856
1857   /* Otherwise effectively ignore the SIGINT and allow the running job to
1858      be killed. */
1859   SIGRETURN (0);
1860 }
1861
1862 static int
1863 process_exit_signal (status)
1864      WAIT status;
1865 {
1866   return (WIFSIGNALED (status) ? WTERMSIG (status) : 0);
1867 }
1868
1869 static int
1870 process_exit_status (status)
1871      WAIT status;
1872 {
1873   if (WIFSIGNALED (status))
1874     return (128 + WTERMSIG (status));
1875   else if (WIFSTOPPED (status) == 0)
1876     return (WEXITSTATUS (status));
1877   else
1878     return (EXECUTION_SUCCESS);
1879 }
1880
1881 /* Return the exit status of the last process in the pipeline for job JOB.
1882    This is the exit status of the entire job. */
1883 static WAIT
1884 raw_job_exit_status (job)
1885      int job;
1886 {
1887   register PROCESS *p;
1888   int fail;
1889
1890   if (pipefail_opt)
1891     {
1892       fail = 0;
1893       p = jobs[job]->pipe;
1894       do
1895         {
1896           if (p->status != EXECUTION_SUCCESS) fail = p->status;
1897           p = p->next;
1898         }
1899       while (p != jobs[job]->pipe);
1900       return fail;
1901     }
1902
1903   for (p = jobs[job]->pipe; p->next != jobs[job]->pipe; p = p->next)
1904     ;
1905   return (p->status);
1906 }
1907
1908 /* Return the exit status of job JOB.  This is the exit status of the last
1909    (rightmost) process in the job's pipeline, modified if the job was killed
1910    by a signal or stopped. */
1911 static int
1912 job_exit_status (job)
1913      int job;
1914 {
1915   return (process_exit_status (raw_job_exit_status (job)));
1916 }
1917
1918 static int
1919 job_exit_signal (job)
1920      int job;
1921 {
1922   return (process_exit_signal (raw_job_exit_status (job)));
1923 }
1924
1925 #define FIND_CHILD(pid, child) \
1926   do \
1927     { \
1928       child = find_pipeline (pid, 0, (int *)NULL); \
1929       if (child == 0) \
1930         { \
1931           give_terminal_to (shell_pgrp, 0); \
1932           UNBLOCK_CHILD (oset); \
1933           internal_error (_("wait_for: No record of process %ld"), (long)pid); \
1934           restore_sigint_handler (); \
1935           return (termination_state = 127); \
1936         } \
1937     } \
1938   while (0)
1939
1940 /* Wait for pid (one of our children) to terminate, then
1941    return the termination state.  Returns 127 if PID is not found in
1942    the jobs table.  Returns -1 if waitchld() returns -1, indicating
1943    that there are no unwaited-for child processes. */
1944 int
1945 wait_for (pid)
1946      pid_t pid;
1947 {
1948   int job, termination_state, r;
1949   WAIT s;
1950   register PROCESS *child;
1951   sigset_t set, oset;
1952   register PROCESS *p;
1953
1954   /* In the case that this code is interrupted, and we longjmp () out of it,
1955      we are relying on the code in throw_to_top_level () to restore the
1956      top-level signal mask. */
1957   BLOCK_CHILD (set, oset);
1958
1959   /* Ignore interrupts while waiting for a job run without job control
1960      to finish.  We don't want the shell to exit if an interrupt is
1961      received, only if one of the jobs run is killed via SIGINT.  If
1962      job control is not set, the job will be run in the same pgrp as
1963      the shell, and the shell will see any signals the job gets. */
1964
1965   /* This is possibly a race condition -- should it go in stop_pipeline? */
1966   wait_sigint_received = 0;
1967   if (job_control == 0)
1968     old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
1969
1970   termination_state = last_command_exit_value;
1971
1972   if (interactive && job_control == 0)
1973     QUIT;
1974
1975   /* If we say wait_for (), then we have a record of this child somewhere.
1976      If it and none of its peers are running, don't call waitchld(). */
1977
1978   job = NO_JOB;
1979   do
1980     {
1981       FIND_CHILD (pid, child);
1982
1983       /* If this child is part of a job, then we are really waiting for the
1984          job to finish.  Otherwise, we are waiting for the child to finish.
1985          We check for JDEAD in case the job state has been set by waitchld
1986          after receipt of a SIGCHLD. */
1987       if (job == NO_JOB)
1988         job = find_job (pid, 0);
1989
1990       /* waitchld() takes care of setting the state of the job.  If the job
1991          has already exited before this is called, sigchld_handler will have
1992          called waitchld and the state will be set to JDEAD. */
1993
1994       if (child->running || (job != NO_JOB && RUNNING (job)))
1995         {
1996 #if defined (WAITPID_BROKEN)    /* SCOv4 */
1997           sigset_t suspend_set;
1998           sigemptyset (&suspend_set);
1999           sigsuspend (&suspend_set);
2000 #else /* !WAITPID_BROKEN */
2001 #  if defined (MUST_UNBLOCK_CHLD)
2002           struct sigaction act, oact;
2003           sigset_t nullset, chldset;
2004
2005           sigemptyset (&nullset);
2006           sigemptyset (&chldset);
2007           sigprocmask (SIG_SETMASK, &nullset, &chldset);
2008           act.sa_handler = SIG_DFL;
2009           sigemptyset (&act.sa_mask);
2010           sigemptyset (&oact.sa_mask);
2011           act.sa_flags = 0;
2012           sigaction (SIGCHLD, &act, &oact);
2013 #  endif
2014           queue_sigchld = 1;
2015           r = waitchld (pid, 1);
2016 #  if defined (MUST_UNBLOCK_CHLD)
2017           sigaction (SIGCHLD, &oact, (struct sigaction *)NULL);
2018           sigprocmask (SIG_SETMASK, &chldset, (sigset_t *)NULL);
2019 #  endif
2020           queue_sigchld = 0;
2021           if (r == -1 && errno == ECHILD && this_shell_builtin == wait_builtin)
2022             {
2023               termination_state = -1;
2024               goto wait_for_return;
2025             }
2026
2027           /* If child is marked as running, but waitpid() returns -1/ECHILD,
2028              there is something wrong.  Somewhere, wait should have returned
2029              that child's pid.  Mark the child as not running and the job,
2030              if it exists, as JDEAD. */
2031           if (r == -1 && errno == ECHILD)
2032             {
2033               child->running = PS_DONE;
2034               child->status = 0;        /* XXX -- can't find true status */
2035               if (job != NO_JOB)
2036                 {
2037                   jobs[job]->state = JDEAD;
2038                   js.j_ndead++;
2039                 }
2040             }
2041 #endif /* WAITPID_BROKEN */
2042         }
2043
2044       /* If the shell is interactive, and job control is disabled, see
2045          if the foreground process has died due to SIGINT and jump out
2046          of the wait loop if it has.  waitchld has already restored the
2047          old SIGINT signal handler. */
2048       if (interactive && job_control == 0)
2049         QUIT;
2050     }
2051   while (child->running || (job != NO_JOB && RUNNING (job)));
2052
2053   /* The exit state of the command is either the termination state of the
2054      child, or the termination state of the job.  If a job, the status
2055      of the last child in the pipeline is the significant one.  If the command
2056      or job was terminated by a signal, note that value also. */
2057   termination_state = (job != NO_JOB) ? job_exit_status (job)
2058                                       : process_exit_status (child->status);
2059   last_command_exit_signal = (job != NO_JOB) ? job_exit_signal (job)
2060                                              : process_exit_signal (child->status);
2061
2062   /* XXX */
2063   if ((job != NO_JOB && JOBSTATE (job) == JSTOPPED) || WIFSTOPPED (child->status))
2064     termination_state = 128 + WSTOPSIG (child->status);
2065
2066   if (job == NO_JOB || IS_JOBCONTROL (job))
2067     {
2068       /* XXX - under what circumstances is a job not present in the jobs
2069          table (job == NO_JOB)?
2070                 1.  command substitution
2071
2072          In the case of command substitution, at least, it's probably not
2073          the right thing to give the terminal to the shell's process group,
2074          even though there is code in subst.c:command_substitute to work
2075          around it.
2076
2077          Things that don't:
2078                 $PROMPT_COMMAND execution
2079                 process substitution
2080        */
2081 #if 0
2082 if (job == NO_JOB)
2083   itrace("wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%ld)", (long)shell_pgrp);
2084 #endif
2085
2086       give_terminal_to (shell_pgrp, 0);
2087     }
2088
2089   /* If the command did not exit cleanly, or the job is just
2090      being stopped, then reset the tty state back to what it
2091      was before this command.  Reset the tty state and notify
2092      the user of the job termination only if the shell is
2093      interactive.  Clean up any dead jobs in either case. */
2094   if (job != NO_JOB)
2095     {
2096       if (interactive_shell && subshell_environment == 0)
2097         {
2098           /* This used to use `child->status'.  That's wrong, however, for
2099              pipelines.  `child' is the first process in the pipeline.  It's
2100              likely that the process we want to check for abnormal termination
2101              or stopping is the last process in the pipeline, especially if
2102              it's long-lived and the first process is short-lived.  Since we
2103              know we have a job here, we can check all the processes in this
2104              job's pipeline and see if one of them stopped or terminated due
2105              to a signal.  We might want to change this later to just check
2106              the last process in the pipeline.  If no process exits due to a
2107              signal, S is left as the status of the last job in the pipeline. */
2108           p = jobs[job]->pipe;
2109           do
2110             {
2111               s = p->status;
2112               if (WIFSIGNALED(s) || WIFSTOPPED(s))
2113                 break;
2114               p = p->next;
2115             }
2116           while (p != jobs[job]->pipe);
2117
2118           if (WIFSIGNALED (s) || WIFSTOPPED (s))
2119             {
2120               set_tty_state ();
2121
2122               /* If the current job was stopped or killed by a signal, and
2123                  the user has requested it, get a possibly new window size */
2124               if (check_window_size && (job == js.j_current || IS_FOREGROUND (job)))
2125                 get_new_window_size (0);
2126             }
2127           else
2128             get_tty_state ();
2129
2130           /* If job control is enabled, the job was started with job
2131              control, the job was the foreground job, and it was killed
2132              by SIGINT, then print a newline to compensate for the kernel
2133              printing the ^C without a trailing newline. */
2134           if (job_control && IS_JOBCONTROL (job) && IS_FOREGROUND (job) &&
2135                 WIFSIGNALED (s) && WTERMSIG (s) == SIGINT)
2136             {
2137               /* If SIGINT is not trapped and the shell is in a for, while,
2138                  or until loop, act as if the shell received SIGINT as
2139                  well, so the loop can be broken.  This doesn't call the
2140                  SIGINT signal handler; maybe it should. */
2141               if (signal_is_trapped (SIGINT) == 0 && loop_level)
2142                 ADDINTERRUPT;
2143               else
2144                 {
2145                   putchar ('\n');
2146                   fflush (stdout);
2147                 }
2148             }
2149         }
2150
2151       /* Moved here from set_job_status_and_cleanup, which is in the SIGCHLD
2152          signal handler path */
2153       if (DEADJOB (job) && IS_FOREGROUND (job) /*&& subshell_environment == 0*/)
2154         setjstatus (job);
2155
2156       /* If this job is dead, notify the user of the status.  If the shell
2157          is interactive, this will display a message on the terminal.  If
2158          the shell is not interactive, make sure we turn on the notify bit
2159          so we don't get an unwanted message about the job's termination,
2160          and so delete_job really clears the slot in the jobs table. */
2161       notify_and_cleanup ();
2162     }
2163
2164 wait_for_return:
2165
2166   UNBLOCK_CHILD (oset);
2167
2168   /* Restore the original SIGINT signal handler before we return. */
2169   restore_sigint_handler ();
2170
2171   return (termination_state);
2172 }
2173
2174 /* Wait for the last process in the pipeline for JOB.  Returns whatever
2175    wait_for returns: the last process's termination state or -1 if there
2176    are no unwaited-for child processes or an error occurs. */
2177 int
2178 wait_for_job (job)
2179      int job;
2180 {
2181   pid_t pid;
2182   int r;
2183   sigset_t set, oset;
2184
2185   BLOCK_CHILD(set, oset);
2186   if (JOBSTATE (job) == JSTOPPED)
2187     internal_warning (_("wait_for_job: job %d is stopped"), job+1);
2188
2189   pid = find_last_pid (job, 0);
2190   UNBLOCK_CHILD(oset);
2191   r = wait_for (pid);
2192
2193   /* POSIX.2: we can remove the job from the jobs table if we just waited
2194      for it. */
2195   BLOCK_CHILD (set, oset);
2196   if (job != NO_JOB && jobs[job] && DEADJOB (job))
2197     jobs[job]->flags |= J_NOTIFIED;
2198   UNBLOCK_CHILD (oset);
2199
2200   return r;
2201 }
2202
2203 /* Print info about dead jobs, and then delete them from the list
2204    of known jobs.  This does not actually delete jobs when the
2205    shell is not interactive, because the dead jobs are not marked
2206    as notified. */
2207 void
2208 notify_and_cleanup ()
2209 {
2210   if (jobs_list_frozen)
2211     return;
2212
2213   if (interactive || interactive_shell == 0 || sourcelevel)
2214     notify_of_job_status ();
2215
2216   cleanup_dead_jobs ();
2217 }
2218
2219 /* Make dead jobs disappear from the jobs array without notification.
2220    This is used when the shell is not interactive. */
2221 void
2222 reap_dead_jobs ()
2223 {
2224   mark_dead_jobs_as_notified (0);
2225   cleanup_dead_jobs ();
2226 }
2227
2228 /* Return the next closest (chronologically) job to JOB which is in
2229    STATE.  STATE can be JSTOPPED, JRUNNING.  NO_JOB is returned if
2230    there is no next recent job. */
2231 static int
2232 most_recent_job_in_state (job, state)
2233      int job;
2234      JOB_STATE state;
2235 {
2236   register int i, result;
2237   sigset_t set, oset;
2238
2239   BLOCK_CHILD (set, oset);
2240
2241   for (result = NO_JOB, i = job - 1; i >= 0; i--)
2242     {
2243       if (jobs[i] && (JOBSTATE (i) == state))
2244         {
2245           result = i;
2246           break;
2247         }
2248     }
2249
2250   UNBLOCK_CHILD (oset);
2251
2252   return (result);
2253 }
2254
2255 /* Return the newest *stopped* job older than JOB, or NO_JOB if not
2256    found. */
2257 static int
2258 job_last_stopped (job)
2259      int job;
2260 {
2261   return (most_recent_job_in_state (job, JSTOPPED));
2262 }
2263
2264 /* Return the newest *running* job older than JOB, or NO_JOB if not
2265    found. */
2266 static int
2267 job_last_running (job)
2268      int job;
2269 {
2270   return (most_recent_job_in_state (job, JRUNNING));
2271 }
2272
2273 /* Make JOB be the current job, and make previous be useful.  Must be
2274    called with SIGCHLD blocked. */
2275 static void
2276 set_current_job (job)
2277      int job;
2278 {
2279   int candidate;
2280
2281   if (js.j_current != job)
2282     {
2283       js.j_previous = js.j_current;
2284       js.j_current = job;
2285     }
2286
2287   /* First choice for previous job is the old current job. */
2288   if (js.j_previous != js.j_current &&
2289       js.j_previous != NO_JOB &&
2290       jobs[js.j_previous] &&
2291       STOPPED (js.j_previous))
2292     return;
2293
2294   /* Second choice:  Newest stopped job that is older than
2295      the current job. */
2296   candidate = NO_JOB;
2297   if (STOPPED (js.j_current))
2298     {
2299       candidate = job_last_stopped (js.j_current);
2300
2301       if (candidate != NO_JOB)
2302         {
2303           js.j_previous = candidate;
2304           return;
2305         }
2306     }
2307
2308   /* If we get here, there is either only one stopped job, in which case it is
2309      the current job and the previous job should be set to the newest running
2310      job, or there are only running jobs and the previous job should be set to
2311      the newest running job older than the current job.  We decide on which
2312      alternative to use based on whether or not JOBSTATE(js.j_current) is
2313      JSTOPPED. */
2314
2315   candidate = RUNNING (js.j_current) ? job_last_running (js.j_current)
2316                                     : job_last_running (js.j_jobslots);
2317
2318   if (candidate != NO_JOB)
2319     {
2320       js.j_previous = candidate;
2321       return;
2322     }
2323
2324   /* There is only a single job, and it is both `+' and `-'. */
2325   js.j_previous = js.j_current;
2326 }
2327
2328 /* Make current_job be something useful, if it isn't already. */
2329
2330 /* Here's the deal:  The newest non-running job should be `+', and the
2331    next-newest non-running job should be `-'.  If there is only a single
2332    stopped job, the js.j_previous is the newest non-running job.  If there
2333    are only running jobs, the newest running job is `+' and the
2334    next-newest running job is `-'.  Must be called with SIGCHLD blocked. */
2335
2336 static void
2337 reset_current ()
2338 {
2339   int candidate;
2340
2341   if (js.j_jobslots && js.j_current != NO_JOB && jobs[js.j_current] && STOPPED (js.j_current))
2342     candidate = js.j_current;
2343   else
2344     {
2345       candidate = NO_JOB;
2346
2347       /* First choice: the previous job. */
2348       if (js.j_previous != NO_JOB && jobs[js.j_previous] && STOPPED (js.j_previous))
2349         candidate = js.j_previous;
2350
2351       /* Second choice: the most recently stopped job. */
2352       if (candidate == NO_JOB)
2353         candidate = job_last_stopped (js.j_jobslots);
2354
2355       /* Third choice: the newest running job. */
2356       if (candidate == NO_JOB)
2357         candidate = job_last_running (js.j_jobslots);
2358     }
2359
2360   /* If we found a job to use, then use it.  Otherwise, there
2361      are no jobs period. */
2362   if (candidate != NO_JOB)
2363     set_current_job (candidate);
2364   else
2365     js.j_current = js.j_previous = NO_JOB;
2366 }
2367
2368 /* Set up the job structures so we know the job and its processes are
2369    all running. */
2370 static void
2371 set_job_running (job)
2372      int job;
2373 {
2374   register PROCESS *p;
2375
2376   /* Each member of the pipeline is now running. */
2377   p = jobs[job]->pipe;
2378
2379   do
2380     {
2381       if (WIFSTOPPED (p->status))
2382         p->running = PS_RUNNING;        /* XXX - could be PS_STOPPED */
2383       p = p->next;
2384     }
2385   while (p != jobs[job]->pipe);
2386
2387   /* This means that the job is running. */
2388   JOBSTATE (job) = JRUNNING;
2389 }
2390
2391 /* Start a job.  FOREGROUND if non-zero says to do that.  Otherwise,
2392    start the job in the background.  JOB is a zero-based index into
2393    JOBS.  Returns -1 if it is unable to start a job, and the return
2394    status of the job otherwise. */
2395 int
2396 start_job (job, foreground)
2397      int job, foreground;
2398 {
2399   register PROCESS *p;
2400   int already_running;
2401   sigset_t set, oset;
2402   char *wd;
2403   static TTYSTRUCT save_stty;
2404
2405   BLOCK_CHILD (set, oset);
2406
2407   if (DEADJOB (job))
2408     {
2409       internal_error (_("%s: job has terminated"), this_command_name);
2410       UNBLOCK_CHILD (oset);
2411       return (-1);
2412     }
2413
2414   already_running = RUNNING (job);
2415
2416   if (foreground == 0 && already_running)
2417     {
2418       internal_error (_("%s: job %d already in background"), this_command_name, job + 1);
2419       UNBLOCK_CHILD (oset);
2420       return (-1);
2421     }
2422
2423   wd = current_working_directory ();
2424
2425   /* You don't know about the state of this job.  Do you? */
2426   jobs[job]->flags &= ~J_NOTIFIED;
2427
2428   if (foreground)
2429     {
2430       set_current_job (job);
2431       jobs[job]->flags |= J_FOREGROUND;
2432     }
2433
2434   /* Tell the outside world what we're doing. */
2435   p = jobs[job]->pipe;
2436
2437   if (foreground == 0)
2438     printf ("[%d]%c ", job + 1,
2439            (job == js.j_current) ? '+': ((job == js.j_previous) ? '-' : ' '));
2440
2441   do
2442     {
2443       printf ("%s%s",
2444                p->command ? p->command : "",
2445                p->next != jobs[job]->pipe? " | " : "");
2446       p = p->next;
2447     }
2448   while (p != jobs[job]->pipe);
2449
2450   if (foreground == 0)
2451     printf (" &");
2452
2453   if (strcmp (wd, jobs[job]->wd) != 0)
2454     printf ("   (wd: %s)", polite_directory_format (jobs[job]->wd));
2455
2456   printf ("\n");
2457
2458   /* Run the job. */
2459   if (already_running == 0)
2460     set_job_running (job);
2461
2462   /* Save the tty settings before we start the job in the foreground. */
2463   if (foreground)
2464     {
2465       get_tty_state ();
2466       save_stty = shell_tty_info;
2467       /* Give the terminal to this job. */
2468       if (IS_JOBCONTROL (job))
2469         give_terminal_to (jobs[job]->pgrp, 0);
2470     }
2471   else
2472     jobs[job]->flags &= ~J_FOREGROUND;
2473
2474   /* If the job is already running, then don't bother jump-starting it. */
2475   if (already_running == 0)
2476     {
2477       jobs[job]->flags |= J_NOTIFIED;
2478       killpg (jobs[job]->pgrp, SIGCONT);
2479     }
2480
2481   if (foreground)
2482     {
2483       pid_t pid;
2484       int s;
2485
2486       pid = find_last_pid (job, 0);
2487       UNBLOCK_CHILD (oset);
2488       s = wait_for (pid);
2489       shell_tty_info = save_stty;
2490       set_tty_state ();
2491       return (s);
2492     }
2493   else
2494     {
2495       reset_current ();
2496       UNBLOCK_CHILD (oset);
2497       return (0);
2498     }
2499 }
2500
2501 /* Give PID SIGNAL.  This determines what job the pid belongs to (if any).
2502    If PID does belong to a job, and the job is stopped, then CONTinue the
2503    job after giving it SIGNAL.  Returns -1 on failure.  If GROUP is non-null,
2504    then kill the process group associated with PID. */
2505 int
2506 kill_pid (pid, sig, group)
2507      pid_t pid;
2508      int sig, group;
2509 {
2510   register PROCESS *p;
2511   int job, result;
2512   sigset_t set, oset;
2513
2514   result = EXECUTION_SUCCESS;
2515   if (group)
2516     {
2517       BLOCK_CHILD (set, oset);
2518       p = find_pipeline (pid, 0, &job);
2519
2520       if (job != NO_JOB)
2521         {
2522           jobs[job]->flags &= ~J_NOTIFIED;
2523
2524           /* Kill process in backquotes or one started without job control? */
2525           if (jobs[job]->pgrp == shell_pgrp)
2526             {
2527               p = jobs[job]->pipe;
2528
2529               do
2530                 {
2531                   kill (p->pid, sig);
2532                   if (p->running == PS_DONE && (sig == SIGTERM || sig == SIGHUP))
2533                     kill (p->pid, SIGCONT);
2534                   p = p->next;
2535                 }
2536               while (p != jobs[job]->pipe);
2537             }
2538           else
2539             {
2540               result = killpg (jobs[job]->pgrp, sig);
2541               if (p && STOPPED (job) && (sig == SIGTERM || sig == SIGHUP))
2542                 killpg (jobs[job]->pgrp, SIGCONT);
2543               /* If we're continuing a stopped job via kill rather than bg or
2544                  fg, emulate the `bg' behavior. */
2545               if (p && STOPPED (job) && (sig == SIGCONT))
2546                 {
2547                   set_job_running (job);
2548                   jobs[job]->flags &= ~J_FOREGROUND;
2549                   jobs[job]->flags |= J_NOTIFIED;
2550                 }
2551             }
2552         }
2553       else
2554         result = killpg (pid, sig);
2555
2556       UNBLOCK_CHILD (oset);
2557     }
2558   else
2559     result = kill (pid, sig);
2560
2561   return (result);
2562 }
2563
2564 /* sigchld_handler () flushes at least one of the children that we are
2565    waiting for.  It gets run when we have gotten a SIGCHLD signal. */
2566 static sighandler
2567 sigchld_handler (sig)
2568      int sig;
2569 {
2570   int n, oerrno;
2571
2572   oerrno = errno;
2573   REINSTALL_SIGCHLD_HANDLER;
2574   sigchld++;
2575   n = 0;
2576   if (queue_sigchld == 0)
2577     n = waitchld (-1, 0);
2578   errno = oerrno;
2579   SIGRETURN (n);
2580 }
2581
2582 /* waitchld() reaps dead or stopped children.  It's called by wait_for and
2583    sigchld_handler, and runs until there aren't any children terminating any
2584    more.
2585    If BLOCK is 1, this is to be a blocking wait for a single child, although
2586    an arriving SIGCHLD could cause the wait to be non-blocking.  It returns
2587    the number of children reaped, or -1 if there are no unwaited-for child
2588    processes. */
2589 static int
2590 waitchld (wpid, block)
2591      pid_t wpid;
2592      int block;
2593 {
2594   WAIT status;
2595   PROCESS *child;
2596   pid_t pid;
2597   int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
2598
2599   call_set_current = children_exited = 0;
2600   last_stopped_job = NO_JOB;
2601
2602   do
2603     {
2604       /* We don't want to be notified about jobs stopping if job control
2605          is not active.  XXX - was interactive_shell instead of job_control */
2606       waitpid_flags = (job_control && subshell_environment == 0)
2607                         ? (WUNTRACED|WCONTINUED)
2608                         : 0;
2609       if (sigchld || block == 0)
2610         waitpid_flags |= WNOHANG;
2611       pid = WAITPID (-1, &status, waitpid_flags);
2612
2613       /* The check for WNOHANG is to make sure we decrement sigchld only
2614          if it was non-zero before we called waitpid. */
2615       if (sigchld > 0 && (waitpid_flags & WNOHANG))
2616         sigchld--;
2617   
2618       /* If waitpid returns -1 with errno == ECHILD, there are no more
2619          unwaited-for child processes of this shell. */
2620       if (pid < 0 && errno == ECHILD)
2621         {
2622           if (children_exited == 0)
2623             return -1;
2624           else
2625             break;
2626         }
2627
2628       /* If waitpid returns 0, there are running children.  If it returns -1,
2629          the only other error POSIX says it can return is EINTR. */
2630       if (pid <= 0)
2631         continue;       /* jumps right to the test */
2632
2633       /* children_exited is used to run traps on SIGCHLD.  We don't want to
2634          run the trap if a process is just being continued. */
2635       if (WIFCONTINUED(status) == 0)
2636         children_exited++;
2637
2638       /* Locate our PROCESS for this pid. */
2639       child = find_pipeline (pid, 1, &job);     /* want running procs only */
2640
2641       /* It is not an error to have a child terminate that we did
2642          not have a record of.  This child could have been part of
2643          a pipeline in backquote substitution.  Even so, I'm not
2644          sure child is ever non-zero. */
2645       if (child == 0)
2646         continue;
2647
2648       while (child->pid != pid)
2649         child = child->next;
2650
2651       /* Remember status, and whether or not the process is running. */
2652       child->status = status;
2653       child->running = WIFCONTINUED(status) ? PS_RUNNING : PS_DONE;
2654
2655       if (child->running == PS_DONE)
2656         {
2657           js.c_totreaped++;
2658           if (job != NO_JOB)
2659             js.c_reaped++;
2660         }
2661         
2662       if (job == NO_JOB)
2663         continue;
2664
2665       call_set_current += set_job_status_and_cleanup (job);
2666
2667       if (STOPPED (job))
2668         last_stopped_job = job;
2669       else if (DEADJOB (job) && last_stopped_job == job)
2670         last_stopped_job = NO_JOB;
2671     }
2672   while ((sigchld || block == 0) && pid > (pid_t)0);
2673
2674   /* If a job was running and became stopped, then set the current
2675      job.  Otherwise, don't change a thing. */
2676   if (call_set_current)
2677     {
2678       if (last_stopped_job != NO_JOB)
2679         set_current_job (last_stopped_job);
2680       else
2681         reset_current ();
2682     }
2683
2684   /* Call a SIGCHLD trap handler for each child that exits, if one is set. */
2685   if (job_control && signal_is_trapped (SIGCHLD) && children_exited &&
2686       trap_list[SIGCHLD] != (char *)IGNORE_SIG)
2687     run_sigchld_trap (children_exited);
2688
2689   /* We have successfully recorded the useful information about this process
2690      that has just changed state.  If we notify asynchronously, and the job
2691      that this process belongs to is no longer running, then notify the user
2692      of that fact now. */
2693   if (asynchronous_notification && interactive)
2694     notify_of_job_status ();
2695
2696   return (children_exited);
2697 }
2698
2699 /* Set the status of JOB and perform any necessary cleanup if the job is
2700    marked as JDEAD.
2701
2702    Currently, the cleanup activity is restricted to handling any SIGINT
2703    received while waiting for a foreground job to finish. */
2704 static int
2705 set_job_status_and_cleanup (job)
2706      int job;
2707 {
2708   PROCESS *child;
2709   int tstatus, job_state, any_stopped, any_tstped, call_set_current;
2710   SigHandler *temp_handler;
2711
2712   child = jobs[job]->pipe;
2713   jobs[job]->flags &= ~J_NOTIFIED;
2714
2715   call_set_current = 0;
2716
2717   /*
2718    * COMPUTE JOB STATUS
2719    */
2720
2721   /* If all children are not running, but any of them is  stopped, then
2722      the job is stopped, not dead. */
2723   job_state = any_stopped = any_tstped = 0;
2724   do
2725     {
2726       job_state |= child->running;
2727       if (child->running == PS_DONE && (WIFSTOPPED (child->status)))
2728         {
2729           any_stopped = 1;
2730           any_tstped |= interactive && job_control &&
2731                             (WSTOPSIG (child->status) == SIGTSTP);
2732         }
2733       child = child->next;
2734     }
2735   while (child != jobs[job]->pipe);
2736
2737   /* If job_state != 0, the job is still running, so don't bother with
2738      setting the process exit status and job state unless we're
2739      transitioning from stopped to running. */
2740   if (job_state != 0 && JOBSTATE(job) != JSTOPPED)
2741     return 0;
2742
2743   /*
2744    * SET JOB STATUS
2745    */
2746
2747   /* The job is either stopped or dead.  Set the state of the job accordingly. */
2748   if (any_stopped)
2749     {
2750       jobs[job]->state = JSTOPPED;
2751       jobs[job]->flags &= ~J_FOREGROUND;
2752       call_set_current++;
2753       /* Suspending a job with SIGTSTP breaks all active loops. */
2754       if (any_tstped && loop_level)
2755         breaking = loop_level;
2756     }
2757   else if (job_state != 0)      /* was stopped, now running */
2758     {
2759       jobs[job]->state = JRUNNING;
2760       call_set_current++;
2761     }
2762   else
2763     {
2764       jobs[job]->state = JDEAD;
2765       js.j_ndead++;
2766
2767 #if 0
2768       if (IS_FOREGROUND (job))
2769         setjstatus (job);
2770 #endif
2771
2772       /* If this job has a cleanup function associated with it, call it
2773          with `cleanarg' as the single argument, then set the function
2774          pointer to NULL so it is not inadvertently called twice.  The
2775          cleanup function is responsible for deallocating cleanarg. */
2776       if (jobs[job]->j_cleanup)
2777         {
2778           (*jobs[job]->j_cleanup) (jobs[job]->cleanarg);
2779           jobs[job]->j_cleanup = (sh_vptrfunc_t *)NULL;
2780         }
2781     }
2782
2783   /*
2784    * CLEANUP
2785    *
2786    * Currently, we just do special things if we got a SIGINT while waiting
2787    * for a foreground job to complete
2788    */
2789
2790   if (JOBSTATE (job) == JDEAD)
2791     {
2792       /* If we're running a shell script and we get a SIGINT with a
2793          SIGINT trap handler, but the foreground job handles it and
2794          does not exit due to SIGINT, run the trap handler but do not
2795          otherwise act as if we got the interrupt. */
2796       if (wait_sigint_received && interactive_shell == 0 &&
2797           WIFSIGNALED (child->status) == 0 && IS_FOREGROUND (job) &&
2798           signal_is_trapped (SIGINT))
2799         {
2800           int old_frozen;
2801           wait_sigint_received = 0;
2802           last_command_exit_value = process_exit_status (child->status);
2803
2804           old_frozen = jobs_list_frozen;
2805           jobs_list_frozen = 1;
2806           tstatus = maybe_call_trap_handler (SIGINT);
2807           jobs_list_frozen = old_frozen;
2808         }
2809
2810       /* If the foreground job is killed by SIGINT when job control is not
2811          active, we need to perform some special handling.
2812
2813          The check of wait_sigint_received is a way to determine if the
2814          SIGINT came from the keyboard (in which case the shell has already
2815          seen it, and wait_sigint_received is non-zero, because keyboard
2816          signals are sent to process groups) or via kill(2) to the foreground
2817          process by another process (or itself).  If the shell did receive the
2818          SIGINT, it needs to perform normal SIGINT processing. */
2819       else if (wait_sigint_received && (WTERMSIG (child->status) == SIGINT) &&
2820               IS_FOREGROUND (job) && IS_JOBCONTROL (job) == 0)
2821         {
2822           int old_frozen;
2823
2824           wait_sigint_received = 0;
2825
2826           /* If SIGINT is trapped, set the exit status so that the trap
2827              handler can see it. */
2828           if (signal_is_trapped (SIGINT))
2829             last_command_exit_value = process_exit_status (child->status);
2830
2831           /* If the signal is trapped, let the trap handler get it no matter
2832              what and simply return if the trap handler returns.
2833             maybe_call_trap_handler() may cause dead jobs to be removed from
2834             the job table because of a call to execute_command.  We work
2835             around this by setting JOBS_LIST_FROZEN. */
2836           old_frozen = jobs_list_frozen;
2837           jobs_list_frozen = 1;
2838           tstatus = maybe_call_trap_handler (SIGINT);
2839           jobs_list_frozen = old_frozen;
2840           if (tstatus == 0 && old_sigint_handler != INVALID_SIGNAL_HANDLER)
2841             {
2842               /* wait_sigint_handler () has already seen SIGINT and
2843                  allowed the wait builtin to jump out.  We need to
2844                  call the original SIGINT handler, if necessary.  If
2845                  the original handler is SIG_DFL, we need to resend
2846                  the signal to ourselves. */
2847
2848               temp_handler = old_sigint_handler;
2849
2850               /* Bogus.  If we've reset the signal handler as the result
2851                  of a trap caught on SIGINT, then old_sigint_handler
2852                  will point to trap_handler, which now knows nothing about
2853                  SIGINT (if we reset the sighandler to the default).
2854                  In this case, we have to fix things up.  What a crock. */
2855               if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0)
2856                   temp_handler = trap_to_sighandler (SIGINT);
2857                 restore_sigint_handler ();
2858                 if (temp_handler == SIG_DFL)
2859                   termination_unwind_protect (SIGINT);
2860                 else if (temp_handler != SIG_IGN)
2861                   (*temp_handler) (SIGINT);
2862             }
2863         }
2864     }
2865
2866   return call_set_current;
2867 }
2868
2869 /* Build the array of values for the $PIPESTATUS variable from the set of
2870    exit statuses of all processes in the job J. */
2871 static void
2872 setjstatus (j)
2873      int j;
2874 {
2875 #if defined (ARRAY_VARS)
2876   register int i;
2877   register PROCESS *p;
2878
2879   for (i = 1, p = jobs[j]->pipe; p->next != jobs[j]->pipe; p = p->next, i++)
2880     ;
2881   i++;
2882   if (statsize < i)
2883     {
2884       pstatuses = (int *)xrealloc (pstatuses, i * sizeof (int));
2885       statsize = i;
2886     }
2887   i = 0;
2888   p = jobs[j]->pipe;
2889   do
2890     {
2891       pstatuses[i++] = process_exit_status (p->status);
2892       p = p->next;
2893     }
2894   while (p != jobs[j]->pipe);
2895
2896   pstatuses[i] = -1;    /* sentinel */
2897   set_pipestatus_array (pstatuses, i);
2898 #endif
2899 }
2900
2901 static void
2902 run_sigchld_trap (nchild)
2903      int nchild;
2904 {
2905   char *trap_command;
2906   int i;
2907
2908   /* Turn off the trap list during the call to parse_and_execute ()
2909      to avoid potentially infinite recursive calls.  Preserve the
2910      values of last_command_exit_value, last_made_pid, and the_pipeline
2911      around the execution of the trap commands. */
2912   trap_command = savestring (trap_list[SIGCHLD]);
2913
2914   begin_unwind_frame ("SIGCHLD trap");
2915   unwind_protect_int (last_command_exit_value);
2916   unwind_protect_int (last_command_exit_signal);
2917   unwind_protect_var (last_made_pid);
2918   unwind_protect_int (interrupt_immediately);
2919   unwind_protect_int (jobs_list_frozen);
2920   unwind_protect_pointer (the_pipeline);
2921   unwind_protect_pointer (subst_assign_varlist);
2922
2923   /* We have to add the commands this way because they will be run
2924      in reverse order of adding.  We don't want maybe_set_sigchld_trap ()
2925      to reference freed memory. */
2926   add_unwind_protect (xfree, trap_command);
2927   add_unwind_protect (maybe_set_sigchld_trap, trap_command);
2928
2929   subst_assign_varlist = (WORD_LIST *)NULL;
2930   the_pipeline = (PROCESS *)NULL;
2931
2932   restore_default_signal (SIGCHLD);
2933   jobs_list_frozen = 1;
2934   for (i = 0; i < nchild; i++)
2935     {
2936       interrupt_immediately = 1;
2937       parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE);
2938     }
2939
2940   run_unwind_frame ("SIGCHLD trap");
2941 }
2942
2943 /* Function to call when you want to notify people of changes
2944    in job status.  This prints out all jobs which are pending
2945    notification to stderr, and marks those printed as already
2946    notified, thus making them candidates for cleanup. */
2947 static void
2948 notify_of_job_status ()
2949 {
2950   register int job, termsig;
2951   char *dir;
2952   sigset_t set, oset;
2953   WAIT s;
2954
2955   if (jobs == 0 || js.j_jobslots == 0)
2956     return;
2957
2958   if (old_ttou != 0)
2959     {
2960       sigemptyset (&set);
2961       sigaddset (&set, SIGCHLD);
2962       sigaddset (&set, SIGTTOU);
2963       sigemptyset (&oset);
2964       sigprocmask (SIG_BLOCK, &set, &oset);
2965     }
2966   else
2967     queue_sigchld++;
2968
2969   /* XXX could use js.j_firstj here */
2970   for (job = 0, dir = (char *)NULL; job < js.j_jobslots; job++)
2971     {
2972       if (jobs[job] && IS_NOTIFIED (job) == 0)
2973         {
2974           s = raw_job_exit_status (job);
2975           termsig = WTERMSIG (s);
2976
2977           /* POSIX.2 says we have to hang onto the statuses of at most the
2978              last CHILD_MAX background processes if the shell is running a
2979              script.  If the shell is not interactive, don't print anything
2980              unless the job was killed by a signal. */
2981           if (startup_state == 0 && WIFSIGNALED (s) == 0 &&
2982                 ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job)))
2983             continue;
2984           
2985 #if 0
2986           /* If job control is disabled, don't print the status messages.
2987              Mark dead jobs as notified so that they get cleaned up.  If
2988              startup_state == 2, we were started to run `-c command', so
2989              don't print anything. */
2990           if ((job_control == 0 && interactive_shell) || startup_state == 2)
2991 #else
2992           /* If job control is disabled, don't print the status messages.
2993              Mark dead jobs as notified so that they get cleaned up.  If
2994              startup_state == 2 and subshell_environment has the
2995              SUBSHELL_COMSUB bit turned on, we were started to run a command
2996              substitution, so don't print anything. */
2997           if ((job_control == 0 && interactive_shell) ||
2998               (startup_state == 2 && (subshell_environment & SUBSHELL_COMSUB)))
2999 #endif
3000             {
3001               /* POSIX.2 compatibility:  if the shell is not interactive,
3002                  hang onto the job corresponding to the last asynchronous
3003                  pid until the user has been notified of its status or does
3004                  a `wait'. */
3005               if (DEADJOB (job) && (interactive_shell || (find_last_pid (job, 0) != last_asynchronous_pid)))
3006                 jobs[job]->flags |= J_NOTIFIED;
3007               continue;
3008             }
3009
3010           /* Print info on jobs that are running in the background,
3011              and on foreground jobs that were killed by anything
3012              except SIGINT (and possibly SIGPIPE). */
3013           switch (JOBSTATE (job))
3014             {
3015             case JDEAD:
3016               if (interactive_shell == 0 && termsig && WIFSIGNALED (s) &&
3017                   termsig != SIGINT &&
3018 #if defined (DONT_REPORT_SIGPIPE)
3019                   termsig != SIGPIPE &&
3020 #endif
3021                   signal_is_trapped (termsig) == 0)
3022                 {
3023                   /* Don't print `0' for a line number. */
3024                   fprintf (stderr, "%s: line %d: ", get_name_for_error (), (line_number == 0) ? 1 : line_number);
3025                   pretty_print_job (job, JLIST_NONINTERACTIVE, stderr);
3026                 }
3027               else if (IS_FOREGROUND (job))
3028                 {
3029 #if !defined (DONT_REPORT_SIGPIPE)
3030                   if (termsig && WIFSIGNALED (s) && termsig != SIGINT)
3031 #else
3032                   if (termsig && WIFSIGNALED (s) && termsig != SIGINT && termsig != SIGPIPE)
3033 #endif
3034                     {
3035                       fprintf (stderr, "%s", j_strsignal (termsig));
3036
3037                       if (WIFCORED (s))
3038                         fprintf (stderr, " (core dumped)");
3039
3040                       fprintf (stderr, "\n");
3041                     }
3042                 }
3043               else
3044                 {
3045                   if (dir == 0)
3046                     dir = current_working_directory ();
3047                   pretty_print_job (job, JLIST_STANDARD, stderr);
3048                   if (dir && strcmp (dir, jobs[job]->wd) != 0)
3049                     fprintf (stderr,
3050                              "(wd now: %s)\n", polite_directory_format (dir));
3051                 }
3052
3053               jobs[job]->flags |= J_NOTIFIED;
3054               break;
3055
3056             case JSTOPPED:
3057               fprintf (stderr, "\n");
3058               if (dir == 0)
3059                 dir = current_working_directory ();
3060               pretty_print_job (job, JLIST_STANDARD, stderr);
3061               if (dir && (strcmp (dir, jobs[job]->wd) != 0))
3062                 fprintf (stderr,
3063                          "(wd now: %s)\n", polite_directory_format (dir));
3064               jobs[job]->flags |= J_NOTIFIED;
3065               break;
3066
3067             case JRUNNING:
3068             case JMIXED:
3069               break;
3070
3071             default:
3072               programming_error ("notify_of_job_status");
3073             }
3074         }
3075     }
3076   if (old_ttou != 0)
3077     sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3078   else
3079     queue_sigchld--;
3080 }
3081
3082 /* Initialize the job control mechanism, and set up the tty stuff. */
3083 int
3084 initialize_job_control (force)
3085      int force;
3086 {
3087   shell_pgrp = getpgid (0);
3088
3089   if (shell_pgrp == -1)
3090     {
3091       sys_error ("initialize_job_control: getpgrp failed");
3092       exit (1);
3093     }
3094
3095   /* We can only have job control if we are interactive. */
3096   if (interactive == 0)
3097     {
3098       job_control = 0;
3099       original_pgrp = NO_PID;
3100       shell_tty = fileno (stderr);
3101     }
3102   else
3103     {
3104       /* Get our controlling terminal.  If job_control is set, or
3105          interactive is set, then this is an interactive shell no
3106          matter where fd 2 is directed. */
3107       shell_tty = dup (fileno (stderr));        /* fd 2 */
3108
3109       shell_tty = move_to_high_fd (shell_tty, 1, -1);
3110
3111       /* Compensate for a bug in systems that compiled the BSD
3112          rlogind with DEBUG defined, like NeXT and Alliant. */
3113       if (shell_pgrp == 0)
3114         {
3115           shell_pgrp = getpid ();
3116           setpgid (0, shell_pgrp);
3117           tcsetpgrp (shell_tty, shell_pgrp);
3118         }
3119
3120       while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)
3121         {
3122           if (shell_pgrp != terminal_pgrp)
3123             {
3124               SigHandler *ottin;
3125
3126               ottin = set_signal_handler(SIGTTIN, SIG_DFL);
3127               kill (0, SIGTTIN);
3128               set_signal_handler (SIGTTIN, ottin);
3129               continue;
3130             }
3131           break;
3132         }
3133
3134       /* Make sure that we are using the new line discipline. */
3135       if (set_new_line_discipline (shell_tty) < 0)
3136         {
3137           sys_error ("initialize_job_control: line discipline");
3138           job_control = 0;
3139         }
3140       else
3141         {
3142           original_pgrp = shell_pgrp;
3143           shell_pgrp = getpid ();
3144
3145           if ((original_pgrp != shell_pgrp) && (setpgid (0, shell_pgrp) < 0))
3146             {
3147               sys_error ("initialize_job_control: setpgid");
3148               shell_pgrp = original_pgrp;
3149             }
3150
3151           job_control = 1;
3152
3153           /* If (and only if) we just set our process group to our pid,
3154              thereby becoming a process group leader, and the terminal
3155              is not in the same process group as our (new) process group,
3156              then set the terminal's process group to our (new) process
3157              group.  If that fails, set our process group back to what it
3158              was originally (so we can still read from the terminal) and
3159              turn off job control.  */
3160           if (shell_pgrp != original_pgrp && shell_pgrp != terminal_pgrp)
3161             {
3162               if (give_terminal_to (shell_pgrp, 0) < 0)
3163                 {
3164                   setpgid (0, original_pgrp);
3165                   shell_pgrp = original_pgrp;
3166                   job_control = 0;
3167                 }
3168             }
3169         }
3170       if (job_control == 0)
3171         internal_error (_("no job control in this shell"));
3172     }
3173
3174   if (shell_tty != fileno (stderr))
3175     SET_CLOSE_ON_EXEC (shell_tty);
3176
3177   set_signal_handler (SIGCHLD, sigchld_handler);
3178
3179   change_flag ('m', job_control ? '-' : '+');
3180
3181   if (interactive)
3182     get_tty_state ();
3183
3184   return job_control;
3185 }
3186
3187 #ifdef DEBUG
3188 void
3189 debug_print_pgrps ()
3190 {
3191   itrace("original_pgrp = %ld shell_pgrp = %ld terminal_pgrp = %ld",
3192          (long)original_pgrp, (long)shell_pgrp, (long)terminal_pgrp);
3193   itrace("tcgetpgrp(%d) -> %ld, getpgid(0) -> %ld",
3194          shell_tty, (long)tcgetpgrp (shell_tty), (long)getpgid(0));
3195 }
3196 #endif
3197
3198 /* Set the line discipline to the best this system has to offer.
3199    Return -1 if this is not possible. */
3200 static int
3201 set_new_line_discipline (tty)
3202      int tty;
3203 {
3204 #if defined (NEW_TTY_DRIVER)
3205   int ldisc;
3206
3207   if (ioctl (tty, TIOCGETD, &ldisc) < 0)
3208     return (-1);
3209
3210   if (ldisc != NTTYDISC)
3211     {
3212       ldisc = NTTYDISC;
3213
3214       if (ioctl (tty, TIOCSETD, &ldisc) < 0)
3215         return (-1);
3216     }
3217   return (0);
3218 #endif /* NEW_TTY_DRIVER */
3219
3220 #if defined (TERMIO_TTY_DRIVER)
3221 #  if defined (TERMIO_LDISC) && (NTTYDISC)
3222   if (ioctl (tty, TCGETA, &shell_tty_info) < 0)
3223     return (-1);
3224
3225   if (shell_tty_info.c_line != NTTYDISC)
3226     {
3227       shell_tty_info.c_line = NTTYDISC;
3228       if (ioctl (tty, TCSETAW, &shell_tty_info) < 0)
3229         return (-1);
3230     }
3231 #  endif /* TERMIO_LDISC && NTTYDISC */
3232   return (0);
3233 #endif /* TERMIO_TTY_DRIVER */
3234
3235 #if defined (TERMIOS_TTY_DRIVER)
3236 #  if defined (TERMIOS_LDISC) && defined (NTTYDISC)
3237   if (tcgetattr (tty, &shell_tty_info) < 0)
3238     return (-1);
3239
3240   if (shell_tty_info.c_line != NTTYDISC)
3241     {
3242       shell_tty_info.c_line = NTTYDISC;
3243       if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
3244         return (-1);
3245     }
3246 #  endif /* TERMIOS_LDISC && NTTYDISC */
3247   return (0);
3248 #endif /* TERMIOS_TTY_DRIVER */
3249
3250 #if !defined (NEW_TTY_DRIVER) && !defined (TERMIO_TTY_DRIVER) && !defined (TERMIOS_TTY_DRIVER)
3251   return (-1);
3252 #endif
3253 }
3254
3255 #if defined (TIOCGWINSZ) && defined (SIGWINCH)
3256 static void
3257 get_new_window_size (from_sig)
3258      int from_sig;
3259 {
3260   struct winsize win;
3261
3262   if ((ioctl (shell_tty, TIOCGWINSZ, &win) == 0) &&
3263       win.ws_row > 0 && win.ws_col > 0)
3264     {
3265 #if defined (aixpc)
3266       shell_tty_info.c_winsize = win;   /* structure copying */
3267 #endif
3268       sh_set_lines_and_columns (win.ws_row, win.ws_col);
3269 #if defined (READLINE)
3270       rl_set_screen_size (win.ws_row, win.ws_col);
3271 #endif
3272     }
3273 }
3274
3275 static sighandler
3276 sigwinch_sighandler (sig)
3277      int sig;
3278 {
3279 #if defined (MUST_REINSTALL_SIGHANDLERS)
3280   set_signal_handler (SIGWINCH, sigwinch_sighandler);
3281 #endif /* MUST_REINSTALL_SIGHANDLERS */
3282   get_new_window_size (1);
3283   SIGRETURN (0);
3284 }
3285 #else
3286 static void
3287 get_new_window_size (from_sig)
3288      int from_sig;
3289 {
3290 }
3291 #endif /* TIOCGWINSZ && SIGWINCH */
3292
3293 void
3294 set_sigwinch_handler ()
3295 {
3296 #if defined (TIOCGWINSZ) && defined (SIGWINCH)
3297  old_winch = set_signal_handler (SIGWINCH, sigwinch_sighandler);
3298 #endif
3299 }
3300
3301 void
3302 unset_sigwinch_handler ()
3303 {
3304 #if defined (TIOCGWINSZ) && defined (SIGWINCH)
3305   set_signal_handler (SIGWINCH, old_winch);
3306 #endif
3307 }
3308
3309 /* Setup this shell to handle C-C, etc. */
3310 void
3311 initialize_job_signals ()
3312 {
3313   if (interactive)
3314     {
3315       set_signal_handler (SIGINT, sigint_sighandler);
3316       set_signal_handler (SIGTSTP, SIG_IGN);
3317       set_signal_handler (SIGTTOU, SIG_IGN);
3318       set_signal_handler (SIGTTIN, SIG_IGN);
3319       set_sigwinch_handler ();
3320     }
3321   else if (job_control)
3322     {
3323       old_tstp = set_signal_handler (SIGTSTP, sigstop_sighandler);
3324       old_ttin = set_signal_handler (SIGTTIN, sigstop_sighandler);
3325       old_ttou = set_signal_handler (SIGTTOU, sigstop_sighandler);
3326     }
3327   /* Leave these things alone for non-interactive shells without job
3328      control. */
3329 }
3330
3331 /* Here we handle CONT signals. */
3332 static sighandler
3333 sigcont_sighandler (sig)
3334      int sig;
3335 {
3336   initialize_job_signals ();
3337   set_signal_handler (SIGCONT, old_cont);
3338   kill (getpid (), SIGCONT);
3339
3340   SIGRETURN (0);
3341 }
3342
3343 /* Here we handle stop signals while we are running not as a login shell. */
3344 static sighandler
3345 sigstop_sighandler (sig)
3346      int sig;
3347 {
3348   set_signal_handler (SIGTSTP, old_tstp);
3349   set_signal_handler (SIGTTOU, old_ttou);
3350   set_signal_handler (SIGTTIN, old_ttin);
3351
3352   old_cont = set_signal_handler (SIGCONT, sigcont_sighandler);
3353
3354   give_terminal_to (shell_pgrp, 0);
3355
3356   kill (getpid (), sig);
3357
3358   SIGRETURN (0);
3359 }
3360
3361 /* Give the terminal to PGRP.  */
3362 int
3363 give_terminal_to (pgrp, force)
3364      pid_t pgrp;
3365      int force;
3366 {
3367   sigset_t set, oset;
3368   int r;
3369
3370   r = 0;
3371   if (job_control || force)
3372     {
3373       sigemptyset (&set);
3374       sigaddset (&set, SIGTTOU);
3375       sigaddset (&set, SIGTTIN);
3376       sigaddset (&set, SIGTSTP);
3377       sigaddset (&set, SIGCHLD);
3378       sigemptyset (&oset);
3379       sigprocmask (SIG_BLOCK, &set, &oset);
3380
3381       if (tcsetpgrp (shell_tty, pgrp) < 0)
3382         {
3383           /* Maybe we should print an error message? */
3384 #if 0
3385           sys_error ("tcsetpgrp(%d) failed: pid %ld to pgrp %ld",
3386             shell_tty, (long)getpid(), (long)pgrp);
3387 #endif
3388           r = -1;
3389         }
3390       else
3391         terminal_pgrp = pgrp;
3392       sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3393     }
3394
3395   return r;
3396 }
3397
3398 /* Clear out any jobs in the job array.  This is intended to be used by
3399    children of the shell, who should not have any job structures as baggage
3400    when they start executing (forking subshells for parenthesized execution
3401    and functions with pipes are the two that spring to mind).  If RUNNING_ONLY
3402    is nonzero, only running jobs are removed from the table. */
3403 void
3404 delete_all_jobs (running_only)
3405      int running_only;
3406 {
3407   register int i;
3408   sigset_t set, oset;
3409
3410   BLOCK_CHILD (set, oset);
3411
3412   /* XXX - need to set j_lastj, j_firstj appropriately if running_only != 0. */
3413   if (js.j_jobslots)
3414     {
3415       js.j_current = js.j_previous = NO_JOB;
3416
3417       /* XXX could use js.j_firstj here */
3418       for (i = 0; i < js.j_jobslots; i++)
3419 {
3420 if (i < js.j_firstj && jobs[i])
3421   itrace("delete_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3422         if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
3423           delete_job (i, 1);
3424 }
3425       if (running_only == 0)
3426         {
3427           free ((char *)jobs);
3428           js.j_jobslots = 0;
3429           js.j_firstj = js.j_lastj = js.j_njobs = 0;
3430         }
3431     }
3432
3433   UNBLOCK_CHILD (oset);
3434 }
3435
3436 /* Mark all jobs in the job array so that they don't get a SIGHUP when the
3437    shell gets one.  If RUNNING_ONLY is nonzero, mark only running jobs. */
3438 void
3439 nohup_all_jobs (running_only)
3440      int running_only;
3441 {
3442   register int i;
3443   sigset_t set, oset;
3444
3445   BLOCK_CHILD (set, oset);
3446
3447   if (js.j_jobslots)
3448     {
3449       /* XXX could use js.j_firstj here */
3450       for (i = 0; i < js.j_jobslots; i++)
3451         if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
3452           nohup_job (i);
3453     }
3454
3455   UNBLOCK_CHILD (oset);
3456 }
3457
3458 int
3459 count_all_jobs ()
3460 {
3461   int i, n;
3462   sigset_t set, oset;
3463
3464   /* This really counts all non-dead jobs. */
3465   BLOCK_CHILD (set, oset);
3466   /* XXX could use js.j_firstj here */
3467   for (i = n = 0; i < js.j_jobslots; i++)
3468 {
3469 if (i < js.j_firstj && jobs[i])
3470   itrace("count_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3471     if (jobs[i] && DEADJOB(i) == 0)
3472       n++;
3473 }
3474   UNBLOCK_CHILD (oset);
3475   return n;
3476 }
3477
3478 static void
3479 mark_all_jobs_as_dead ()
3480 {
3481   register int i;
3482   sigset_t set, oset;
3483
3484   if (js.j_jobslots == 0)
3485     return;
3486
3487   BLOCK_CHILD (set, oset);
3488
3489   /* XXX could use js.j_firstj here */
3490   for (i = 0; i < js.j_jobslots; i++)
3491     if (jobs[i])
3492       {
3493         jobs[i]->state = JDEAD;
3494         js.j_ndead++;
3495       }
3496
3497   UNBLOCK_CHILD (oset);
3498 }
3499
3500 /* Mark all dead jobs as notified, so delete_job () cleans them out
3501    of the job table properly.  POSIX.2 says we need to save the
3502    status of the last CHILD_MAX jobs, so we count the number of dead
3503    jobs and mark only enough as notified to save CHILD_MAX statuses. */
3504 static void
3505 mark_dead_jobs_as_notified (force)
3506      int force;
3507 {
3508   register int i, ndead, ndeadproc;
3509   sigset_t set, oset;
3510
3511   if (js.j_jobslots == 0)
3512     return;
3513
3514   BLOCK_CHILD (set, oset);
3515
3516   /* If FORCE is non-zero, we don't have to keep CHILD_MAX statuses
3517      around; just run through the array. */
3518   if (force)
3519     {
3520     /* XXX could use js.j_firstj here */
3521       for (i = 0; i < js.j_jobslots; i++)
3522         {
3523           if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
3524             jobs[i]->flags |= J_NOTIFIED;
3525         }
3526       UNBLOCK_CHILD (oset);
3527       return;
3528     }
3529
3530   /* Mark enough dead jobs as notified to keep CHILD_MAX processes left in the
3531      array with the corresponding not marked as notified. */
3532           
3533   /* Count the number of dead jobs */
3534   /* XXX could use js.j_firstj here */
3535   for (i = ndead = ndeadproc = 0; i < js.j_jobslots; i++)
3536     {
3537 if (i < js.j_firstj && jobs[i])
3538   itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3539       if (jobs[i] && DEADJOB (i))
3540         {
3541           ndead++;
3542           ndeadproc += processes_in_job (i);
3543         }
3544     }
3545
3546 if (ndeadproc != js.c_reaped)
3547   itrace("mark_dead_jobs_as_notified: ndeadproc (%d) != js.c_reaped (%d)", ndeadproc, js.c_reaped);
3548 if (ndead != js.j_ndead)
3549   itrace("mark_dead_jobs_as_notified: ndead (%d) != js.j_ndead (%d)", ndead, js.j_ndead);
3550
3551   if (js.c_childmax < 0)
3552     js.c_childmax = getmaxchild ();
3553   if (js.c_childmax < 0)
3554     js.c_childmax = DEFAULT_CHILD_MAX;
3555
3556   /* Don't do anything if the number of dead processes is less than CHILD_MAX
3557      and we're not forcing a cleanup. */
3558   if (ndeadproc <= js.c_childmax)
3559     {
3560       UNBLOCK_CHILD (oset);
3561       return;
3562     }
3563
3564   /* Mark enough dead jobs as notified that we keep CHILD_MAX jobs in
3565      the list.  This isn't exactly right yet; changes need to be made
3566      to stop_pipeline so we don't mark the newer jobs after we've
3567      created CHILD_MAX slots in the jobs array.  This needs to be
3568      integrated with a way to keep the jobs array from growing without
3569      bound.  Maybe we wrap back around to 0 after we reach some max
3570      limit, and there are sufficient job slots free (keep track of total
3571      size of jobs array (js.j_jobslots) and running count of number of jobs
3572      in jobs array.  Then keep a job index corresponding to the `oldest job'
3573      and start this loop there, wrapping around as necessary.  In effect,
3574      we turn the list into a circular buffer. */
3575   /* XXX could use js.j_firstj here */
3576   for (i = 0; i < js.j_jobslots; i++)
3577     {
3578       if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
3579         {
3580 if (i < js.j_firstj && jobs[i])
3581   itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3582           /* If marking this job as notified would drop us down below
3583              child_max, don't mark it so we can keep at least child_max
3584              statuses.  XXX -- need to check what Posix actually says
3585              about keeping statuses. */
3586           if ((ndeadproc -= processes_in_job (i)) <= js.c_childmax)
3587             break;
3588           jobs[i]->flags |= J_NOTIFIED;
3589         }
3590     }
3591
3592   UNBLOCK_CHILD (oset);
3593 }
3594
3595 /* Here to allow other parts of the shell (like the trap stuff) to
3596    unfreeze the jobs list. */
3597 void
3598 unfreeze_jobs_list ()
3599 {
3600   jobs_list_frozen = 0;
3601 }
3602
3603 /* Allow or disallow job control to take place.  Returns the old value
3604    of job_control. */
3605 int
3606 set_job_control (arg)
3607      int arg;
3608 {
3609   int old;
3610
3611   old = job_control;
3612   job_control = arg;
3613
3614   /* If we're turning on job control, reset pipeline_pgrp so make_child will
3615      put new child processes into the right pgrp */
3616   if (job_control != old && job_control)
3617     pipeline_pgrp = 0;
3618
3619   return (old);
3620 }
3621
3622 /* Turn off all traces of job control.  This is run by children of the shell
3623    which are going to do shellsy things, like wait (), etc. */
3624 void
3625 without_job_control ()
3626 {
3627   stop_making_children ();
3628   start_pipeline ();
3629   delete_all_jobs (0);
3630   set_job_control (0);
3631 }
3632
3633 /* If this shell is interactive, terminate all stopped jobs and
3634    restore the original terminal process group.  This is done
3635    before the `exec' builtin calls shell_execve. */
3636 void
3637 end_job_control ()
3638 {
3639   if (interactive_shell)                /* XXX - should it be interactive? */
3640     {
3641       terminate_stopped_jobs ();
3642
3643       if (original_pgrp >= 0)
3644         give_terminal_to (original_pgrp, 1);
3645     }
3646
3647   if (original_pgrp >= 0)
3648     setpgid (0, original_pgrp);
3649 }
3650
3651 /* Restart job control by closing shell tty and reinitializing.  This is
3652    called after an exec fails in an interactive shell and we do not exit. */
3653 void
3654 restart_job_control ()
3655 {
3656   if (shell_tty != -1)
3657     close (shell_tty);
3658   initialize_job_control (0);
3659 }
3660
3661 /* Set the handler to run when the shell receives a SIGCHLD signal. */
3662 void
3663 set_sigchld_handler ()
3664 {
3665   set_signal_handler (SIGCHLD, sigchld_handler);
3666 }
3667
3668 #if defined (PGRP_PIPE)
3669 /* Read from the read end of a pipe.  This is how the process group leader
3670    blocks until all of the processes in a pipeline have been made. */
3671 static void
3672 pipe_read (pp)
3673      int *pp;
3674 {
3675   char ch;
3676
3677   if (pp[1] >= 0)
3678     {
3679       close (pp[1]);
3680       pp[1] = -1;
3681     }
3682
3683   if (pp[0] >= 0)
3684     {
3685       while (read (pp[0], &ch, 1) == -1 && errno == EINTR)
3686         ;
3687     }
3688 }
3689
3690 /* Close the read and write ends of PP, an array of file descriptors. */
3691 static void
3692 pipe_close (pp)
3693      int *pp;
3694 {
3695   if (pp[0] >= 0)
3696     close (pp[0]);
3697
3698   if (pp[1] >= 0)
3699     close (pp[1]);
3700
3701   pp[0] = pp[1] = -1;
3702 }
3703
3704 /* Functional interface closes our local-to-job-control pipes. */
3705 void
3706 close_pgrp_pipe ()
3707 {
3708   pipe_close (pgrp_pipe);
3709 }
3710
3711 #endif /* PGRP_PIPE */