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