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