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