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