Bash-4.0 patchlevel 38
[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       sys_error ("fork: retry");
1712       if (sleep (forksleep) != 0)
1713         break;
1714       forksleep <<= 1;
1715     }
1716
1717   if (pid < 0)
1718     {
1719       sys_error ("fork");
1720
1721       /* Kill all of the processes in the current pipeline. */
1722       terminate_current_pipeline ();
1723
1724       /* Discard the current pipeline, if any. */
1725       if (the_pipeline)
1726         kill_current_pipeline ();
1727
1728       throw_to_top_level ();    /* Reset signals, etc. */
1729     }
1730
1731   if (pid == 0)
1732     {
1733       /* In the child.  Give this child the right process group, set the
1734          signals to the default state for a new process. */
1735       pid_t mypid;
1736
1737       mypid = getpid ();
1738 #if defined (BUFFERED_INPUT)
1739       /* Close default_buffered_input if it's > 0.  We don't close it if it's
1740          0 because that's the file descriptor used when redirecting input,
1741          and it's wrong to close the file in that case. */
1742       unset_bash_input (0);
1743 #endif /* BUFFERED_INPUT */
1744
1745       /* Restore top-level signal mask. */
1746       sigprocmask (SIG_SETMASK, &top_level_mask, (sigset_t *)NULL);
1747
1748       if (job_control)
1749         {
1750           /* All processes in this pipeline belong in the same
1751              process group. */
1752
1753           if (pipeline_pgrp == 0)       /* This is the first child. */
1754             pipeline_pgrp = mypid;
1755
1756           /* Check for running command in backquotes. */
1757           if (pipeline_pgrp == shell_pgrp)
1758             ignore_tty_job_signals ();
1759           else
1760             default_tty_job_signals ();
1761
1762           /* Set the process group before trying to mess with the terminal's
1763              process group.  This is mandated by POSIX. */
1764           /* This is in accordance with the Posix 1003.1 standard,
1765              section B.7.2.4, which says that trying to set the terminal
1766              process group with tcsetpgrp() to an unused pgrp value (like
1767              this would have for the first child) is an error.  Section
1768              B.4.3.3, p. 237 also covers this, in the context of job control
1769              shells. */
1770           if (setpgid (mypid, pipeline_pgrp) < 0)
1771             sys_error (_("child setpgid (%ld to %ld)"), (long)mypid, (long)pipeline_pgrp);
1772
1773           /* By convention (and assumption above), if
1774              pipeline_pgrp == shell_pgrp, we are making a child for
1775              command substitution.
1776              In this case, we don't want to give the terminal to the
1777              shell's process group (we could be in the middle of a
1778              pipeline, for example). */
1779           if (async_p == 0 && pipeline_pgrp != shell_pgrp && ((subshell_environment&SUBSHELL_ASYNC) == 0))
1780             give_terminal_to (pipeline_pgrp, 0);
1781
1782 #if defined (PGRP_PIPE)
1783           if (pipeline_pgrp == mypid)
1784             pipe_read (pgrp_pipe);
1785 #endif
1786         }
1787       else                      /* Without job control... */
1788         {
1789           if (pipeline_pgrp == 0)
1790             pipeline_pgrp = shell_pgrp;
1791
1792           /* If these signals are set to SIG_DFL, we encounter the curious
1793              situation of an interactive ^Z to a running process *working*
1794              and stopping the process, but being unable to do anything with
1795              that process to change its state.  On the other hand, if they
1796              are set to SIG_IGN, jobs started from scripts do not stop when
1797              the shell running the script gets a SIGTSTP and stops. */
1798
1799           default_tty_job_signals ();
1800         }
1801
1802 #if defined (PGRP_PIPE)
1803       /* Release the process group pipe, since our call to setpgid ()
1804          is done.  The last call to sh_closepipe is done in stop_pipeline. */
1805       sh_closepipe (pgrp_pipe);
1806 #endif /* PGRP_PIPE */
1807
1808 #if 0
1809       /* Don't set last_asynchronous_pid in the child */
1810       if (async_p)
1811         last_asynchronous_pid = mypid;          /* XXX */
1812       else
1813 #endif
1814 #if defined (RECYCLES_PIDS)
1815       if (last_asynchronous_pid == mypid)
1816         /* Avoid pid aliasing.  1 seems like a safe, unusual pid value. */
1817         last_asynchronous_pid = 1;
1818 #endif
1819     }
1820   else
1821     {
1822       /* In the parent.  Remember the pid of the child just created
1823          as the proper pgrp if this is the first child. */
1824
1825       if (first_pid == NO_PID)
1826         first_pid = pid;
1827       else if (pid_wrap == -1 && pid < first_pid)
1828         pid_wrap = 0;
1829       else if (pid_wrap == 0 && pid >= first_pid)
1830         pid_wrap = 1;
1831
1832       if (job_control)
1833         {
1834           if (pipeline_pgrp == 0)
1835             {
1836               pipeline_pgrp = pid;
1837               /* Don't twiddle terminal pgrps in the parent!  This is the bug,
1838                  not the good thing of twiddling them in the child! */
1839               /* give_terminal_to (pipeline_pgrp, 0); */
1840             }
1841           /* This is done on the recommendation of the Rationale section of
1842              the POSIX 1003.1 standard, where it discusses job control and
1843              shells.  It is done to avoid possible race conditions. (Ref.
1844              1003.1 Rationale, section B.4.3.3, page 236). */
1845           setpgid (pid, pipeline_pgrp);
1846         }
1847       else
1848         {
1849           if (pipeline_pgrp == 0)
1850             pipeline_pgrp = shell_pgrp;
1851         }
1852
1853       /* Place all processes into the jobs array regardless of the
1854          state of job_control. */
1855       add_process (command, pid);
1856
1857       if (async_p)
1858         last_asynchronous_pid = pid;
1859 #if defined (RECYCLES_PIDS)
1860       else if (last_asynchronous_pid == pid)
1861         /* Avoid pid aliasing.  1 seems like a safe, unusual pid value. */
1862         last_asynchronous_pid = 1;
1863 #endif
1864
1865       if (pid_wrap > 0)
1866         delete_old_job (pid);
1867
1868 #if !defined (RECYCLES_PIDS)
1869       /* Only check for saved status if we've saved more than CHILD_MAX
1870          statuses, unless the system recycles pids. */
1871       if ((js.c_reaped + bgpids.npid) >= js.c_childmax)
1872 #endif
1873         bgp_delete (pid);               /* new process, discard any saved status */
1874
1875       last_made_pid = pid;
1876
1877       /* keep stats */
1878       js.c_totforked++;
1879       js.c_living++;
1880
1881       /* Unblock SIGINT and SIGCHLD unless creating a pipeline, in which case
1882          SIGCHLD remains blocked until all commands in the pipeline have been
1883          created. */
1884       sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
1885     }
1886
1887   return (pid);
1888 }
1889
1890 /* These two functions are called only in child processes. */
1891 void
1892 ignore_tty_job_signals ()
1893 {
1894   set_signal_handler (SIGTSTP, SIG_IGN);
1895   set_signal_handler (SIGTTIN, SIG_IGN);
1896   set_signal_handler (SIGTTOU, SIG_IGN);
1897 }
1898
1899 void
1900 default_tty_job_signals ()
1901 {
1902   set_signal_handler (SIGTSTP, SIG_DFL);
1903   set_signal_handler (SIGTTIN, SIG_DFL);
1904   set_signal_handler (SIGTTOU, SIG_DFL);
1905 }
1906
1907 /* When we end a job abnormally, or if we stop a job, we set the tty to the
1908    state kept in here.  When a job ends normally, we set the state in here
1909    to the state of the tty. */
1910
1911 static TTYSTRUCT shell_tty_info;
1912
1913 #if defined (NEW_TTY_DRIVER)
1914 static struct tchars shell_tchars;
1915 static struct ltchars shell_ltchars;
1916 #endif /* NEW_TTY_DRIVER */
1917
1918 #if defined (NEW_TTY_DRIVER) && defined (DRAIN_OUTPUT)
1919 /* Since the BSD tty driver does not allow us to change the tty modes
1920    while simultaneously waiting for output to drain and preserving
1921    typeahead, we have to drain the output ourselves before calling
1922    ioctl.  We cheat by finding the length of the output queue, and
1923    using select to wait for an appropriate length of time.  This is
1924    a hack, and should be labeled as such (it's a hastily-adapted
1925    mutation of a `usleep' implementation).  It's only reason for
1926    existing is the flaw in the BSD tty driver. */
1927
1928 static int ttspeeds[] =
1929 {
1930   0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
1931   1800, 2400, 4800, 9600, 19200, 38400
1932 };
1933
1934 static void
1935 draino (fd, ospeed)
1936      int fd, ospeed;
1937 {
1938   register int delay = ttspeeds[ospeed];
1939   int n;
1940
1941   if (!delay)
1942     return;
1943
1944   while ((ioctl (fd, TIOCOUTQ, &n) == 0) && n)
1945     {
1946       if (n > (delay / 100))
1947         {
1948           struct timeval tv;
1949
1950           n *= 10;              /* 2 bits more for conservativeness. */
1951           tv.tv_sec = n / delay;
1952           tv.tv_usec = ((n % delay) * 1000000) / delay;
1953           select (fd, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
1954         }
1955       else
1956         break;
1957     }
1958 }
1959 #endif /* NEW_TTY_DRIVER && DRAIN_OUTPUT */
1960
1961 /* Return the fd from which we are actually getting input. */
1962 #define input_tty() (shell_tty != -1) ? shell_tty : fileno (stderr)
1963
1964 /* Fill the contents of shell_tty_info with the current tty info. */
1965 int
1966 get_tty_state ()
1967 {
1968   int tty;
1969
1970   tty = input_tty ();
1971   if (tty != -1)
1972     {
1973 #if defined (NEW_TTY_DRIVER)
1974       ioctl (tty, TIOCGETP, &shell_tty_info);
1975       ioctl (tty, TIOCGETC, &shell_tchars);
1976       ioctl (tty, TIOCGLTC, &shell_ltchars);
1977 #endif /* NEW_TTY_DRIVER */
1978
1979 #if defined (TERMIO_TTY_DRIVER)
1980       ioctl (tty, TCGETA, &shell_tty_info);
1981 #endif /* TERMIO_TTY_DRIVER */
1982
1983 #if defined (TERMIOS_TTY_DRIVER)
1984       if (tcgetattr (tty, &shell_tty_info) < 0)
1985         {
1986 #if 0
1987           /* Only print an error message if we're really interactive at
1988              this time. */
1989           if (interactive)
1990             sys_error ("[%ld: %d (%d)] tcgetattr", (long)getpid (), shell_level, tty);
1991 #endif
1992           return -1;
1993         }
1994 #endif /* TERMIOS_TTY_DRIVER */
1995       if (check_window_size)
1996         get_new_window_size (0, (int *)0, (int *)0);
1997     }
1998   return 0;
1999 }
2000
2001 /* Make the current tty use the state in shell_tty_info. */
2002 int
2003 set_tty_state ()
2004 {
2005   int tty;
2006
2007   tty = input_tty ();
2008   if (tty != -1)
2009     {
2010 #if defined (NEW_TTY_DRIVER)
2011 #  if defined (DRAIN_OUTPUT)
2012       draino (tty, shell_tty_info.sg_ospeed);
2013 #  endif /* DRAIN_OUTPUT */
2014       ioctl (tty, TIOCSETN, &shell_tty_info);
2015       ioctl (tty, TIOCSETC, &shell_tchars);
2016       ioctl (tty, TIOCSLTC, &shell_ltchars);
2017 #endif /* NEW_TTY_DRIVER */
2018
2019 #if defined (TERMIO_TTY_DRIVER)
2020       ioctl (tty, TCSETAW, &shell_tty_info);
2021 #endif /* TERMIO_TTY_DRIVER */
2022
2023 #if defined (TERMIOS_TTY_DRIVER)
2024       if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
2025         {
2026           /* Only print an error message if we're really interactive at
2027              this time. */
2028           if (interactive)
2029             sys_error ("[%ld: %d (%d)] tcsetattr", (long)getpid (), shell_level, tty);
2030           return -1;
2031         }
2032 #endif /* TERMIOS_TTY_DRIVER */
2033     }
2034   return 0;
2035 }
2036
2037 /* Given an index into the jobs array JOB, return the PROCESS struct of the last
2038    process in that job's pipeline.  This is the one whose exit status
2039    counts.  Must be called with SIGCHLD blocked or queued. */
2040 static PROCESS *
2041 find_last_proc (job, block)
2042      int job;
2043      int block;
2044 {
2045   register PROCESS *p;
2046   sigset_t set, oset;
2047
2048   if (block)
2049     BLOCK_CHILD (set, oset);
2050
2051   p = jobs[job]->pipe;
2052   while (p && p->next != jobs[job]->pipe)
2053     p = p->next;
2054
2055   if (block)
2056     UNBLOCK_CHILD (oset);
2057
2058   return (p);
2059 }
2060
2061 static pid_t
2062 find_last_pid (job, block)
2063      int job;
2064      int block;
2065 {
2066   PROCESS *p;
2067
2068   p = find_last_proc (job, block);
2069   /* Possible race condition here. */
2070   return p->pid;
2071 }     
2072
2073 /* Wait for a particular child of the shell to finish executing.
2074    This low-level function prints an error message if PID is not
2075    a child of this shell.  It returns -1 if it fails, or whatever
2076    wait_for returns otherwise.  If the child is not found in the
2077    jobs table, it returns 127. */
2078 int
2079 wait_for_single_pid (pid)
2080      pid_t pid;
2081 {
2082   register PROCESS *child;
2083   sigset_t set, oset;
2084   int r, job;
2085
2086   BLOCK_CHILD (set, oset);
2087   child = find_pipeline (pid, 0, (int *)NULL);
2088   UNBLOCK_CHILD (oset);
2089
2090   if (child == 0)
2091     {
2092       r = bgp_search (pid);
2093       if (r >= 0)
2094         return r;
2095     }
2096
2097   if (child == 0)
2098     {
2099       internal_error (_("wait: pid %ld is not a child of this shell"), (long)pid);
2100       return (127);
2101     }
2102
2103   r = wait_for (pid);
2104
2105   /* POSIX.2: if we just waited for a job, we can remove it from the jobs
2106      table. */
2107   BLOCK_CHILD (set, oset);
2108   job = find_job (pid, 0, NULL);
2109   if (job != NO_JOB && jobs[job] && DEADJOB (job))
2110     jobs[job]->flags |= J_NOTIFIED;
2111   UNBLOCK_CHILD (oset);
2112
2113   /* If running in posix mode, remove the job from the jobs table immediately */
2114   if (posixly_correct)
2115     {
2116       cleanup_dead_jobs ();
2117       bgp_delete (pid);
2118     }
2119
2120   return r;
2121 }
2122
2123 /* Wait for all of the backgrounds of this shell to finish. */
2124 void
2125 wait_for_background_pids ()
2126 {
2127   register int i, r, waited_for;
2128   sigset_t set, oset;
2129   pid_t pid;
2130
2131   for (waited_for = 0;;)
2132     {
2133       BLOCK_CHILD (set, oset);
2134
2135       /* find first running job; if none running in foreground, break */
2136       /* XXX could use js.j_firstj and js.j_lastj here */
2137       for (i = 0; i < js.j_jobslots; i++)
2138         {
2139 #if defined (DEBUG)
2140           if (i < js.j_firstj && jobs[i])
2141             itrace("wait_for_background_pids: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
2142           if (i > js.j_lastj && jobs[i])
2143             itrace("wait_for_background_pids: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
2144 #endif
2145           if (jobs[i] && RUNNING (i) && IS_FOREGROUND (i) == 0)
2146             break;
2147         }
2148       if (i == js.j_jobslots)
2149         {
2150           UNBLOCK_CHILD (oset);
2151           break;
2152         }
2153
2154       /* now wait for the last pid in that job. */
2155       pid = find_last_pid (i, 0);
2156       UNBLOCK_CHILD (oset);
2157       QUIT;
2158       errno = 0;                /* XXX */
2159       r = wait_for_single_pid (pid);
2160       if (r == -1)
2161         {
2162           /* If we're mistaken about job state, compensate. */
2163           if (errno == ECHILD)
2164             mark_all_jobs_as_dead ();
2165         }
2166       else
2167         waited_for++;
2168     }
2169
2170   /* POSIX.2 says the shell can discard the statuses of all completed jobs if
2171      `wait' is called with no arguments. */
2172   mark_dead_jobs_as_notified (1);
2173   cleanup_dead_jobs ();
2174   bgp_clear ();
2175 }
2176
2177 /* Make OLD_SIGINT_HANDLER the SIGINT signal handler. */
2178 #define INVALID_SIGNAL_HANDLER (SigHandler *)wait_for_background_pids
2179 static SigHandler *old_sigint_handler = INVALID_SIGNAL_HANDLER;
2180
2181 static void
2182 restore_sigint_handler ()
2183 {
2184   if (old_sigint_handler != INVALID_SIGNAL_HANDLER)
2185     {
2186       set_signal_handler (SIGINT, old_sigint_handler);
2187       old_sigint_handler = INVALID_SIGNAL_HANDLER;
2188     }
2189 }
2190
2191 static int wait_sigint_received;
2192
2193 /* Handle SIGINT while we are waiting for children in a script to exit.
2194    The `wait' builtin should be interruptible, but all others should be
2195    effectively ignored (i.e. not cause the shell to exit). */
2196 static sighandler
2197 wait_sigint_handler (sig)
2198      int sig;
2199 {
2200   SigHandler *sigint_handler;
2201
2202   if (interrupt_immediately ||
2203       (this_shell_builtin && this_shell_builtin == wait_builtin))
2204     {
2205       last_command_exit_value = EXECUTION_FAILURE;
2206       restore_sigint_handler ();
2207       /* If we got a SIGINT while in `wait', and SIGINT is trapped, do
2208          what POSIX.2 says (see builtins/wait.def for more info). */
2209       if (this_shell_builtin && this_shell_builtin == wait_builtin &&
2210           signal_is_trapped (SIGINT) &&
2211           ((sigint_handler = trap_to_sighandler (SIGINT)) == trap_handler))
2212         {
2213           interrupt_immediately = 0;
2214           trap_handler (SIGINT);        /* set pending_traps[SIGINT] */
2215           wait_signal_received = SIGINT;
2216           longjmp (wait_intr_buf, 1);
2217         }
2218       
2219       ADDINTERRUPT;
2220       QUIT;
2221     }
2222
2223   /* XXX - should this be interrupt_state?  If it is, the shell will act
2224      as if it got the SIGINT interrupt. */
2225   wait_sigint_received = 1;
2226
2227   /* Otherwise effectively ignore the SIGINT and allow the running job to
2228      be killed. */
2229   SIGRETURN (0);
2230 }
2231
2232 static int
2233 process_exit_signal (status)
2234      WAIT status;
2235 {
2236   return (WIFSIGNALED (status) ? WTERMSIG (status) : 0);
2237 }
2238
2239 static int
2240 process_exit_status (status)
2241      WAIT status;
2242 {
2243   if (WIFSIGNALED (status))
2244     return (128 + WTERMSIG (status));
2245   else if (WIFSTOPPED (status) == 0)
2246     return (WEXITSTATUS (status));
2247   else
2248     return (EXECUTION_SUCCESS);
2249 }
2250
2251 static WAIT
2252 job_signal_status (job)
2253      int job;
2254 {
2255   register PROCESS *p;
2256   WAIT s;
2257
2258   p = jobs[job]->pipe;
2259   do
2260     {
2261       s = p->status;
2262       if (WIFSIGNALED(s) || WIFSTOPPED(s))
2263         break;
2264       p = p->next;
2265     }
2266   while (p != jobs[job]->pipe);
2267
2268   return s;
2269 }
2270   
2271 /* Return the exit status of the last process in the pipeline for job JOB.
2272    This is the exit status of the entire job. */
2273 static WAIT
2274 raw_job_exit_status (job)
2275      int job;
2276 {
2277   register PROCESS *p;
2278   int fail;
2279   WAIT ret;
2280
2281   if (pipefail_opt)
2282     {
2283       fail = 0;
2284       p = jobs[job]->pipe;
2285       do
2286         {
2287           if (WSTATUS (p->status) != EXECUTION_SUCCESS)
2288             fail = WSTATUS(p->status);
2289           p = p->next;
2290         }
2291       while (p != jobs[job]->pipe);
2292       WSTATUS (ret) = fail;
2293       return ret;
2294     }
2295
2296   for (p = jobs[job]->pipe; p->next != jobs[job]->pipe; p = p->next)
2297     ;
2298   return (p->status);
2299 }
2300
2301 /* Return the exit status of job JOB.  This is the exit status of the last
2302    (rightmost) process in the job's pipeline, modified if the job was killed
2303    by a signal or stopped. */
2304 static int
2305 job_exit_status (job)
2306      int job;
2307 {
2308   return (process_exit_status (raw_job_exit_status (job)));
2309 }
2310
2311 static int
2312 job_exit_signal (job)
2313      int job;
2314 {
2315   return (process_exit_signal (raw_job_exit_status (job)));
2316 }
2317
2318 #define FIND_CHILD(pid, child) \
2319   do \
2320     { \
2321       child = find_pipeline (pid, 0, (int *)NULL); \
2322       if (child == 0) \
2323         { \
2324           give_terminal_to (shell_pgrp, 0); \
2325           UNBLOCK_CHILD (oset); \
2326           internal_error (_("wait_for: No record of process %ld"), (long)pid); \
2327           restore_sigint_handler (); \
2328           return (termination_state = 127); \
2329         } \
2330     } \
2331   while (0)
2332
2333 /* Wait for pid (one of our children) to terminate, then
2334    return the termination state.  Returns 127 if PID is not found in
2335    the jobs table.  Returns -1 if waitchld() returns -1, indicating
2336    that there are no unwaited-for child processes. */
2337 int
2338 wait_for (pid)
2339      pid_t pid;
2340 {
2341   int job, termination_state, r;
2342   WAIT s;
2343   register PROCESS *child;
2344   sigset_t set, oset;
2345   register PROCESS *p;
2346
2347   /* In the case that this code is interrupted, and we longjmp () out of it,
2348      we are relying on the code in throw_to_top_level () to restore the
2349      top-level signal mask. */
2350   BLOCK_CHILD (set, oset);
2351
2352   /* Ignore interrupts while waiting for a job run without job control
2353      to finish.  We don't want the shell to exit if an interrupt is
2354      received, only if one of the jobs run is killed via SIGINT.  If
2355      job control is not set, the job will be run in the same pgrp as
2356      the shell, and the shell will see any signals the job gets.  In
2357      fact, we want this set every time the waiting shell and the waited-
2358      for process are in the same process group, including command
2359      substitution. */
2360
2361   /* This is possibly a race condition -- should it go in stop_pipeline? */
2362   wait_sigint_received = 0;
2363   if (job_control == 0 || (subshell_environment&SUBSHELL_COMSUB))
2364     {
2365       old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
2366       if (old_sigint_handler == SIG_IGN)
2367         set_signal_handler (SIGINT, old_sigint_handler);
2368     }
2369
2370   termination_state = last_command_exit_value;
2371
2372   if (interactive && job_control == 0)
2373     QUIT;
2374
2375   /* If we say wait_for (), then we have a record of this child somewhere.
2376      If it and none of its peers are running, don't call waitchld(). */
2377
2378   job = NO_JOB;
2379   do
2380     {
2381       FIND_CHILD (pid, child);
2382
2383       /* If this child is part of a job, then we are really waiting for the
2384          job to finish.  Otherwise, we are waiting for the child to finish.
2385          We check for JDEAD in case the job state has been set by waitchld
2386          after receipt of a SIGCHLD. */
2387       if (job == NO_JOB)
2388         job = find_job (pid, 0, NULL);
2389
2390       /* waitchld() takes care of setting the state of the job.  If the job
2391          has already exited before this is called, sigchld_handler will have
2392          called waitchld and the state will be set to JDEAD. */
2393
2394       if (PRUNNING(child) || (job != NO_JOB && RUNNING (job)))
2395         {
2396 #if defined (WAITPID_BROKEN)    /* SCOv4 */
2397           sigset_t suspend_set;
2398           sigemptyset (&suspend_set);
2399           sigsuspend (&suspend_set);
2400 #else /* !WAITPID_BROKEN */
2401 #  if defined (MUST_UNBLOCK_CHLD)
2402           struct sigaction act, oact;
2403           sigset_t nullset, chldset;
2404
2405           sigemptyset (&nullset);
2406           sigemptyset (&chldset);
2407           sigprocmask (SIG_SETMASK, &nullset, &chldset);
2408           act.sa_handler = SIG_DFL;
2409           sigemptyset (&act.sa_mask);
2410           sigemptyset (&oact.sa_mask);
2411           act.sa_flags = 0;
2412           sigaction (SIGCHLD, &act, &oact);
2413 #  endif
2414           queue_sigchld = 1;
2415           r = waitchld (pid, 1);
2416 #  if defined (MUST_UNBLOCK_CHLD)
2417           sigaction (SIGCHLD, &oact, (struct sigaction *)NULL);
2418           sigprocmask (SIG_SETMASK, &chldset, (sigset_t *)NULL);
2419 #  endif
2420           queue_sigchld = 0;
2421           if (r == -1 && errno == ECHILD && this_shell_builtin == wait_builtin)
2422             {
2423               termination_state = -1;
2424               goto wait_for_return;
2425             }
2426
2427           /* If child is marked as running, but waitpid() returns -1/ECHILD,
2428              there is something wrong.  Somewhere, wait should have returned
2429              that child's pid.  Mark the child as not running and the job,
2430              if it exists, as JDEAD. */
2431           if (r == -1 && errno == ECHILD)
2432             {
2433               child->running = PS_DONE;
2434               WSTATUS (child->status) = 0;      /* XXX -- can't find true status */
2435               js.c_living = 0;          /* no living child processes */
2436               if (job != NO_JOB)
2437                 {
2438                   jobs[job]->state = JDEAD;
2439                   js.c_reaped++;
2440                   js.j_ndead++;
2441                 }
2442             }
2443 #endif /* WAITPID_BROKEN */
2444         }
2445
2446       /* If the shell is interactive, and job control is disabled, see
2447          if the foreground process has died due to SIGINT and jump out
2448          of the wait loop if it has.  waitchld has already restored the
2449          old SIGINT signal handler. */
2450       if (interactive && job_control == 0)
2451         QUIT;
2452     }
2453   while (PRUNNING (child) || (job != NO_JOB && RUNNING (job)));
2454
2455   /* The exit state of the command is either the termination state of the
2456      child, or the termination state of the job.  If a job, the status
2457      of the last child in the pipeline is the significant one.  If the command
2458      or job was terminated by a signal, note that value also. */
2459   termination_state = (job != NO_JOB) ? job_exit_status (job)
2460                                       : process_exit_status (child->status);
2461   last_command_exit_signal = (job != NO_JOB) ? job_exit_signal (job)
2462                                              : process_exit_signal (child->status);
2463
2464   /* XXX */
2465   if ((job != NO_JOB && JOBSTATE (job) == JSTOPPED) || WIFSTOPPED (child->status))
2466     termination_state = 128 + WSTOPSIG (child->status);
2467
2468   if (job == NO_JOB || IS_JOBCONTROL (job))
2469     {
2470       /* XXX - under what circumstances is a job not present in the jobs
2471          table (job == NO_JOB)?
2472                 1.  command substitution
2473
2474          In the case of command substitution, at least, it's probably not
2475          the right thing to give the terminal to the shell's process group,
2476          even though there is code in subst.c:command_substitute to work
2477          around it.
2478
2479          Things that don't:
2480                 $PROMPT_COMMAND execution
2481                 process substitution
2482        */
2483 #if 0
2484 if (job == NO_JOB)
2485   itrace("wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%ld)", (long)shell_pgrp);
2486 #endif
2487       give_terminal_to (shell_pgrp, 0);
2488     }
2489
2490   /* If the command did not exit cleanly, or the job is just
2491      being stopped, then reset the tty state back to what it
2492      was before this command.  Reset the tty state and notify
2493      the user of the job termination only if the shell is
2494      interactive.  Clean up any dead jobs in either case. */
2495   if (job != NO_JOB)
2496     {
2497       if (interactive_shell && subshell_environment == 0)
2498         {
2499           /* This used to use `child->status'.  That's wrong, however, for
2500              pipelines.  `child' is the first process in the pipeline.  It's
2501              likely that the process we want to check for abnormal termination
2502              or stopping is the last process in the pipeline, especially if
2503              it's long-lived and the first process is short-lived.  Since we
2504              know we have a job here, we can check all the processes in this
2505              job's pipeline and see if one of them stopped or terminated due
2506              to a signal.  We might want to change this later to just check
2507              the last process in the pipeline.  If no process exits due to a
2508              signal, S is left as the status of the last job in the pipeline. */
2509           s = job_signal_status (job);
2510
2511           if (WIFSIGNALED (s) || WIFSTOPPED (s))
2512             {
2513               set_tty_state ();
2514
2515               /* If the current job was stopped or killed by a signal, and
2516                  the user has requested it, get a possibly new window size */
2517               if (check_window_size && (job == js.j_current || IS_FOREGROUND (job)))
2518                 get_new_window_size (0, (int *)0, (int *)0);
2519             }
2520           else
2521             get_tty_state ();
2522
2523           /* If job control is enabled, the job was started with job
2524              control, the job was the foreground job, and it was killed
2525              by SIGINT, then print a newline to compensate for the kernel
2526              printing the ^C without a trailing newline. */
2527           if (job_control && IS_JOBCONTROL (job) && IS_FOREGROUND (job) &&
2528                 WIFSIGNALED (s) && WTERMSIG (s) == SIGINT)
2529             {
2530               /* If SIGINT is not trapped and the shell is in a for, while,
2531                  or until loop, act as if the shell received SIGINT as
2532                  well, so the loop can be broken.  This doesn't call the
2533                  SIGINT signal handler; maybe it should. */
2534               if (signal_is_trapped (SIGINT) == 0 && (loop_level || (shell_compatibility_level > 32 && executing_list)))
2535                 ADDINTERRUPT;
2536               else
2537                 {
2538                   putchar ('\n');
2539                   fflush (stdout);
2540                 }
2541             }
2542         }
2543       else if ((subshell_environment & SUBSHELL_COMSUB) && wait_sigint_received)
2544         {
2545           /* If waiting for a job in a subshell started to do command
2546              substitution, simulate getting and being killed by the SIGINT to
2547              pass the status back to our parent. */
2548           s = job_signal_status (job);
2549         
2550           if (WIFSIGNALED (s) && WTERMSIG (s) == SIGINT && signal_is_trapped (SIGINT) == 0)
2551             {
2552               UNBLOCK_CHILD (oset);
2553               restore_sigint_handler ();
2554               old_sigint_handler = set_signal_handler (SIGINT, SIG_DFL);
2555               if (old_sigint_handler == SIG_IGN)
2556                 restore_sigint_handler ();
2557               else
2558                 kill (getpid (), SIGINT);
2559             }
2560         }
2561
2562       /* Moved here from set_job_status_and_cleanup, which is in the SIGCHLD
2563          signal handler path */
2564       if (DEADJOB (job) && IS_FOREGROUND (job) /*&& subshell_environment == 0*/)
2565         setjstatus (job);
2566
2567       /* If this job is dead, notify the user of the status.  If the shell
2568          is interactive, this will display a message on the terminal.  If
2569          the shell is not interactive, make sure we turn on the notify bit
2570          so we don't get an unwanted message about the job's termination,
2571          and so delete_job really clears the slot in the jobs table. */
2572       notify_and_cleanup ();
2573     }
2574
2575 wait_for_return:
2576
2577   UNBLOCK_CHILD (oset);
2578
2579   /* Restore the original SIGINT signal handler before we return. */
2580   restore_sigint_handler ();
2581
2582   return (termination_state);
2583 }
2584
2585 /* Wait for the last process in the pipeline for JOB.  Returns whatever
2586    wait_for returns: the last process's termination state or -1 if there
2587    are no unwaited-for child processes or an error occurs. */
2588 int
2589 wait_for_job (job)
2590      int job;
2591 {
2592   pid_t pid;
2593   int r;
2594   sigset_t set, oset;
2595
2596   BLOCK_CHILD(set, oset);
2597   if (JOBSTATE (job) == JSTOPPED)
2598     internal_warning (_("wait_for_job: job %d is stopped"), job+1);
2599
2600   pid = find_last_pid (job, 0);
2601   UNBLOCK_CHILD(oset);
2602   r = wait_for (pid);
2603
2604   /* POSIX.2: we can remove the job from the jobs table if we just waited
2605      for it. */
2606   BLOCK_CHILD (set, oset);
2607   if (job != NO_JOB && jobs[job] && DEADJOB (job))
2608     jobs[job]->flags |= J_NOTIFIED;
2609   UNBLOCK_CHILD (oset);
2610
2611   return r;
2612 }
2613
2614 /* Print info about dead jobs, and then delete them from the list
2615    of known jobs.  This does not actually delete jobs when the
2616    shell is not interactive, because the dead jobs are not marked
2617    as notified. */
2618 void
2619 notify_and_cleanup ()
2620 {
2621   if (jobs_list_frozen)
2622     return;
2623
2624   if (interactive || interactive_shell == 0 || sourcelevel)
2625     notify_of_job_status ();
2626
2627   cleanup_dead_jobs ();
2628 }
2629
2630 /* Make dead jobs disappear from the jobs array without notification.
2631    This is used when the shell is not interactive. */
2632 void
2633 reap_dead_jobs ()
2634 {
2635   mark_dead_jobs_as_notified (0);
2636   cleanup_dead_jobs ();
2637 }
2638
2639 /* Return the next closest (chronologically) job to JOB which is in
2640    STATE.  STATE can be JSTOPPED, JRUNNING.  NO_JOB is returned if
2641    there is no next recent job. */
2642 static int
2643 most_recent_job_in_state (job, state)
2644      int job;
2645      JOB_STATE state;
2646 {
2647   register int i, result;
2648   sigset_t set, oset;
2649
2650   BLOCK_CHILD (set, oset);
2651
2652   for (result = NO_JOB, i = job - 1; i >= 0; i--)
2653     {
2654       if (jobs[i] && (JOBSTATE (i) == state))
2655         {
2656           result = i;
2657           break;
2658         }
2659     }
2660
2661   UNBLOCK_CHILD (oset);
2662
2663   return (result);
2664 }
2665
2666 /* Return the newest *stopped* job older than JOB, or NO_JOB if not
2667    found. */
2668 static int
2669 job_last_stopped (job)
2670      int job;
2671 {
2672   return (most_recent_job_in_state (job, JSTOPPED));
2673 }
2674
2675 /* Return the newest *running* job older than JOB, or NO_JOB if not
2676    found. */
2677 static int
2678 job_last_running (job)
2679      int job;
2680 {
2681   return (most_recent_job_in_state (job, JRUNNING));
2682 }
2683
2684 /* Make JOB be the current job, and make previous be useful.  Must be
2685    called with SIGCHLD blocked. */
2686 static void
2687 set_current_job (job)
2688      int job;
2689 {
2690   int candidate;
2691
2692   if (js.j_current != job)
2693     {
2694       js.j_previous = js.j_current;
2695       js.j_current = job;
2696     }
2697
2698   /* First choice for previous job is the old current job. */
2699   if (js.j_previous != js.j_current &&
2700       js.j_previous != NO_JOB &&
2701       jobs[js.j_previous] &&
2702       STOPPED (js.j_previous))
2703     return;
2704
2705   /* Second choice:  Newest stopped job that is older than
2706      the current job. */
2707   candidate = NO_JOB;
2708   if (STOPPED (js.j_current))
2709     {
2710       candidate = job_last_stopped (js.j_current);
2711
2712       if (candidate != NO_JOB)
2713         {
2714           js.j_previous = candidate;
2715           return;
2716         }
2717     }
2718
2719   /* If we get here, there is either only one stopped job, in which case it is
2720      the current job and the previous job should be set to the newest running
2721      job, or there are only running jobs and the previous job should be set to
2722      the newest running job older than the current job.  We decide on which
2723      alternative to use based on whether or not JOBSTATE(js.j_current) is
2724      JSTOPPED. */
2725
2726   candidate = RUNNING (js.j_current) ? job_last_running (js.j_current)
2727                                     : job_last_running (js.j_jobslots);
2728
2729   if (candidate != NO_JOB)
2730     {
2731       js.j_previous = candidate;
2732       return;
2733     }
2734
2735   /* There is only a single job, and it is both `+' and `-'. */
2736   js.j_previous = js.j_current;
2737 }
2738
2739 /* Make current_job be something useful, if it isn't already. */
2740
2741 /* Here's the deal:  The newest non-running job should be `+', and the
2742    next-newest non-running job should be `-'.  If there is only a single
2743    stopped job, the js.j_previous is the newest non-running job.  If there
2744    are only running jobs, the newest running job is `+' and the
2745    next-newest running job is `-'.  Must be called with SIGCHLD blocked. */
2746
2747 static void
2748 reset_current ()
2749 {
2750   int candidate;
2751
2752   if (js.j_jobslots && js.j_current != NO_JOB && jobs[js.j_current] && STOPPED (js.j_current))
2753     candidate = js.j_current;
2754   else
2755     {
2756       candidate = NO_JOB;
2757
2758       /* First choice: the previous job. */
2759       if (js.j_previous != NO_JOB && jobs[js.j_previous] && STOPPED (js.j_previous))
2760         candidate = js.j_previous;
2761
2762       /* Second choice: the most recently stopped job. */
2763       if (candidate == NO_JOB)
2764         candidate = job_last_stopped (js.j_jobslots);
2765
2766       /* Third choice: the newest running job. */
2767       if (candidate == NO_JOB)
2768         candidate = job_last_running (js.j_jobslots);
2769     }
2770
2771   /* If we found a job to use, then use it.  Otherwise, there
2772      are no jobs period. */
2773   if (candidate != NO_JOB)
2774     set_current_job (candidate);
2775   else
2776     js.j_current = js.j_previous = NO_JOB;
2777 }
2778
2779 /* Set up the job structures so we know the job and its processes are
2780    all running. */
2781 static void
2782 set_job_running (job)
2783      int job;
2784 {
2785   register PROCESS *p;
2786
2787   /* Each member of the pipeline is now running. */
2788   p = jobs[job]->pipe;
2789
2790   do
2791     {
2792       if (WIFSTOPPED (p->status))
2793         p->running = PS_RUNNING;        /* XXX - could be PS_STOPPED */
2794       p = p->next;
2795     }
2796   while (p != jobs[job]->pipe);
2797
2798   /* This means that the job is running. */
2799   JOBSTATE (job) = JRUNNING;
2800 }
2801
2802 /* Start a job.  FOREGROUND if non-zero says to do that.  Otherwise,
2803    start the job in the background.  JOB is a zero-based index into
2804    JOBS.  Returns -1 if it is unable to start a job, and the return
2805    status of the job otherwise. */
2806 int
2807 start_job (job, foreground)
2808      int job, foreground;
2809 {
2810   register PROCESS *p;
2811   int already_running;
2812   sigset_t set, oset;
2813   char *wd, *s;
2814   static TTYSTRUCT save_stty;
2815
2816   BLOCK_CHILD (set, oset);
2817
2818   if (DEADJOB (job))
2819     {
2820       internal_error (_("%s: job has terminated"), this_command_name);
2821       UNBLOCK_CHILD (oset);
2822       return (-1);
2823     }
2824
2825   already_running = RUNNING (job);
2826
2827   if (foreground == 0 && already_running)
2828     {
2829       internal_error (_("%s: job %d already in background"), this_command_name, job + 1);
2830       UNBLOCK_CHILD (oset);
2831       return (0);               /* XPG6/SUSv3 says this is not an error */
2832     }
2833
2834   wd = current_working_directory ();
2835
2836   /* You don't know about the state of this job.  Do you? */
2837   jobs[job]->flags &= ~J_NOTIFIED;
2838
2839   if (foreground)
2840     {
2841       set_current_job (job);
2842       jobs[job]->flags |= J_FOREGROUND;
2843     }
2844
2845   /* Tell the outside world what we're doing. */
2846   p = jobs[job]->pipe;
2847
2848   if (foreground == 0)
2849     {
2850       /* POSIX.2 says `bg' doesn't give any indication about current or
2851          previous job. */
2852       if (posixly_correct == 0)
2853         s = (job == js.j_current) ? "+ ": ((job == js.j_previous) ? "- " : " ");       
2854       else
2855         s = " ";
2856       printf ("[%d]%s", job + 1, s);
2857     }
2858
2859   do
2860     {
2861       printf ("%s%s",
2862                p->command ? p->command : "",
2863                p->next != jobs[job]->pipe? " | " : "");
2864       p = p->next;
2865     }
2866   while (p != jobs[job]->pipe);
2867
2868   if (foreground == 0)
2869     printf (" &");
2870
2871   if (strcmp (wd, jobs[job]->wd) != 0)
2872     printf ("   (wd: %s)", polite_directory_format (jobs[job]->wd));
2873
2874   printf ("\n");
2875
2876   /* Run the job. */
2877   if (already_running == 0)
2878     set_job_running (job);
2879
2880   /* Save the tty settings before we start the job in the foreground. */
2881   if (foreground)
2882     {
2883       get_tty_state ();
2884       save_stty = shell_tty_info;
2885       /* Give the terminal to this job. */
2886       if (IS_JOBCONTROL (job))
2887         give_terminal_to (jobs[job]->pgrp, 0);
2888     }
2889   else
2890     jobs[job]->flags &= ~J_FOREGROUND;
2891
2892   /* If the job is already running, then don't bother jump-starting it. */
2893   if (already_running == 0)
2894     {
2895       jobs[job]->flags |= J_NOTIFIED;
2896       killpg (jobs[job]->pgrp, SIGCONT);
2897     }
2898
2899   if (foreground)
2900     {
2901       pid_t pid;
2902       int st;
2903
2904       pid = find_last_pid (job, 0);
2905       UNBLOCK_CHILD (oset);
2906       st = wait_for (pid);
2907       shell_tty_info = save_stty;
2908       set_tty_state ();
2909       return (st);
2910     }
2911   else
2912     {
2913       reset_current ();
2914       UNBLOCK_CHILD (oset);
2915       return (0);
2916     }
2917 }
2918
2919 /* Give PID SIGNAL.  This determines what job the pid belongs to (if any).
2920    If PID does belong to a job, and the job is stopped, then CONTinue the
2921    job after giving it SIGNAL.  Returns -1 on failure.  If GROUP is non-null,
2922    then kill the process group associated with PID. */
2923 int
2924 kill_pid (pid, sig, group)
2925      pid_t pid;
2926      int sig, group;
2927 {
2928   register PROCESS *p;
2929   int job, result, negative;
2930   sigset_t set, oset;
2931
2932   if (pid < -1)
2933     {
2934       pid = -pid;
2935       group = negative = 1;
2936     }
2937   else
2938     negative = 0;
2939
2940   result = EXECUTION_SUCCESS;
2941   if (group)
2942     {
2943       BLOCK_CHILD (set, oset);
2944       p = find_pipeline (pid, 0, &job);
2945
2946       if (job != NO_JOB)
2947         {
2948           jobs[job]->flags &= ~J_NOTIFIED;
2949
2950           /* Kill process in backquotes or one started without job control? */
2951
2952           /* If we're passed a pid < -1, just call killpg and see what happens  */
2953           if (negative && jobs[job]->pgrp == shell_pgrp)
2954             result = killpg (pid, sig);
2955           /* If we're killing using job control notification, for example,
2956              without job control active, we have to do things ourselves. */
2957           else if (jobs[job]->pgrp == shell_pgrp)
2958             {
2959               p = jobs[job]->pipe;
2960               do
2961                 {
2962                   if (PALIVE (p) == 0)
2963                     continue;           /* avoid pid recycling problem */
2964                   kill (p->pid, sig);
2965                   if (PEXITED (p) && (sig == SIGTERM || sig == SIGHUP))
2966                     kill (p->pid, SIGCONT);
2967                   p = p->next;
2968                 }
2969               while  (p != jobs[job]->pipe);
2970             }
2971           else
2972             {
2973               result = killpg (jobs[job]->pgrp, sig);
2974               if (p && STOPPED (job) && (sig == SIGTERM || sig == SIGHUP))
2975                 killpg (jobs[job]->pgrp, SIGCONT);
2976               /* If we're continuing a stopped job via kill rather than bg or
2977                  fg, emulate the `bg' behavior. */
2978               if (p && STOPPED (job) && (sig == SIGCONT))
2979                 {
2980                   set_job_running (job);
2981                   jobs[job]->flags &= ~J_FOREGROUND;
2982                   jobs[job]->flags |= J_NOTIFIED;
2983                 }
2984             }
2985         }
2986       else
2987         result = killpg (pid, sig);
2988
2989       UNBLOCK_CHILD (oset);
2990     }
2991   else
2992     result = kill (pid, sig);
2993
2994   return (result);
2995 }
2996
2997 /* sigchld_handler () flushes at least one of the children that we are
2998    waiting for.  It gets run when we have gotten a SIGCHLD signal. */
2999 static sighandler
3000 sigchld_handler (sig)
3001      int sig;
3002 {
3003   int n, oerrno;
3004
3005   oerrno = errno;
3006   REINSTALL_SIGCHLD_HANDLER;
3007   sigchld++;
3008   n = 0;
3009   if (queue_sigchld == 0)
3010     n = waitchld (-1, 0);
3011   errno = oerrno;
3012   SIGRETURN (n);
3013 }
3014
3015 /* waitchld() reaps dead or stopped children.  It's called by wait_for and
3016    sigchld_handler, and runs until there aren't any children terminating any
3017    more.
3018    If BLOCK is 1, this is to be a blocking wait for a single child, although
3019    an arriving SIGCHLD could cause the wait to be non-blocking.  It returns
3020    the number of children reaped, or -1 if there are no unwaited-for child
3021    processes. */
3022 static int
3023 waitchld (wpid, block)
3024      pid_t wpid;
3025      int block;
3026 {
3027   WAIT status;
3028   PROCESS *child;
3029   pid_t pid;
3030   int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
3031   static int wcontinued = WCONTINUED;   /* run-time fix for glibc problem */
3032
3033   call_set_current = children_exited = 0;
3034   last_stopped_job = NO_JOB;
3035
3036   do
3037     {
3038       /* We don't want to be notified about jobs stopping if job control
3039          is not active.  XXX - was interactive_shell instead of job_control */
3040       waitpid_flags = (job_control && subshell_environment == 0)
3041                         ? (WUNTRACED|wcontinued)
3042                         : 0;
3043       if (sigchld || block == 0)
3044         waitpid_flags |= WNOHANG;
3045       CHECK_TERMSIG;
3046
3047       pid = WAITPID (-1, &status, waitpid_flags);
3048
3049       /* WCONTINUED may be rejected by waitpid as invalid even when defined */
3050       if (wcontinued && pid < 0 && errno == EINVAL)
3051         {
3052           wcontinued = 0;
3053           continue;     /* jump back to the test and retry without WCONTINUED */
3054         }
3055
3056       /* The check for WNOHANG is to make sure we decrement sigchld only
3057          if it was non-zero before we called waitpid. */
3058       if (sigchld > 0 && (waitpid_flags & WNOHANG))
3059         sigchld--;
3060   
3061       /* If waitpid returns -1 with errno == ECHILD, there are no more
3062          unwaited-for child processes of this shell. */
3063       if (pid < 0 && errno == ECHILD)
3064         {
3065           if (children_exited == 0)
3066             return -1;
3067           else
3068             break;
3069         }
3070
3071       /* If waitpid returns 0, there are running children.  If it returns -1,
3072          the only other error POSIX says it can return is EINTR. */
3073       CHECK_TERMSIG;
3074       if (pid <= 0)
3075         continue;       /* jumps right to the test */
3076
3077       /* children_exited is used to run traps on SIGCHLD.  We don't want to
3078          run the trap if a process is just being continued. */
3079       if (WIFCONTINUED(status) == 0)
3080         {
3081           children_exited++;
3082           js.c_living--;
3083         }
3084
3085       /* Locate our PROCESS for this pid. */
3086       child = find_process (pid, 1, &job);      /* want living procs only */
3087
3088 #if defined (COPROCESS_SUPPORT)
3089       coproc_pidchk (pid, status);
3090 #endif
3091
3092       /* It is not an error to have a child terminate that we did
3093          not have a record of.  This child could have been part of
3094          a pipeline in backquote substitution.  Even so, I'm not
3095          sure child is ever non-zero. */
3096       if (child == 0)
3097         {
3098           if (WIFEXITED (status) || WIFSIGNALED (status))
3099             js.c_reaped++;
3100           continue;
3101         }
3102
3103       /* Remember status, and whether or not the process is running. */
3104       child->status = status;
3105       child->running = WIFCONTINUED(status) ? PS_RUNNING : PS_DONE;
3106
3107       if (PEXITED (child))
3108         {
3109           js.c_totreaped++;
3110           if (job != NO_JOB)
3111             js.c_reaped++;
3112         }
3113         
3114       if (job == NO_JOB)
3115         continue;
3116
3117       call_set_current += set_job_status_and_cleanup (job);
3118
3119       if (STOPPED (job))
3120         last_stopped_job = job;
3121       else if (DEADJOB (job) && last_stopped_job == job)
3122         last_stopped_job = NO_JOB;
3123     }
3124   while ((sigchld || block == 0) && pid > (pid_t)0);
3125
3126   /* If a job was running and became stopped, then set the current
3127      job.  Otherwise, don't change a thing. */
3128   if (call_set_current)
3129     {
3130       if (last_stopped_job != NO_JOB)
3131         set_current_job (last_stopped_job);
3132       else
3133         reset_current ();
3134     }
3135
3136   /* Call a SIGCHLD trap handler for each child that exits, if one is set. */
3137   if (job_control && signal_is_trapped (SIGCHLD) && children_exited &&
3138       trap_list[SIGCHLD] != (char *)IGNORE_SIG)
3139     {
3140       if (this_shell_builtin && this_shell_builtin == wait_builtin)
3141         {
3142           interrupt_immediately = 0;
3143           trap_handler (SIGCHLD);       /* set pending_traps[SIGCHLD] */
3144           wait_signal_received = SIGCHLD;
3145           longjmp (wait_intr_buf, 1);
3146         }
3147
3148       run_sigchld_trap (children_exited);
3149     }
3150
3151   /* We have successfully recorded the useful information about this process
3152      that has just changed state.  If we notify asynchronously, and the job
3153      that this process belongs to is no longer running, then notify the user
3154      of that fact now. */
3155   if (asynchronous_notification && interactive)
3156     notify_of_job_status ();
3157
3158   return (children_exited);
3159 }
3160
3161 /* Set the status of JOB and perform any necessary cleanup if the job is
3162    marked as JDEAD.
3163
3164    Currently, the cleanup activity is restricted to handling any SIGINT
3165    received while waiting for a foreground job to finish. */
3166 static int
3167 set_job_status_and_cleanup (job)
3168      int job;
3169 {
3170   PROCESS *child;
3171   int tstatus, job_state, any_stopped, any_tstped, call_set_current;
3172   SigHandler *temp_handler;
3173
3174   child = jobs[job]->pipe;
3175   jobs[job]->flags &= ~J_NOTIFIED;
3176
3177   call_set_current = 0;
3178
3179   /*
3180    * COMPUTE JOB STATUS
3181    */
3182
3183   /* If all children are not running, but any of them is  stopped, then
3184      the job is stopped, not dead. */
3185   job_state = any_stopped = any_tstped = 0;
3186   do
3187     {
3188       job_state |= PRUNNING (child);
3189 #if 0
3190       if (PEXITED (child) && (WIFSTOPPED (child->status)))
3191 #else
3192       /* Only checking for WIFSTOPPED now, not for PS_DONE */
3193       if (PSTOPPED (child))
3194 #endif
3195         {
3196           any_stopped = 1;
3197           any_tstped |= interactive && job_control &&
3198                             (WSTOPSIG (child->status) == SIGTSTP);
3199         }
3200       child = child->next;
3201     }
3202   while (child != jobs[job]->pipe);
3203
3204   /* If job_state != 0, the job is still running, so don't bother with
3205      setting the process exit status and job state unless we're
3206      transitioning from stopped to running. */
3207   if (job_state != 0 && JOBSTATE(job) != JSTOPPED)
3208     return 0;
3209
3210   /*
3211    * SET JOB STATUS
3212    */
3213
3214   /* The job is either stopped or dead.  Set the state of the job accordingly. */
3215   if (any_stopped)
3216     {
3217       jobs[job]->state = JSTOPPED;
3218       jobs[job]->flags &= ~J_FOREGROUND;
3219       call_set_current++;
3220       /* Suspending a job with SIGTSTP breaks all active loops. */
3221       if (any_tstped && loop_level)
3222         breaking = loop_level;
3223     }
3224   else if (job_state != 0)      /* was stopped, now running */
3225     {
3226       jobs[job]->state = JRUNNING;
3227       call_set_current++;
3228     }
3229   else
3230     {
3231       jobs[job]->state = JDEAD;
3232       js.j_ndead++;
3233
3234 #if 0
3235       if (IS_FOREGROUND (job))
3236         setjstatus (job);
3237 #endif
3238
3239       /* If this job has a cleanup function associated with it, call it
3240          with `cleanarg' as the single argument, then set the function
3241          pointer to NULL so it is not inadvertently called twice.  The
3242          cleanup function is responsible for deallocating cleanarg. */
3243       if (jobs[job]->j_cleanup)
3244         {
3245           (*jobs[job]->j_cleanup) (jobs[job]->cleanarg);
3246           jobs[job]->j_cleanup = (sh_vptrfunc_t *)NULL;
3247         }
3248     }
3249
3250   /*
3251    * CLEANUP
3252    *
3253    * Currently, we just do special things if we got a SIGINT while waiting
3254    * for a foreground job to complete
3255    */
3256
3257   if (JOBSTATE (job) == JDEAD)
3258     {
3259       /* If we're running a shell script and we get a SIGINT with a
3260          SIGINT trap handler, but the foreground job handles it and
3261          does not exit due to SIGINT, run the trap handler but do not
3262          otherwise act as if we got the interrupt. */
3263       if (wait_sigint_received && interactive_shell == 0 &&
3264           WIFSIGNALED (child->status) == 0 && IS_FOREGROUND (job) &&
3265           signal_is_trapped (SIGINT))
3266         {
3267           int old_frozen;
3268           wait_sigint_received = 0;
3269           last_command_exit_value = process_exit_status (child->status);
3270
3271           old_frozen = jobs_list_frozen;
3272           jobs_list_frozen = 1;
3273           tstatus = maybe_call_trap_handler (SIGINT);
3274           jobs_list_frozen = old_frozen;
3275         }
3276
3277       /* If the foreground job is killed by SIGINT when job control is not
3278          active, we need to perform some special handling.
3279
3280          The check of wait_sigint_received is a way to determine if the
3281          SIGINT came from the keyboard (in which case the shell has already
3282          seen it, and wait_sigint_received is non-zero, because keyboard
3283          signals are sent to process groups) or via kill(2) to the foreground
3284          process by another process (or itself).  If the shell did receive the
3285          SIGINT, it needs to perform normal SIGINT processing. */
3286       else if (wait_sigint_received && (WTERMSIG (child->status) == SIGINT) &&
3287               IS_FOREGROUND (job) && IS_JOBCONTROL (job) == 0)
3288         {
3289           int old_frozen;
3290
3291           wait_sigint_received = 0;
3292
3293           /* If SIGINT is trapped, set the exit status so that the trap
3294              handler can see it. */
3295           if (signal_is_trapped (SIGINT))
3296             last_command_exit_value = process_exit_status (child->status);
3297
3298           /* If the signal is trapped, let the trap handler get it no matter
3299              what and simply return if the trap handler returns.
3300             maybe_call_trap_handler() may cause dead jobs to be removed from
3301             the job table because of a call to execute_command.  We work
3302             around this by setting JOBS_LIST_FROZEN. */
3303           old_frozen = jobs_list_frozen;
3304           jobs_list_frozen = 1;
3305           tstatus = maybe_call_trap_handler (SIGINT);
3306           jobs_list_frozen = old_frozen;
3307           if (tstatus == 0 && old_sigint_handler != INVALID_SIGNAL_HANDLER)
3308             {
3309               /* wait_sigint_handler () has already seen SIGINT and
3310                  allowed the wait builtin to jump out.  We need to
3311                  call the original SIGINT handler, if necessary.  If
3312                  the original handler is SIG_DFL, we need to resend
3313                  the signal to ourselves. */
3314
3315               temp_handler = old_sigint_handler;
3316
3317               /* Bogus.  If we've reset the signal handler as the result
3318                  of a trap caught on SIGINT, then old_sigint_handler
3319                  will point to trap_handler, which now knows nothing about
3320                  SIGINT (if we reset the sighandler to the default).
3321                  In this case, we have to fix things up.  What a crock. */
3322               if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0)
3323                   temp_handler = trap_to_sighandler (SIGINT);
3324                 restore_sigint_handler ();
3325               if (temp_handler == SIG_DFL)
3326                 termsig_handler (SIGINT);
3327               else if (temp_handler != SIG_IGN)
3328                 (*temp_handler) (SIGINT);
3329             }
3330         }
3331     }
3332
3333   return call_set_current;
3334 }
3335
3336 /* Build the array of values for the $PIPESTATUS variable from the set of
3337    exit statuses of all processes in the job J. */
3338 static void
3339 setjstatus (j)
3340      int j;
3341 {
3342 #if defined (ARRAY_VARS)
3343   register int i;
3344   register PROCESS *p;
3345
3346   for (i = 1, p = jobs[j]->pipe; p->next != jobs[j]->pipe; p = p->next, i++)
3347     ;
3348   i++;
3349   if (statsize < i)
3350     {
3351       pstatuses = (int *)xrealloc (pstatuses, i * sizeof (int));
3352       statsize = i;
3353     }
3354   i = 0;
3355   p = jobs[j]->pipe;
3356   do
3357     {
3358       pstatuses[i++] = process_exit_status (p->status);
3359       p = p->next;
3360     }
3361   while (p != jobs[j]->pipe);
3362
3363   pstatuses[i] = -1;    /* sentinel */
3364   set_pipestatus_array (pstatuses, i);
3365 #endif
3366 }
3367
3368 void
3369 run_sigchld_trap (nchild)
3370      int nchild;
3371 {
3372   char *trap_command;
3373   int i;
3374
3375   /* Turn off the trap list during the call to parse_and_execute ()
3376      to avoid potentially infinite recursive calls.  Preserve the
3377      values of last_command_exit_value, last_made_pid, and the_pipeline
3378      around the execution of the trap commands. */
3379   trap_command = savestring (trap_list[SIGCHLD]);
3380
3381   begin_unwind_frame ("SIGCHLD trap");
3382   unwind_protect_int (last_command_exit_value);
3383   unwind_protect_int (last_command_exit_signal);
3384   unwind_protect_var (last_made_pid);
3385   unwind_protect_int (interrupt_immediately);
3386   unwind_protect_int (jobs_list_frozen);
3387   unwind_protect_pointer (the_pipeline);
3388   unwind_protect_pointer (subst_assign_varlist);
3389
3390   /* We have to add the commands this way because they will be run
3391      in reverse order of adding.  We don't want maybe_set_sigchld_trap ()
3392      to reference freed memory. */
3393   add_unwind_protect (xfree, trap_command);
3394   add_unwind_protect (maybe_set_sigchld_trap, trap_command);
3395
3396   subst_assign_varlist = (WORD_LIST *)NULL;
3397   the_pipeline = (PROCESS *)NULL;
3398
3399   set_impossible_sigchld_trap ();
3400   jobs_list_frozen = 1;
3401   for (i = 0; i < nchild; i++)
3402     {
3403       interrupt_immediately = 1;
3404       parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE);
3405     }
3406
3407   run_unwind_frame ("SIGCHLD trap");
3408 }
3409
3410 /* Function to call when you want to notify people of changes
3411    in job status.  This prints out all jobs which are pending
3412    notification to stderr, and marks those printed as already
3413    notified, thus making them candidates for cleanup. */
3414 static void
3415 notify_of_job_status ()
3416 {
3417   register int job, termsig;
3418   char *dir;
3419   sigset_t set, oset;
3420   WAIT s;
3421
3422   if (jobs == 0 || js.j_jobslots == 0)
3423     return;
3424
3425   if (old_ttou != 0)
3426     {
3427       sigemptyset (&set);
3428       sigaddset (&set, SIGCHLD);
3429       sigaddset (&set, SIGTTOU);
3430       sigemptyset (&oset);
3431       sigprocmask (SIG_BLOCK, &set, &oset);
3432     }
3433   else
3434     queue_sigchld++;
3435
3436   /* XXX could use js.j_firstj here */
3437   for (job = 0, dir = (char *)NULL; job < js.j_jobslots; job++)
3438     {
3439       if (jobs[job] && IS_NOTIFIED (job) == 0)
3440         {
3441           s = raw_job_exit_status (job);
3442           termsig = WTERMSIG (s);
3443
3444           /* POSIX.2 says we have to hang onto the statuses of at most the
3445              last CHILD_MAX background processes if the shell is running a
3446              script.  If the shell is running a script, either from a file
3447              or standard input, don't print anything unless the job was
3448              killed by a signal. */
3449           if (startup_state == 0 && WIFSIGNALED (s) == 0 &&
3450                 ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job)))
3451             continue;
3452           
3453 #if 0
3454           /* If job control is disabled, don't print the status messages.
3455              Mark dead jobs as notified so that they get cleaned up.  If
3456              startup_state == 2, we were started to run `-c command', so
3457              don't print anything. */
3458           if ((job_control == 0 && interactive_shell) || startup_state == 2)
3459 #else
3460           /* If job control is disabled, don't print the status messages.
3461              Mark dead jobs as notified so that they get cleaned up.  If
3462              startup_state == 2 and subshell_environment has the
3463              SUBSHELL_COMSUB bit turned on, we were started to run a command
3464              substitution, so don't print anything. */
3465           if ((job_control == 0 && interactive_shell) ||
3466               (startup_state == 2 && (subshell_environment & SUBSHELL_COMSUB)))
3467 #endif
3468             {
3469               /* POSIX.2 compatibility:  if the shell is not interactive,
3470                  hang onto the job corresponding to the last asynchronous
3471                  pid until the user has been notified of its status or does
3472                  a `wait'. */
3473               if (DEADJOB (job) && (interactive_shell || (find_last_pid (job, 0) != last_asynchronous_pid)))
3474                 jobs[job]->flags |= J_NOTIFIED;
3475               continue;
3476             }
3477
3478           /* Print info on jobs that are running in the background,
3479              and on foreground jobs that were killed by anything
3480              except SIGINT (and possibly SIGPIPE). */
3481           switch (JOBSTATE (job))
3482             {
3483             case JDEAD:
3484               if (interactive_shell == 0 && termsig && WIFSIGNALED (s) &&
3485                   termsig != SIGINT &&
3486 #if defined (DONT_REPORT_SIGPIPE)
3487                   termsig != SIGPIPE &&
3488 #endif
3489                   signal_is_trapped (termsig) == 0)
3490                 {
3491                   /* Don't print `0' for a line number. */
3492                   fprintf (stderr, _("%s: line %d: "), get_name_for_error (), (line_number == 0) ? 1 : line_number);
3493                   pretty_print_job (job, JLIST_NONINTERACTIVE, stderr);
3494                 }
3495               else if (IS_FOREGROUND (job))
3496                 {
3497 #if !defined (DONT_REPORT_SIGPIPE)
3498                   if (termsig && WIFSIGNALED (s) && termsig != SIGINT)
3499 #else
3500                   if (termsig && WIFSIGNALED (s) && termsig != SIGINT && termsig != SIGPIPE)
3501 #endif
3502                     {
3503                       fprintf (stderr, "%s", j_strsignal (termsig));
3504
3505                       if (WIFCORED (s))
3506                         fprintf (stderr, _(" (core dumped)"));
3507
3508                       fprintf (stderr, "\n");
3509                     }
3510                 }
3511               else if (job_control)     /* XXX job control test added */
3512                 {
3513                   if (dir == 0)
3514                     dir = current_working_directory ();
3515                   pretty_print_job (job, JLIST_STANDARD, stderr);
3516                   if (dir && strcmp (dir, jobs[job]->wd) != 0)
3517                     fprintf (stderr,
3518                              _("(wd now: %s)\n"), polite_directory_format (dir));
3519                 }
3520
3521               jobs[job]->flags |= J_NOTIFIED;
3522               break;
3523
3524             case JSTOPPED:
3525               fprintf (stderr, "\n");
3526               if (dir == 0)
3527                 dir = current_working_directory ();
3528               pretty_print_job (job, JLIST_STANDARD, stderr);
3529               if (dir && (strcmp (dir, jobs[job]->wd) != 0))
3530                 fprintf (stderr,
3531                          _("(wd now: %s)\n"), polite_directory_format (dir));
3532               jobs[job]->flags |= J_NOTIFIED;
3533               break;
3534
3535             case JRUNNING:
3536             case JMIXED:
3537               break;
3538
3539             default:
3540               programming_error ("notify_of_job_status");
3541             }
3542         }
3543     }
3544   if (old_ttou != 0)
3545     sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3546   else
3547     queue_sigchld--;
3548 }
3549
3550 /* Initialize the job control mechanism, and set up the tty stuff. */
3551 int
3552 initialize_job_control (force)
3553      int force;
3554 {
3555   pid_t t;
3556   int t_errno;
3557
3558   t_errno = -1;
3559   shell_pgrp = getpgid (0);
3560
3561   if (shell_pgrp == -1)
3562     {
3563       sys_error (_("initialize_job_control: getpgrp failed"));
3564       exit (1);
3565     }
3566
3567   /* We can only have job control if we are interactive. */
3568   if (interactive == 0)
3569     {
3570       job_control = 0;
3571       original_pgrp = NO_PID;
3572       shell_tty = fileno (stderr);
3573     }
3574   else
3575     {
3576       shell_tty = -1;
3577
3578       /* If forced_interactive is set, we skip the normal check that stderr
3579          is attached to a tty, so we need to check here.  If it's not, we
3580          need to see whether we have a controlling tty by opening /dev/tty,
3581          since trying to use job control tty pgrp manipulations on a non-tty
3582          is going to fail. */
3583       if (forced_interactive && isatty (fileno (stderr)) == 0)
3584         shell_tty = open ("/dev/tty", O_RDWR|O_NONBLOCK);
3585
3586       /* Get our controlling terminal.  If job_control is set, or
3587          interactive is set, then this is an interactive shell no
3588          matter where fd 2 is directed. */
3589       if (shell_tty == -1)
3590         shell_tty = dup (fileno (stderr));      /* fd 2 */
3591
3592       shell_tty = move_to_high_fd (shell_tty, 1, -1);
3593
3594       /* Compensate for a bug in systems that compiled the BSD
3595          rlogind with DEBUG defined, like NeXT and Alliant. */
3596       if (shell_pgrp == 0)
3597         {
3598           shell_pgrp = getpid ();
3599           setpgid (0, shell_pgrp);
3600           tcsetpgrp (shell_tty, shell_pgrp);
3601         }
3602
3603       while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)
3604         {
3605           if (shell_pgrp != terminal_pgrp)
3606             {
3607               SigHandler *ottin;
3608
3609               ottin = set_signal_handler(SIGTTIN, SIG_DFL);
3610               kill (0, SIGTTIN);
3611               set_signal_handler (SIGTTIN, ottin);
3612               continue;
3613             }
3614           break;
3615         }
3616
3617       if (terminal_pgrp == -1)
3618         t_errno = errno;
3619
3620       /* Make sure that we are using the new line discipline. */
3621       if (set_new_line_discipline (shell_tty) < 0)
3622         {
3623           sys_error (_("initialize_job_control: line discipline"));
3624           job_control = 0;
3625         }
3626       else
3627         {
3628           original_pgrp = shell_pgrp;
3629           shell_pgrp = getpid ();
3630
3631           if ((original_pgrp != shell_pgrp) && (setpgid (0, shell_pgrp) < 0))
3632             {
3633               sys_error (_("initialize_job_control: setpgid"));
3634               shell_pgrp = original_pgrp;
3635             }
3636
3637           job_control = 1;
3638
3639           /* If (and only if) we just set our process group to our pid,
3640              thereby becoming a process group leader, and the terminal
3641              is not in the same process group as our (new) process group,
3642              then set the terminal's process group to our (new) process
3643              group.  If that fails, set our process group back to what it
3644              was originally (so we can still read from the terminal) and
3645              turn off job control.  */
3646           if (shell_pgrp != original_pgrp && shell_pgrp != terminal_pgrp)
3647             {
3648               if (give_terminal_to (shell_pgrp, 0) < 0)
3649                 {
3650                   t_errno = errno;
3651                   setpgid (0, original_pgrp);
3652                   shell_pgrp = original_pgrp;
3653                   job_control = 0;
3654                 }
3655             }
3656
3657           if (job_control && ((t = tcgetpgrp (shell_tty)) == -1 || t != shell_pgrp))
3658             {
3659               if (t_errno != -1)
3660                 errno = t_errno;
3661               sys_error (_("cannot set terminal process group (%d)"), t);
3662               job_control = 0;
3663             }
3664         }
3665       if (job_control == 0)
3666         internal_error (_("no job control in this shell"));
3667     }
3668
3669   if (shell_tty != fileno (stderr))
3670     SET_CLOSE_ON_EXEC (shell_tty);
3671
3672   set_signal_handler (SIGCHLD, sigchld_handler);
3673
3674   change_flag ('m', job_control ? '-' : '+');
3675
3676   if (interactive)
3677     get_tty_state ();
3678
3679   if (js.c_childmax < 0)
3680     js.c_childmax = getmaxchild ();
3681   if (js.c_childmax < 0)
3682     js.c_childmax = DEFAULT_CHILD_MAX;
3683
3684   return job_control;
3685 }
3686
3687 #ifdef DEBUG
3688 void
3689 debug_print_pgrps ()
3690 {
3691   itrace("original_pgrp = %ld shell_pgrp = %ld terminal_pgrp = %ld",
3692          (long)original_pgrp, (long)shell_pgrp, (long)terminal_pgrp);
3693   itrace("tcgetpgrp(%d) -> %ld, getpgid(0) -> %ld",
3694          shell_tty, (long)tcgetpgrp (shell_tty), (long)getpgid(0));
3695 }
3696 #endif
3697
3698 /* Set the line discipline to the best this system has to offer.
3699    Return -1 if this is not possible. */
3700 static int
3701 set_new_line_discipline (tty)
3702      int tty;
3703 {
3704 #if defined (NEW_TTY_DRIVER)
3705   int ldisc;
3706
3707   if (ioctl (tty, TIOCGETD, &ldisc) < 0)
3708     return (-1);
3709
3710   if (ldisc != NTTYDISC)
3711     {
3712       ldisc = NTTYDISC;
3713
3714       if (ioctl (tty, TIOCSETD, &ldisc) < 0)
3715         return (-1);
3716     }
3717   return (0);
3718 #endif /* NEW_TTY_DRIVER */
3719
3720 #if defined (TERMIO_TTY_DRIVER)
3721 #  if defined (TERMIO_LDISC) && (NTTYDISC)
3722   if (ioctl (tty, TCGETA, &shell_tty_info) < 0)
3723     return (-1);
3724
3725   if (shell_tty_info.c_line != NTTYDISC)
3726     {
3727       shell_tty_info.c_line = NTTYDISC;
3728       if (ioctl (tty, TCSETAW, &shell_tty_info) < 0)
3729         return (-1);
3730     }
3731 #  endif /* TERMIO_LDISC && NTTYDISC */
3732   return (0);
3733 #endif /* TERMIO_TTY_DRIVER */
3734
3735 #if defined (TERMIOS_TTY_DRIVER)
3736 #  if defined (TERMIOS_LDISC) && defined (NTTYDISC)
3737   if (tcgetattr (tty, &shell_tty_info) < 0)
3738     return (-1);
3739
3740   if (shell_tty_info.c_line != NTTYDISC)
3741     {
3742       shell_tty_info.c_line = NTTYDISC;
3743       if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
3744         return (-1);
3745     }
3746 #  endif /* TERMIOS_LDISC && NTTYDISC */
3747   return (0);
3748 #endif /* TERMIOS_TTY_DRIVER */
3749
3750 #if !defined (NEW_TTY_DRIVER) && !defined (TERMIO_TTY_DRIVER) && !defined (TERMIOS_TTY_DRIVER)
3751   return (-1);
3752 #endif
3753 }
3754
3755 /* Setup this shell to handle C-C, etc. */
3756 void
3757 initialize_job_signals ()
3758 {
3759   if (interactive)
3760     {
3761       set_signal_handler (SIGINT, sigint_sighandler);
3762       set_signal_handler (SIGTSTP, SIG_IGN);
3763       set_signal_handler (SIGTTOU, SIG_IGN);
3764       set_signal_handler (SIGTTIN, SIG_IGN);
3765     }
3766   else if (job_control)
3767     {
3768       old_tstp = set_signal_handler (SIGTSTP, sigstop_sighandler);
3769       old_ttin = set_signal_handler (SIGTTIN, sigstop_sighandler);
3770       old_ttou = set_signal_handler (SIGTTOU, sigstop_sighandler);
3771     }
3772   /* Leave these things alone for non-interactive shells without job
3773      control. */
3774 }
3775
3776 /* Here we handle CONT signals. */
3777 static sighandler
3778 sigcont_sighandler (sig)
3779      int sig;
3780 {
3781   initialize_job_signals ();
3782   set_signal_handler (SIGCONT, old_cont);
3783   kill (getpid (), SIGCONT);
3784
3785   SIGRETURN (0);
3786 }
3787
3788 /* Here we handle stop signals while we are running not as a login shell. */
3789 static sighandler
3790 sigstop_sighandler (sig)
3791      int sig;
3792 {
3793   set_signal_handler (SIGTSTP, old_tstp);
3794   set_signal_handler (SIGTTOU, old_ttou);
3795   set_signal_handler (SIGTTIN, old_ttin);
3796
3797   old_cont = set_signal_handler (SIGCONT, sigcont_sighandler);
3798
3799   give_terminal_to (shell_pgrp, 0);
3800
3801   kill (getpid (), sig);
3802
3803   SIGRETURN (0);
3804 }
3805
3806 /* Give the terminal to PGRP.  */
3807 int
3808 give_terminal_to (pgrp, force)
3809      pid_t pgrp;
3810      int force;
3811 {
3812   sigset_t set, oset;
3813   int r, e;
3814
3815   r = 0;
3816   if (job_control || force)
3817     {
3818       sigemptyset (&set);
3819       sigaddset (&set, SIGTTOU);
3820       sigaddset (&set, SIGTTIN);
3821       sigaddset (&set, SIGTSTP);
3822       sigaddset (&set, SIGCHLD);
3823       sigemptyset (&oset);
3824       sigprocmask (SIG_BLOCK, &set, &oset);
3825
3826       if (tcsetpgrp (shell_tty, pgrp) < 0)
3827         {
3828           /* Maybe we should print an error message? */
3829 #if 0
3830           sys_error ("tcsetpgrp(%d) failed: pid %ld to pgrp %ld",
3831             shell_tty, (long)getpid(), (long)pgrp);
3832 #endif
3833           r = -1;
3834           e = errno;
3835         }
3836       else
3837         terminal_pgrp = pgrp;
3838       sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3839     }
3840
3841   if (r == -1)
3842     errno = e;
3843
3844   return r;
3845 }
3846
3847 /* Give terminal to NPGRP iff it's currently owned by OPGRP.  FLAGS are the
3848    flags to pass to give_terminal_to(). */
3849 static int
3850 maybe_give_terminal_to (opgrp, npgrp, flags)
3851      pid_t opgrp, npgrp;
3852      int flags;
3853 {
3854   int tpgrp;
3855
3856   tpgrp = tcgetpgrp (shell_tty);
3857   if (tpgrp < 0 && errno == ENOTTY)
3858     return -1;
3859   if (tpgrp == npgrp)
3860     {
3861       terminal_pgrp = npgrp;
3862       return 0;
3863     }
3864   else if (tpgrp != opgrp)
3865     {
3866 #if defined (DEBUG)
3867       internal_warning ("maybe_give_terminal_to: terminal pgrp == %d shell pgrp = %d new pgrp = %d", tpgrp, opgrp, npgrp);
3868 #endif
3869       return -1;
3870     }
3871   else
3872     return (give_terminal_to (npgrp, flags));     
3873 }
3874
3875 /* Clear out any jobs in the job array.  This is intended to be used by
3876    children of the shell, who should not have any job structures as baggage
3877    when they start executing (forking subshells for parenthesized execution
3878    and functions with pipes are the two that spring to mind).  If RUNNING_ONLY
3879    is nonzero, only running jobs are removed from the table. */
3880 void
3881 delete_all_jobs (running_only)
3882      int running_only;
3883 {
3884   register int i;
3885   sigset_t set, oset;
3886
3887   BLOCK_CHILD (set, oset);
3888
3889   /* XXX - need to set j_lastj, j_firstj appropriately if running_only != 0. */
3890   if (js.j_jobslots)
3891     {
3892       js.j_current = js.j_previous = NO_JOB;
3893
3894       /* XXX could use js.j_firstj here */
3895       for (i = 0; i < js.j_jobslots; i++)
3896         {
3897 #if defined (DEBUG)
3898           if (i < js.j_firstj && jobs[i])
3899             itrace("delete_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3900           if (i > js.j_lastj && jobs[i])
3901             itrace("delete_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
3902 #endif
3903           if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
3904             delete_job (i, DEL_WARNSTOPPED);
3905         }
3906       if (running_only == 0)
3907         {
3908           free ((char *)jobs);
3909           js.j_jobslots = 0;
3910           js.j_firstj = js.j_lastj = js.j_njobs = 0;
3911         }
3912     }
3913
3914   if (running_only == 0)
3915     bgp_clear ();
3916
3917   UNBLOCK_CHILD (oset);
3918 }
3919
3920 /* Mark all jobs in the job array so that they don't get a SIGHUP when the
3921    shell gets one.  If RUNNING_ONLY is nonzero, mark only running jobs. */
3922 void
3923 nohup_all_jobs (running_only)
3924      int running_only;
3925 {
3926   register int i;
3927   sigset_t set, oset;
3928
3929   BLOCK_CHILD (set, oset);
3930
3931   if (js.j_jobslots)
3932     {
3933       /* XXX could use js.j_firstj here */
3934       for (i = 0; i < js.j_jobslots; i++)
3935         if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
3936           nohup_job (i);
3937     }
3938
3939   UNBLOCK_CHILD (oset);
3940 }
3941
3942 int
3943 count_all_jobs ()
3944 {
3945   int i, n;
3946   sigset_t set, oset;
3947
3948   /* This really counts all non-dead jobs. */
3949   BLOCK_CHILD (set, oset);
3950   /* XXX could use js.j_firstj here */
3951   for (i = n = 0; i < js.j_jobslots; i++)
3952     {
3953 #if defined (DEBUG)
3954       if (i < js.j_firstj && jobs[i])
3955         itrace("count_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
3956       if (i > js.j_lastj && jobs[i])
3957         itrace("count_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
3958 #endif
3959       if (jobs[i] && DEADJOB(i) == 0)
3960         n++;
3961     }
3962   UNBLOCK_CHILD (oset);
3963   return n;
3964 }
3965
3966 static void
3967 mark_all_jobs_as_dead ()
3968 {
3969   register int i;
3970   sigset_t set, oset;
3971
3972   if (js.j_jobslots == 0)
3973     return;
3974
3975   BLOCK_CHILD (set, oset);
3976
3977   /* XXX could use js.j_firstj here */
3978   for (i = 0; i < js.j_jobslots; i++)
3979     if (jobs[i])
3980       {
3981         jobs[i]->state = JDEAD;
3982         js.j_ndead++;
3983       }
3984
3985   UNBLOCK_CHILD (oset);
3986 }
3987
3988 /* Mark all dead jobs as notified, so delete_job () cleans them out
3989    of the job table properly.  POSIX.2 says we need to save the
3990    status of the last CHILD_MAX jobs, so we count the number of dead
3991    jobs and mark only enough as notified to save CHILD_MAX statuses. */
3992 static void
3993 mark_dead_jobs_as_notified (force)
3994      int force;
3995 {
3996   register int i, ndead, ndeadproc;
3997   sigset_t set, oset;
3998
3999   if (js.j_jobslots == 0)
4000     return;
4001
4002   BLOCK_CHILD (set, oset);
4003
4004   /* If FORCE is non-zero, we don't have to keep CHILD_MAX statuses
4005      around; just run through the array. */
4006   if (force)
4007     {
4008     /* XXX could use js.j_firstj here */
4009       for (i = 0; i < js.j_jobslots; i++)
4010         {
4011           if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
4012             jobs[i]->flags |= J_NOTIFIED;
4013         }
4014       UNBLOCK_CHILD (oset);
4015       return;
4016     }
4017
4018   /* Mark enough dead jobs as notified to keep CHILD_MAX processes left in the
4019      array with the corresponding not marked as notified.  This is a better
4020      way to avoid pid aliasing and reuse problems than keeping the POSIX-
4021      mandated CHILD_MAX jobs around.  delete_job() takes care of keeping the
4022      bgpids list regulated. */
4023           
4024   /* Count the number of dead jobs */
4025   /* XXX could use js.j_firstj here */
4026   for (i = ndead = ndeadproc = 0; i < js.j_jobslots; i++)
4027     {
4028 #if defined (DEBUG)
4029       if (i < js.j_firstj && jobs[i])
4030         itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
4031       if (i > js.j_lastj && jobs[i])
4032         itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
4033 #endif
4034       if (jobs[i] && DEADJOB (i))
4035         {
4036           ndead++;
4037           ndeadproc += processes_in_job (i);
4038         }
4039     }
4040
4041 #ifdef DEBUG
4042   if (ndeadproc != js.c_reaped)
4043     itrace("mark_dead_jobs_as_notified: ndeadproc (%d) != js.c_reaped (%d)", ndeadproc, js.c_reaped);
4044   if (ndead != js.j_ndead)
4045     itrace("mark_dead_jobs_as_notified: ndead (%d) != js.j_ndead (%d)", ndead, js.j_ndead);
4046 #endif
4047
4048   if (js.c_childmax < 0)
4049     js.c_childmax = getmaxchild ();
4050   if (js.c_childmax < 0)
4051     js.c_childmax = DEFAULT_CHILD_MAX;
4052
4053   /* Don't do anything if the number of dead processes is less than CHILD_MAX
4054      and we're not forcing a cleanup. */
4055   if (ndeadproc <= js.c_childmax)
4056     {
4057       UNBLOCK_CHILD (oset);
4058       return;
4059     }
4060
4061 #if 0
4062 itrace("mark_dead_jobs_as_notified: child_max = %d ndead = %d ndeadproc = %d", js.c_childmax, ndead, ndeadproc);
4063 #endif
4064
4065   /* Mark enough dead jobs as notified that we keep CHILD_MAX jobs in
4066      the list.  This isn't exactly right yet; changes need to be made
4067      to stop_pipeline so we don't mark the newer jobs after we've
4068      created CHILD_MAX slots in the jobs array.  This needs to be
4069      integrated with a way to keep the jobs array from growing without
4070      bound.  Maybe we wrap back around to 0 after we reach some max
4071      limit, and there are sufficient job slots free (keep track of total
4072      size of jobs array (js.j_jobslots) and running count of number of jobs
4073      in jobs array.  Then keep a job index corresponding to the `oldest job'
4074      and start this loop there, wrapping around as necessary.  In effect,
4075      we turn the list into a circular buffer. */
4076   /* XXX could use js.j_firstj here */
4077   for (i = 0; i < js.j_jobslots; i++)
4078     {
4079       if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
4080         {
4081 #if defined (DEBUG)
4082           if (i < js.j_firstj && jobs[i])
4083             itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
4084           if (i > js.j_lastj && jobs[i])
4085             itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
4086 #endif
4087           /* If marking this job as notified would drop us down below
4088              child_max, don't mark it so we can keep at least child_max
4089              statuses.  XXX -- need to check what Posix actually says
4090              about keeping statuses. */
4091           if ((ndeadproc -= processes_in_job (i)) <= js.c_childmax)
4092             break;
4093           jobs[i]->flags |= J_NOTIFIED;
4094         }
4095     }
4096
4097   UNBLOCK_CHILD (oset);
4098 }
4099
4100 /* Here to allow other parts of the shell (like the trap stuff) to
4101    unfreeze the jobs list. */
4102 void
4103 unfreeze_jobs_list ()
4104 {
4105   jobs_list_frozen = 0;
4106 }
4107
4108 /* Allow or disallow job control to take place.  Returns the old value
4109    of job_control. */
4110 int
4111 set_job_control (arg)
4112      int arg;
4113 {
4114   int old;
4115
4116   old = job_control;
4117   job_control = arg;
4118
4119   /* If we're turning on job control, reset pipeline_pgrp so make_child will
4120      put new child processes into the right pgrp */
4121   if (job_control != old && job_control)
4122     pipeline_pgrp = 0;
4123
4124   return (old);
4125 }
4126
4127 /* Turn off all traces of job control.  This is run by children of the shell
4128    which are going to do shellsy things, like wait (), etc. */
4129 void
4130 without_job_control ()
4131 {
4132   stop_making_children ();
4133   start_pipeline ();
4134 #if defined (PGRP_PIPE)
4135   sh_closepipe (pgrp_pipe);
4136 #endif
4137   delete_all_jobs (0);
4138   set_job_control (0);
4139 }
4140
4141 /* If this shell is interactive, terminate all stopped jobs and
4142    restore the original terminal process group.  This is done
4143    before the `exec' builtin calls shell_execve. */
4144 void
4145 end_job_control ()
4146 {
4147   if (interactive_shell)                /* XXX - should it be interactive? */
4148     {
4149       terminate_stopped_jobs ();
4150
4151       if (original_pgrp >= 0)
4152         give_terminal_to (original_pgrp, 1);
4153     }
4154
4155   if (original_pgrp >= 0)
4156     setpgid (0, original_pgrp);
4157 }
4158
4159 /* Restart job control by closing shell tty and reinitializing.  This is
4160    called after an exec fails in an interactive shell and we do not exit. */
4161 void
4162 restart_job_control ()
4163 {
4164   if (shell_tty != -1)
4165     close (shell_tty);
4166   initialize_job_control (0);
4167 }
4168
4169 /* Set the handler to run when the shell receives a SIGCHLD signal. */
4170 void
4171 set_sigchld_handler ()
4172 {
4173   set_signal_handler (SIGCHLD, sigchld_handler);
4174 }
4175
4176 #if defined (PGRP_PIPE)
4177 /* Read from the read end of a pipe.  This is how the process group leader
4178    blocks until all of the processes in a pipeline have been made. */
4179 static void
4180 pipe_read (pp)
4181      int *pp;
4182 {
4183   char ch;
4184
4185   if (pp[1] >= 0)
4186     {
4187       close (pp[1]);
4188       pp[1] = -1;
4189     }
4190
4191   if (pp[0] >= 0)
4192     {
4193       while (read (pp[0], &ch, 1) == -1 && errno == EINTR)
4194         ;
4195     }
4196 }
4197
4198 /* Functional interface closes our local-to-job-control pipes. */
4199 void
4200 close_pgrp_pipe ()
4201 {
4202   sh_closepipe (pgrp_pipe);
4203 }
4204
4205 void
4206 save_pgrp_pipe (p, clear)
4207      int *p;
4208      int clear;
4209 {
4210   p[0] = pgrp_pipe[0];
4211   p[1] = pgrp_pipe[1];
4212   if (clear)
4213     pgrp_pipe[0] = pgrp_pipe[1] = -1;
4214 }
4215
4216 void
4217 restore_pgrp_pipe (p)
4218      int *p;
4219 {
4220   pgrp_pipe[0] = p[0];
4221   pgrp_pipe[1] = p[1];
4222 }
4223
4224 #endif /* PGRP_PIPE */