commit bash-20050519 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   static int wcontinued = WCONTINUED;   /* run-time fix for glibc problem */
2822
2823   call_set_current = children_exited = 0;
2824   last_stopped_job = NO_JOB;
2825
2826   do
2827     {
2828       /* We don't want to be notified about jobs stopping if job control
2829          is not active.  XXX - was interactive_shell instead of job_control */
2830       waitpid_flags = (job_control && subshell_environment == 0)
2831                         ? (WUNTRACED|wcontinued)
2832                         : 0;
2833       if (sigchld || block == 0)
2834         waitpid_flags |= WNOHANG;
2835       pid = WAITPID (-1, &status, waitpid_flags);
2836
2837       /* WCONTINUED may be rejected by waitpid as invalid even when defined */
2838       if (wcontinued && pid < 0 && errno == EINVAL)
2839         {
2840           wcontinued = 0;
2841           continue;     /* jump back to the test and retry without WCONTINUED */
2842         }
2843
2844       /* The check for WNOHANG is to make sure we decrement sigchld only
2845          if it was non-zero before we called waitpid. */
2846       if (sigchld > 0 && (waitpid_flags & WNOHANG))
2847         sigchld--;
2848   
2849       /* If waitpid returns -1 with errno == ECHILD, there are no more
2850          unwaited-for child processes of this shell. */
2851       if (pid < 0 && errno == ECHILD)
2852         {
2853           if (children_exited == 0)
2854             return -1;
2855           else
2856             break;
2857         }
2858
2859       /* If waitpid returns 0, there are running children.  If it returns -1,
2860          the only other error POSIX says it can return is EINTR. */
2861       if (pid <= 0)
2862         continue;       /* jumps right to the test */
2863
2864       /* children_exited is used to run traps on SIGCHLD.  We don't want to
2865          run the trap if a process is just being continued. */
2866       if (WIFCONTINUED(status) == 0)
2867         children_exited++;
2868
2869       /* Locate our PROCESS for this pid. */
2870       child = find_process (pid, 1, &job);      /* want living procs only */
2871
2872       /* It is not an error to have a child terminate that we did
2873          not have a record of.  This child could have been part of
2874          a pipeline in backquote substitution.  Even so, I'm not
2875          sure child is ever non-zero. */
2876       if (child == 0)
2877         continue;
2878
2879       /* Remember status, and whether or not the process is running. */
2880       child->status = status;
2881       child->running = WIFCONTINUED(status) ? PS_RUNNING : PS_DONE;
2882
2883       if (PEXITED (child))
2884         {
2885           js.c_totreaped++;
2886           if (job != NO_JOB)
2887             js.c_reaped++;
2888         }
2889         
2890       if (job == NO_JOB)
2891         continue;
2892
2893       call_set_current += set_job_status_and_cleanup (job);
2894
2895       if (STOPPED (job))
2896         last_stopped_job = job;
2897       else if (DEADJOB (job) && last_stopped_job == job)
2898         last_stopped_job = NO_JOB;
2899     }
2900   while ((sigchld || block == 0) && pid > (pid_t)0);
2901
2902   /* If a job was running and became stopped, then set the current
2903      job.  Otherwise, don't change a thing. */
2904   if (call_set_current)
2905     {
2906       if (last_stopped_job != NO_JOB)
2907         set_current_job (last_stopped_job);
2908       else
2909         reset_current ();
2910     }
2911
2912   /* Call a SIGCHLD trap handler for each child that exits, if one is set. */
2913   if (job_control && signal_is_trapped (SIGCHLD) && children_exited &&
2914       trap_list[SIGCHLD] != (char *)IGNORE_SIG)
2915     run_sigchld_trap (children_exited);
2916
2917   /* We have successfully recorded the useful information about this process
2918      that has just changed state.  If we notify asynchronously, and the job
2919      that this process belongs to is no longer running, then notify the user
2920      of that fact now. */
2921   if (asynchronous_notification && interactive)
2922     notify_of_job_status ();
2923
2924   return (children_exited);
2925 }
2926
2927 /* Set the status of JOB and perform any necessary cleanup if the job is
2928    marked as JDEAD.
2929
2930    Currently, the cleanup activity is restricted to handling any SIGINT
2931    received while waiting for a foreground job to finish. */
2932 static int
2933 set_job_status_and_cleanup (job)
2934      int job;
2935 {
2936   PROCESS *child;
2937   int tstatus, job_state, any_stopped, any_tstped, call_set_current;
2938   SigHandler *temp_handler;
2939
2940   child = jobs[job]->pipe;
2941   jobs[job]->flags &= ~J_NOTIFIED;
2942
2943   call_set_current = 0;
2944
2945   /*
2946    * COMPUTE JOB STATUS
2947    */
2948
2949   /* If all children are not running, but any of them is  stopped, then
2950      the job is stopped, not dead. */
2951   job_state = any_stopped = any_tstped = 0;
2952   do
2953     {
2954       job_state |= PRUNNING (child);
2955 #if 0
2956       if (PEXITED (child) && (WIFSTOPPED (child->status)))
2957 #else
2958       /* Only checking for WIFSTOPPED now, not for PS_DONE */
2959       if (PSTOPPED (child))
2960 #endif
2961         {
2962           any_stopped = 1;
2963           any_tstped |= interactive && job_control &&
2964                             (WSTOPSIG (child->status) == SIGTSTP);
2965         }
2966       child = child->next;
2967     }
2968   while (child != jobs[job]->pipe);
2969
2970   /* If job_state != 0, the job is still running, so don't bother with
2971      setting the process exit status and job state unless we're
2972      transitioning from stopped to running. */
2973   if (job_state != 0 && JOBSTATE(job) != JSTOPPED)
2974     return 0;
2975
2976   /*
2977    * SET JOB STATUS
2978    */
2979
2980   /* The job is either stopped or dead.  Set the state of the job accordingly. */
2981   if (any_stopped)
2982     {
2983       jobs[job]->state = JSTOPPED;
2984       jobs[job]->flags &= ~J_FOREGROUND;
2985       call_set_current++;
2986       /* Suspending a job with SIGTSTP breaks all active loops. */
2987       if (any_tstped && loop_level)
2988         breaking = loop_level;
2989     }
2990   else if (job_state != 0)      /* was stopped, now running */
2991     {
2992       jobs[job]->state = JRUNNING;
2993       call_set_current++;
2994     }
2995   else
2996     {
2997       jobs[job]->state = JDEAD;
2998       js.j_ndead++;
2999
3000 #if 0
3001       if (IS_FOREGROUND (job))
3002         setjstatus (job);
3003 #endif
3004
3005       /* If this job has a cleanup function associated with it, call it
3006          with `cleanarg' as the single argument, then set the function
3007          pointer to NULL so it is not inadvertently called twice.  The
3008          cleanup function is responsible for deallocating cleanarg. */
3009       if (jobs[job]->j_cleanup)
3010         {
3011           (*jobs[job]->j_cleanup) (jobs[job]->cleanarg);
3012           jobs[job]->j_cleanup = (sh_vptrfunc_t *)NULL;
3013         }
3014     }
3015
3016   /*
3017    * CLEANUP
3018    *
3019    * Currently, we just do special things if we got a SIGINT while waiting
3020    * for a foreground job to complete
3021    */
3022
3023   if (JOBSTATE (job) == JDEAD)
3024     {
3025       /* If we're running a shell script and we get a SIGINT with a
3026          SIGINT trap handler, but the foreground job handles it and
3027          does not exit due to SIGINT, run the trap handler but do not
3028          otherwise act as if we got the interrupt. */
3029       if (wait_sigint_received && interactive_shell == 0 &&
3030           WIFSIGNALED (child->status) == 0 && IS_FOREGROUND (job) &&
3031           signal_is_trapped (SIGINT))
3032         {
3033           int old_frozen;
3034           wait_sigint_received = 0;
3035           last_command_exit_value = process_exit_status (child->status);
3036
3037           old_frozen = jobs_list_frozen;
3038           jobs_list_frozen = 1;
3039           tstatus = maybe_call_trap_handler (SIGINT);
3040           jobs_list_frozen = old_frozen;
3041         }
3042
3043       /* If the foreground job is killed by SIGINT when job control is not
3044          active, we need to perform some special handling.
3045
3046          The check of wait_sigint_received is a way to determine if the
3047          SIGINT came from the keyboard (in which case the shell has already
3048          seen it, and wait_sigint_received is non-zero, because keyboard
3049          signals are sent to process groups) or via kill(2) to the foreground
3050          process by another process (or itself).  If the shell did receive the
3051          SIGINT, it needs to perform normal SIGINT processing. */
3052       else if (wait_sigint_received && (WTERMSIG (child->status) == SIGINT) &&
3053               IS_FOREGROUND (job) && IS_JOBCONTROL (job) == 0)
3054         {
3055           int old_frozen;
3056
3057           wait_sigint_received = 0;
3058
3059           /* If SIGINT is trapped, set the exit status so that the trap
3060              handler can see it. */
3061           if (signal_is_trapped (SIGINT))
3062             last_command_exit_value = process_exit_status (child->status);
3063
3064           /* If the signal is trapped, let the trap handler get it no matter
3065              what and simply return if the trap handler returns.
3066             maybe_call_trap_handler() may cause dead jobs to be removed from
3067             the job table because of a call to execute_command.  We work
3068             around this by setting JOBS_LIST_FROZEN. */
3069           old_frozen = jobs_list_frozen;
3070           jobs_list_frozen = 1;
3071           tstatus = maybe_call_trap_handler (SIGINT);
3072           jobs_list_frozen = old_frozen;
3073           if (tstatus == 0 && old_sigint_handler != INVALID_SIGNAL_HANDLER)
3074             {
3075               /* wait_sigint_handler () has already seen SIGINT and
3076                  allowed the wait builtin to jump out.  We need to
3077                  call the original SIGINT handler, if necessary.  If
3078                  the original handler is SIG_DFL, we need to resend
3079                  the signal to ourselves. */
3080
3081               temp_handler = old_sigint_handler;
3082
3083               /* Bogus.  If we've reset the signal handler as the result
3084                  of a trap caught on SIGINT, then old_sigint_handler
3085                  will point to trap_handler, which now knows nothing about
3086                  SIGINT (if we reset the sighandler to the default).
3087                  In this case, we have to fix things up.  What a crock. */
3088               if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0)
3089                   temp_handler = trap_to_sighandler (SIGINT);
3090                 restore_sigint_handler ();
3091                 if (temp_handler == SIG_DFL)
3092                   termination_unwind_protect (SIGINT);
3093                 else if (temp_handler != SIG_IGN)
3094                   (*temp_handler) (SIGINT);
3095             }
3096         }
3097     }
3098
3099   return call_set_current;
3100 }
3101
3102 /* Build the array of values for the $PIPESTATUS variable from the set of
3103    exit statuses of all processes in the job J. */
3104 static void
3105 setjstatus (j)
3106      int j;
3107 {
3108 #if defined (ARRAY_VARS)
3109   register int i;
3110   register PROCESS *p;
3111
3112   for (i = 1, p = jobs[j]->pipe; p->next != jobs[j]->pipe; p = p->next, i++)
3113     ;
3114   i++;
3115   if (statsize < i)
3116     {
3117       pstatuses = (int *)xrealloc (pstatuses, i * sizeof (int));
3118       statsize = i;
3119     }
3120   i = 0;
3121   p = jobs[j]->pipe;
3122   do
3123     {
3124       pstatuses[i++] = process_exit_status (p->status);
3125       p = p->next;
3126     }
3127   while (p != jobs[j]->pipe);
3128
3129   pstatuses[i] = -1;    /* sentinel */
3130   set_pipestatus_array (pstatuses, i);
3131 #endif
3132 }
3133
3134 static void
3135 run_sigchld_trap (nchild)
3136      int nchild;
3137 {
3138   char *trap_command;
3139   int i;
3140
3141   /* Turn off the trap list during the call to parse_and_execute ()
3142      to avoid potentially infinite recursive calls.  Preserve the
3143      values of last_command_exit_value, last_made_pid, and the_pipeline
3144      around the execution of the trap commands. */
3145   trap_command = savestring (trap_list[SIGCHLD]);
3146
3147   begin_unwind_frame ("SIGCHLD trap");
3148   unwind_protect_int (last_command_exit_value);
3149   unwind_protect_int (last_command_exit_signal);
3150   unwind_protect_var (last_made_pid);
3151   unwind_protect_int (interrupt_immediately);
3152   unwind_protect_int (jobs_list_frozen);
3153   unwind_protect_pointer (the_pipeline);
3154   unwind_protect_pointer (subst_assign_varlist);
3155
3156   /* We have to add the commands this way because they will be run
3157      in reverse order of adding.  We don't want maybe_set_sigchld_trap ()
3158      to reference freed memory. */
3159   add_unwind_protect (xfree, trap_command);
3160   add_unwind_protect (maybe_set_sigchld_trap, trap_command);
3161
3162   subst_assign_varlist = (WORD_LIST *)NULL;
3163   the_pipeline = (PROCESS *)NULL;
3164
3165   restore_default_signal (SIGCHLD);
3166   jobs_list_frozen = 1;
3167   for (i = 0; i < nchild; i++)
3168     {
3169       interrupt_immediately = 1;
3170       parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE);
3171     }
3172
3173   run_unwind_frame ("SIGCHLD trap");
3174 }
3175
3176 /* Function to call when you want to notify people of changes
3177    in job status.  This prints out all jobs which are pending
3178    notification to stderr, and marks those printed as already
3179    notified, thus making them candidates for cleanup. */
3180 static void
3181 notify_of_job_status ()
3182 {
3183   register int job, termsig;
3184   char *dir;
3185   sigset_t set, oset;
3186   WAIT s;
3187
3188   if (jobs == 0 || js.j_jobslots == 0)
3189     return;
3190
3191   if (old_ttou != 0)
3192     {
3193       sigemptyset (&set);
3194       sigaddset (&set, SIGCHLD);
3195       sigaddset (&set, SIGTTOU);
3196       sigemptyset (&oset);
3197       sigprocmask (SIG_BLOCK, &set, &oset);
3198     }
3199   else
3200     queue_sigchld++;
3201
3202   /* XXX could use js.j_firstj here */
3203   for (job = 0, dir = (char *)NULL; job < js.j_jobslots; job++)
3204     {
3205       if (jobs[job] && IS_NOTIFIED (job) == 0)
3206         {
3207           s = raw_job_exit_status (job);
3208           termsig = WTERMSIG (s);
3209
3210           /* POSIX.2 says we have to hang onto the statuses of at most the
3211              last CHILD_MAX background processes if the shell is running a
3212              script.  If the shell is not interactive, don't print anything
3213              unless the job was killed by a signal. */
3214           if (startup_state == 0 && WIFSIGNALED (s) == 0 &&
3215                 ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job)))
3216             continue;
3217           
3218 #if 0
3219           /* If job control is disabled, don't print the status messages.
3220              Mark dead jobs as notified so that they get cleaned up.  If
3221              startup_state == 2, we were started to run `-c command', so
3222              don't print anything. */
3223           if ((job_control == 0 && interactive_shell) || startup_state == 2)
3224 #else
3225           /* If job control is disabled, don't print the status messages.
3226              Mark dead jobs as notified so that they get cleaned up.  If
3227              startup_state == 2 and subshell_environment has the
3228              SUBSHELL_COMSUB bit turned on, we were started to run a command
3229              substitution, so don't print anything. */
3230           if ((job_control == 0 && interactive_shell) ||
3231               (startup_state == 2 && (subshell_environment & SUBSHELL_COMSUB)))
3232 #endif
3233             {
3234               /* POSIX.2 compatibility:  if the shell is not interactive,
3235                  hang onto the job corresponding to the last asynchronous
3236                  pid until the user has been notified of its status or does
3237                  a `wait'. */
3238               if (DEADJOB (job) && (interactive_shell || (find_last_pid (job, 0) != last_asynchronous_pid)))
3239                 jobs[job]->flags |= J_NOTIFIED;
3240               continue;
3241             }
3242
3243           /* Print info on jobs that are running in the background,
3244              and on foreground jobs that were killed by anything
3245              except SIGINT (and possibly SIGPIPE). */
3246           switch (JOBSTATE (job))
3247             {
3248             case JDEAD:
3249               if (interactive_shell == 0 && termsig && WIFSIGNALED (s) &&
3250                   termsig != SIGINT &&
3251 #if defined (DONT_REPORT_SIGPIPE)
3252                   termsig != SIGPIPE &&
3253 #endif
3254                   signal_is_trapped (termsig) == 0)
3255                 {
3256                   /* Don't print `0' for a line number. */
3257                   fprintf (stderr, "%s: line %d: ", get_name_for_error (), (line_number == 0) ? 1 : line_number);
3258                   pretty_print_job (job, JLIST_NONINTERACTIVE, stderr);
3259                 }
3260               else if (IS_FOREGROUND (job))
3261                 {
3262 #if !defined (DONT_REPORT_SIGPIPE)
3263                   if (termsig && WIFSIGNALED (s) && termsig != SIGINT)
3264 #else
3265                   if (termsig && WIFSIGNALED (s) && termsig != SIGINT && termsig != SIGPIPE)
3266 #endif
3267                     {
3268                       fprintf (stderr, "%s", j_strsignal (termsig));
3269
3270                       if (WIFCORED (s))
3271                         fprintf (stderr, " (core dumped)");
3272
3273                       fprintf (stderr, "\n");
3274                     }
3275                 }
3276               else
3277                 {
3278                   if (dir == 0)
3279                     dir = current_working_directory ();
3280                   pretty_print_job (job, JLIST_STANDARD, stderr);
3281                   if (dir && strcmp (dir, jobs[job]->wd) != 0)
3282                     fprintf (stderr,
3283                              "(wd now: %s)\n", polite_directory_format (dir));
3284                 }
3285
3286               jobs[job]->flags |= J_NOTIFIED;
3287               break;
3288
3289             case JSTOPPED:
3290               fprintf (stderr, "\n");
3291               if (dir == 0)
3292                 dir = current_working_directory ();
3293               pretty_print_job (job, JLIST_STANDARD, stderr);
3294               if (dir && (strcmp (dir, jobs[job]->wd) != 0))
3295                 fprintf (stderr,
3296                          "(wd now: %s)\n", polite_directory_format (dir));
3297               jobs[job]->flags |= J_NOTIFIED;
3298               break;
3299
3300             case JRUNNING:
3301             case JMIXED:
3302               break;
3303
3304             default:
3305               programming_error ("notify_of_job_status");
3306             }
3307         }
3308     }
3309   if (old_ttou != 0)
3310     sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3311   else
3312     queue_sigchld--;
3313 }
3314
3315 /* Initialize the job control mechanism, and set up the tty stuff. */
3316 int
3317 initialize_job_control (force)
3318      int force;
3319 {
3320   shell_pgrp = getpgid (0);
3321
3322   if (shell_pgrp == -1)
3323     {
3324       sys_error ("initialize_job_control: getpgrp failed");
3325       exit (1);
3326     }
3327
3328   /* We can only have job control if we are interactive. */
3329   if (interactive == 0)
3330     {
3331       job_control = 0;
3332       original_pgrp = NO_PID;
3333       shell_tty = fileno (stderr);
3334     }
3335   else
3336     {
3337       /* Get our controlling terminal.  If job_control is set, or
3338          interactive is set, then this is an interactive shell no
3339          matter where fd 2 is directed. */
3340       shell_tty = dup (fileno (stderr));        /* fd 2 */
3341
3342       shell_tty = move_to_high_fd (shell_tty, 1, -1);
3343
3344       /* Compensate for a bug in systems that compiled the BSD
3345          rlogind with DEBUG defined, like NeXT and Alliant. */
3346       if (shell_pgrp == 0)
3347         {
3348           shell_pgrp = getpid ();
3349           setpgid (0, shell_pgrp);
3350           tcsetpgrp (shell_tty, shell_pgrp);
3351         }
3352
3353       while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)
3354         {
3355           if (shell_pgrp != terminal_pgrp)
3356             {
3357               SigHandler *ottin;
3358
3359               ottin = set_signal_handler(SIGTTIN, SIG_DFL);
3360               kill (0, SIGTTIN);
3361               set_signal_handler (SIGTTIN, ottin);
3362               continue;
3363             }
3364           break;
3365         }
3366
3367       /* Make sure that we are using the new line discipline. */
3368       if (set_new_line_discipline (shell_tty) < 0)
3369         {
3370           sys_error ("initialize_job_control: line discipline");
3371           job_control = 0;
3372         }
3373       else
3374         {
3375           original_pgrp = shell_pgrp;
3376           shell_pgrp = getpid ();
3377
3378           if ((original_pgrp != shell_pgrp) && (setpgid (0, shell_pgrp) < 0))
3379             {
3380               sys_error ("initialize_job_control: setpgid");
3381               shell_pgrp = original_pgrp;
3382             }
3383
3384           job_control = 1;
3385
3386           /* If (and only if) we just set our process group to our pid,
3387              thereby becoming a process group leader, and the terminal
3388              is not in the same process group as our (new) process group,
3389              then set the terminal's process group to our (new) process
3390              group.  If that fails, set our process group back to what it
3391              was originally (so we can still read from the terminal) and
3392              turn off job control.  */
3393           if (shell_pgrp != original_pgrp && shell_pgrp != terminal_pgrp)
3394             {
3395               if (give_terminal_to (shell_pgrp, 0) < 0)
3396                 {
3397                   setpgid (0, original_pgrp);
3398                   shell_pgrp = original_pgrp;
3399                   job_control = 0;
3400                 }
3401             }
3402         }
3403       if (job_control == 0)
3404         internal_error (_("no job control in this shell"));
3405     }
3406
3407   if (shell_tty != fileno (stderr))
3408     SET_CLOSE_ON_EXEC (shell_tty);
3409
3410   set_signal_handler (SIGCHLD, sigchld_handler);
3411
3412   change_flag ('m', job_control ? '-' : '+');
3413
3414   if (interactive)
3415     get_tty_state ();
3416
3417   if (js.c_childmax < 0)
3418     js.c_childmax = getmaxchild ();
3419   if (js.c_childmax < 0)
3420     js.c_childmax = DEFAULT_CHILD_MAX;
3421
3422   return job_control;
3423 }
3424
3425 #ifdef DEBUG
3426 void
3427 debug_print_pgrps ()
3428 {
3429   itrace("original_pgrp = %ld shell_pgrp = %ld terminal_pgrp = %ld",
3430          (long)original_pgrp, (long)shell_pgrp, (long)terminal_pgrp);
3431   itrace("tcgetpgrp(%d) -> %ld, getpgid(0) -> %ld",
3432          shell_tty, (long)tcgetpgrp (shell_tty), (long)getpgid(0));
3433 }
3434 #endif
3435
3436 /* Set the line discipline to the best this system has to offer.
3437    Return -1 if this is not possible. */
3438 static int
3439 set_new_line_discipline (tty)
3440      int tty;
3441 {
3442 #if defined (NEW_TTY_DRIVER)
3443   int ldisc;
3444
3445   if (ioctl (tty, TIOCGETD, &ldisc) < 0)
3446     return (-1);
3447
3448   if (ldisc != NTTYDISC)
3449     {
3450       ldisc = NTTYDISC;
3451
3452       if (ioctl (tty, TIOCSETD, &ldisc) < 0)
3453         return (-1);
3454     }
3455   return (0);
3456 #endif /* NEW_TTY_DRIVER */
3457
3458 #if defined (TERMIO_TTY_DRIVER)
3459 #  if defined (TERMIO_LDISC) && (NTTYDISC)
3460   if (ioctl (tty, TCGETA, &shell_tty_info) < 0)
3461     return (-1);
3462
3463   if (shell_tty_info.c_line != NTTYDISC)
3464     {
3465       shell_tty_info.c_line = NTTYDISC;
3466       if (ioctl (tty, TCSETAW, &shell_tty_info) < 0)
3467         return (-1);
3468     }
3469 #  endif /* TERMIO_LDISC && NTTYDISC */
3470   return (0);
3471 #endif /* TERMIO_TTY_DRIVER */
3472
3473 #if defined (TERMIOS_TTY_DRIVER)
3474 #  if defined (TERMIOS_LDISC) && defined (NTTYDISC)
3475   if (tcgetattr (tty, &shell_tty_info) < 0)
3476     return (-1);
3477
3478   if (shell_tty_info.c_line != NTTYDISC)
3479     {
3480       shell_tty_info.c_line = NTTYDISC;
3481       if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
3482         return (-1);
3483     }
3484 #  endif /* TERMIOS_LDISC && NTTYDISC */
3485   return (0);
3486 #endif /* TERMIOS_TTY_DRIVER */
3487
3488 #if !defined (NEW_TTY_DRIVER) && !defined (TERMIO_TTY_DRIVER) && !defined (TERMIOS_TTY_DRIVER)
3489   return (-1);
3490 #endif
3491 }
3492
3493 #if defined (TIOCGWINSZ) && defined (SIGWINCH)
3494 static void
3495 get_new_window_size (from_sig)
3496      int from_sig;
3497 {
3498   struct winsize win;
3499
3500   if ((ioctl (shell_tty, TIOCGWINSZ, &win) == 0) &&
3501       win.ws_row > 0 && win.ws_col > 0)
3502     {
3503 #if defined (aixpc)
3504       shell_tty_info.c_winsize = win;   /* structure copying */
3505 #endif
3506       sh_set_lines_and_columns (win.ws_row, win.ws_col);
3507 #if defined (READLINE)
3508       rl_set_screen_size (win.ws_row, win.ws_col);
3509 #endif
3510     }
3511 }
3512
3513 static sighandler
3514 sigwinch_sighandler (sig)
3515      int sig;
3516 {
3517 #if defined (MUST_REINSTALL_SIGHANDLERS)
3518   set_signal_handler (SIGWINCH, sigwinch_sighandler);
3519 #endif /* MUST_REINSTALL_SIGHANDLERS */
3520   get_new_window_size (1);
3521   SIGRETURN (0);
3522 }
3523 #else
3524 static void
3525 get_new_window_size (from_sig)
3526      int from_sig;
3527 {
3528 }
3529 #endif /* TIOCGWINSZ && SIGWINCH */
3530
3531 void
3532 set_sigwinch_handler ()
3533 {
3534 #if defined (TIOCGWINSZ) && defined (SIGWINCH)
3535  old_winch = set_signal_handler (SIGWINCH, sigwinch_sighandler);
3536 #endif
3537 }
3538
3539 void
3540 unset_sigwinch_handler ()
3541 {
3542 #if defined (TIOCGWINSZ) && defined (SIGWINCH)
3543   set_signal_handler (SIGWINCH, old_winch);
3544 #endif
3545 }
3546
3547 /* Setup this shell to handle C-C, etc. */
3548 void
3549 initialize_job_signals ()
3550 {
3551   if (interactive)
3552     {
3553       set_signal_handler (SIGINT, sigint_sighandler);
3554       set_signal_handler (SIGTSTP, SIG_IGN);
3555       set_signal_handler (SIGTTOU, SIG_IGN);
3556       set_signal_handler (SIGTTIN, SIG_IGN);
3557       set_sigwinch_handler ();
3558     }
3559   else if (job_control)
3560     {
3561       old_tstp = set_signal_handler (SIGTSTP, sigstop_sighandler);
3562       old_ttin = set_signal_handler (SIGTTIN, sigstop_sighandler);
3563       old_ttou = set_signal_handler (SIGTTOU, sigstop_sighandler);
3564     }
3565   /* Leave these things alone for non-interactive shells without job
3566      control. */
3567 }
3568
3569 /* Here we handle CONT signals. */
3570 static sighandler
3571 sigcont_sighandler (sig)
3572      int sig;
3573 {
3574   initialize_job_signals ();
3575   set_signal_handler (SIGCONT, old_cont);
3576   kill (getpid (), SIGCONT);
3577
3578   SIGRETURN (0);
3579 }
3580
3581 /* Here we handle stop signals while we are running not as a login shell. */
3582 static sighandler
3583 sigstop_sighandler (sig)
3584      int sig;
3585 {
3586   set_signal_handler (SIGTSTP, old_tstp);
3587   set_signal_handler (SIGTTOU, old_ttou);
3588   set_signal_handler (SIGTTIN, old_ttin);
3589
3590   old_cont = set_signal_handler (SIGCONT, sigcont_sighandler);
3591
3592   give_terminal_to (shell_pgrp, 0);
3593
3594   kill (getpid (), sig);
3595
3596   SIGRETURN (0);
3597 }
3598
3599 /* Give the terminal to PGRP.  */
3600 int
3601 give_terminal_to (pgrp, force)
3602      pid_t pgrp;
3603      int force;
3604 {
3605   sigset_t set, oset;
3606   int r;
3607
3608   r = 0;
3609   if (job_control || force)
3610     {
3611       sigemptyset (&set);
3612       sigaddset (&set, SIGTTOU);
3613       sigaddset (&set, SIGTTIN);
3614       sigaddset (&set, SIGTSTP);
3615       sigaddset (&set, SIGCHLD);
3616       sigemptyset (&oset);
3617       sigprocmask (SIG_BLOCK, &set, &oset);
3618
3619       if (tcsetpgrp (shell_tty, pgrp) < 0)
3620         {
3621           /* Maybe we should print an error message? */
3622 #if 0
3623           sys_error ("tcsetpgrp(%d) failed: pid %ld to pgrp %ld",
3624             shell_tty, (long)getpid(), (long)pgrp);
3625 #endif
3626           r = -1;
3627         }
3628       else
3629         terminal_pgrp = pgrp;
3630       sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3631     }
3632
3633   return r;
3634 }
3635
3636 /* Clear out any jobs in the job array.  This is intended to be used by
3637    children of the shell, who should not have any job structures as baggage
3638    when they start executing (forking subshells for parenthesized execution
3639    and functions with pipes are the two that spring to mind).  If RUNNING_ONLY
3640    is nonzero, only running jobs are removed from the table. */
3641 void
3642 delete_all_jobs (running_only)
3643      int running_only;
3644 {
3645   register int i;
3646   sigset_t set, oset;
3647
3648   BLOCK_CHILD (set, oset);
3649
3650   /* XXX - need to set j_lastj, j_firstj appropriately if running_only != 0. */
3651   if (js.j_jobslots)
3652     {
3653       js.j_current = js.j_previous = NO_JOB;
3654
3655       /* XXX could use js.j_firstj here */
3656       for (i = 0; i < js.j_jobslots; i++)
3657 {
3658 if (i < js.j_firstj && jobs[i])
3659   itrace("delete_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3660         if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
3661           delete_job (i, 1);
3662 }
3663       if (running_only == 0)
3664         {
3665           free ((char *)jobs);
3666           js.j_jobslots = 0;
3667           js.j_firstj = js.j_lastj = js.j_njobs = 0;
3668         }
3669     }
3670
3671   if (running_only == 0)
3672     bgp_clear ();
3673
3674   UNBLOCK_CHILD (oset);
3675 }
3676
3677 /* Mark all jobs in the job array so that they don't get a SIGHUP when the
3678    shell gets one.  If RUNNING_ONLY is nonzero, mark only running jobs. */
3679 void
3680 nohup_all_jobs (running_only)
3681      int running_only;
3682 {
3683   register int i;
3684   sigset_t set, oset;
3685
3686   BLOCK_CHILD (set, oset);
3687
3688   if (js.j_jobslots)
3689     {
3690       /* XXX could use js.j_firstj here */
3691       for (i = 0; i < js.j_jobslots; i++)
3692         if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
3693           nohup_job (i);
3694     }
3695
3696   UNBLOCK_CHILD (oset);
3697 }
3698
3699 int
3700 count_all_jobs ()
3701 {
3702   int i, n;
3703   sigset_t set, oset;
3704
3705   /* This really counts all non-dead jobs. */
3706   BLOCK_CHILD (set, oset);
3707   /* XXX could use js.j_firstj here */
3708   for (i = n = 0; i < js.j_jobslots; i++)
3709 {
3710 if (i < js.j_firstj && jobs[i])
3711   itrace("count_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3712     if (jobs[i] && DEADJOB(i) == 0)
3713       n++;
3714 }
3715   UNBLOCK_CHILD (oset);
3716   return n;
3717 }
3718
3719 static void
3720 mark_all_jobs_as_dead ()
3721 {
3722   register int i;
3723   sigset_t set, oset;
3724
3725   if (js.j_jobslots == 0)
3726     return;
3727
3728   BLOCK_CHILD (set, oset);
3729
3730   /* XXX could use js.j_firstj here */
3731   for (i = 0; i < js.j_jobslots; i++)
3732     if (jobs[i])
3733       {
3734         jobs[i]->state = JDEAD;
3735         js.j_ndead++;
3736       }
3737
3738   UNBLOCK_CHILD (oset);
3739 }
3740
3741 /* Mark all dead jobs as notified, so delete_job () cleans them out
3742    of the job table properly.  POSIX.2 says we need to save the
3743    status of the last CHILD_MAX jobs, so we count the number of dead
3744    jobs and mark only enough as notified to save CHILD_MAX statuses. */
3745 static void
3746 mark_dead_jobs_as_notified (force)
3747      int force;
3748 {
3749   register int i, ndead, ndeadproc;
3750   sigset_t set, oset;
3751
3752   if (js.j_jobslots == 0)
3753     return;
3754
3755   BLOCK_CHILD (set, oset);
3756
3757   /* If FORCE is non-zero, we don't have to keep CHILD_MAX statuses
3758      around; just run through the array. */
3759   if (force)
3760     {
3761     /* XXX could use js.j_firstj here */
3762       for (i = 0; i < js.j_jobslots; i++)
3763         {
3764           if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
3765             jobs[i]->flags |= J_NOTIFIED;
3766         }
3767       UNBLOCK_CHILD (oset);
3768       return;
3769     }
3770
3771   /* Mark enough dead jobs as notified to keep CHILD_MAX processes left in the
3772      array with the corresponding not marked as notified.  This is a better
3773      way to avoid pid aliasing and reuse problems than keeping the POSIX-
3774      mandated CHILD_MAX jobs around.  delete_job() takes care of keeping the
3775      bgpids list regulated. */
3776           
3777   /* Count the number of dead jobs */
3778   /* XXX could use js.j_firstj here */
3779   for (i = ndead = ndeadproc = 0; i < js.j_jobslots; i++)
3780     {
3781 if (i < js.j_firstj && jobs[i])
3782   itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3783       if (jobs[i] && DEADJOB (i))
3784         {
3785           ndead++;
3786           ndeadproc += processes_in_job (i);
3787         }
3788     }
3789
3790 #ifdef DEBUG
3791   if (ndeadproc != js.c_reaped)
3792     itrace("mark_dead_jobs_as_notified: ndeadproc (%d) != js.c_reaped (%d)", ndeadproc, js.c_reaped);
3793   if (ndead != js.j_ndead)
3794     itrace("mark_dead_jobs_as_notified: ndead (%d) != js.j_ndead (%d)", ndead, js.j_ndead);
3795 #endif
3796
3797   if (js.c_childmax < 0)
3798     js.c_childmax = getmaxchild ();
3799   if (js.c_childmax < 0)
3800     js.c_childmax = DEFAULT_CHILD_MAX;
3801
3802   /* Don't do anything if the number of dead processes is less than CHILD_MAX
3803      and we're not forcing a cleanup. */
3804   if (ndeadproc <= js.c_childmax)
3805     {
3806       UNBLOCK_CHILD (oset);
3807       return;
3808     }
3809
3810 #if 0
3811 itrace("mark_dead_jobs_as_notified: child_max = %d ndead = %d ndeadproc = %d", js.c_childmax, ndead, ndeadproc);
3812 #endif
3813
3814   /* Mark enough dead jobs as notified that we keep CHILD_MAX jobs in
3815      the list.  This isn't exactly right yet; changes need to be made
3816      to stop_pipeline so we don't mark the newer jobs after we've
3817      created CHILD_MAX slots in the jobs array.  This needs to be
3818      integrated with a way to keep the jobs array from growing without
3819      bound.  Maybe we wrap back around to 0 after we reach some max
3820      limit, and there are sufficient job slots free (keep track of total
3821      size of jobs array (js.j_jobslots) and running count of number of jobs
3822      in jobs array.  Then keep a job index corresponding to the `oldest job'
3823      and start this loop there, wrapping around as necessary.  In effect,
3824      we turn the list into a circular buffer. */
3825   /* XXX could use js.j_firstj here */
3826   for (i = 0; i < js.j_jobslots; i++)
3827     {
3828       if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
3829         {
3830 if (i < js.j_firstj && jobs[i])
3831   itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3832           /* If marking this job as notified would drop us down below
3833              child_max, don't mark it so we can keep at least child_max
3834              statuses.  XXX -- need to check what Posix actually says
3835              about keeping statuses. */
3836           if ((ndeadproc -= processes_in_job (i)) <= js.c_childmax)
3837             break;
3838           jobs[i]->flags |= J_NOTIFIED;
3839         }
3840     }
3841
3842   UNBLOCK_CHILD (oset);
3843 }
3844
3845 /* Here to allow other parts of the shell (like the trap stuff) to
3846    unfreeze the jobs list. */
3847 void
3848 unfreeze_jobs_list ()
3849 {
3850   jobs_list_frozen = 0;
3851 }
3852
3853 /* Allow or disallow job control to take place.  Returns the old value
3854    of job_control. */
3855 int
3856 set_job_control (arg)
3857      int arg;
3858 {
3859   int old;
3860
3861   old = job_control;
3862   job_control = arg;
3863
3864   /* If we're turning on job control, reset pipeline_pgrp so make_child will
3865      put new child processes into the right pgrp */
3866   if (job_control != old && job_control)
3867     pipeline_pgrp = 0;
3868
3869   return (old);
3870 }
3871
3872 /* Turn off all traces of job control.  This is run by children of the shell
3873    which are going to do shellsy things, like wait (), etc. */
3874 void
3875 without_job_control ()
3876 {
3877   stop_making_children ();
3878   start_pipeline ();
3879   delete_all_jobs (0);
3880   set_job_control (0);
3881 }
3882
3883 /* If this shell is interactive, terminate all stopped jobs and
3884    restore the original terminal process group.  This is done
3885    before the `exec' builtin calls shell_execve. */
3886 void
3887 end_job_control ()
3888 {
3889   if (interactive_shell)                /* XXX - should it be interactive? */
3890     {
3891       terminate_stopped_jobs ();
3892
3893       if (original_pgrp >= 0)
3894         give_terminal_to (original_pgrp, 1);
3895     }
3896
3897   if (original_pgrp >= 0)
3898     setpgid (0, original_pgrp);
3899 }
3900
3901 /* Restart job control by closing shell tty and reinitializing.  This is
3902    called after an exec fails in an interactive shell and we do not exit. */
3903 void
3904 restart_job_control ()
3905 {
3906   if (shell_tty != -1)
3907     close (shell_tty);
3908   initialize_job_control (0);
3909 }
3910
3911 /* Set the handler to run when the shell receives a SIGCHLD signal. */
3912 void
3913 set_sigchld_handler ()
3914 {
3915   set_signal_handler (SIGCHLD, sigchld_handler);
3916 }
3917
3918 #if defined (PGRP_PIPE)
3919 /* Read from the read end of a pipe.  This is how the process group leader
3920    blocks until all of the processes in a pipeline have been made. */
3921 static void
3922 pipe_read (pp)
3923      int *pp;
3924 {
3925   char ch;
3926
3927   if (pp[1] >= 0)
3928     {
3929       close (pp[1]);
3930       pp[1] = -1;
3931     }
3932
3933   if (pp[0] >= 0)
3934     {
3935       while (read (pp[0], &ch, 1) == -1 && errno == EINTR)
3936         ;
3937     }
3938 }
3939
3940 /* Close the read and write ends of PP, an array of file descriptors. */
3941 static void
3942 pipe_close (pp)
3943      int *pp;
3944 {
3945   if (pp[0] >= 0)
3946     close (pp[0]);
3947
3948   if (pp[1] >= 0)
3949     close (pp[1]);
3950
3951   pp[0] = pp[1] = -1;
3952 }
3953
3954 /* Functional interface closes our local-to-job-control pipes. */
3955 void
3956 close_pgrp_pipe ()
3957 {
3958   pipe_close (pgrp_pipe);
3959 }
3960
3961 #endif /* PGRP_PIPE */