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