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