Imported from ../bash-1.14.7.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. */
4
5 /* Copyright (C) 1989, 1992 Free Software Foundation, Inc.
6
7    This file is part of GNU Bash, the Bourne Again SHell.
8
9    Bash is free software; you can redistribute it and/or modify it under
10    the terms of the GNU General Public License as published by the Free
11    Software Foundation; either version 1, or (at your option) any later
12    version.
13
14    Bash is distributed in the hope that it will be useful, but WITHOUT ANY
15    WARRANTY; without even the implied warranty of MERCHANTABILITY or
16    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
17    for more details.
18
19    You should have received a copy of the GNU General Public License along
20    with Bash; see the file COPYING.  If not, write to the Free Software
21    Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22
23 /* Something that can be ignored. */
24 #define IGNORE_ARG (char *)0
25
26 #include "config.h"
27
28 #if !defined (JOB_CONTROL)
29 #include "nojobs.c"
30 #else /* JOB_CONTROL */
31
32 #include "bashtypes.h"
33 #include "trap.h"
34 #include <stdio.h>
35 #include <signal.h>
36 #include <errno.h>
37
38 #if !defined (USG) || defined (HAVE_RESOURCE)
39 #include <sys/time.h>
40 #endif /* USG */
41
42 #if !defined (_POSIX_VERSION)
43 #  if defined (HAVE_RESOURCE)
44 #    include <sys/resource.h>
45 #  endif
46 #endif /* _POSIX_VERSION */
47
48 #include <sys/file.h>
49 #include "filecntl.h"
50 #include <sys/ioctl.h>
51 #include <sys/param.h>
52
53 #if defined (BUFFERED_INPUT)
54 #  include "input.h"
55 #endif
56
57 /* Terminal handling stuff, to save and restore tty state. */
58 #define NEW_TTY_DRIVER
59
60 /* Define this if your output is getting swallowed.  It's a no-op on
61    machines with the termio or termios tty drivers. */
62 /* #define DRAIN_OUTPUT */
63
64 #if defined (_POSIX_VERSION) && !defined (TERMIOS_MISSING)
65 #  undef NEW_TTY_DRIVER
66 #  define TERMIOS_TTY_DRIVER
67 #  if defined (sun) && !defined (_POSIX_SOURCE) /* XXX - SunOS4, SunOS5? */
68 #    define _POSIX_SOURCE
69 #  endif
70 #else /* !_POSIX_VERSION */
71 #  if defined (USG) || defined (hpux) || defined (Xenix) || defined (sgi)
72 #    undef NEW_TTY_DRIVER
73 #    define TERMIO_TTY_DRIVER
74 #  endif /* USG | hpux | Xenix | sgi */
75 #endif /* !_POSIX_VERSION */
76
77 /* Include the right header file for the specific type of terminal
78    handler installed on this system. */
79 #if defined (NEW_TTY_DRIVER)
80 #include <sgtty.h>
81 #endif
82
83 #if defined (TERMIO_TTY_DRIVER)
84 #include <termio.h>
85 #endif
86
87 #if defined (TERMIOS_TTY_DRIVER)
88 /* For Sun workstations we undefine a couple of defines so that
89    the inclusion of termios.h won't cause complaints. */
90 #  if defined (SunOS4)
91 #    undef ECHO
92 #    undef NOFLSH
93 #    undef TOSTOP
94 #  endif /* SunOS4 */
95 #  include <termios.h>
96 #endif /* TERMIOS_TTY_DRIVER */
97
98 /* For the TIOCGPGRP and TIOCSPGRP ioctl parameters on HP-UX */
99
100 #if defined (hpux) && !defined (TERMIOS_TTY_DRIVER)
101 #  include <bsdtty.h>
102 #endif /* hpux && !TERMIOS_TTY_DRIVER */
103
104 #include "bashansi.h"
105 #include "shell.h"
106 #include "jobs.h"
107
108 #include "builtins/builtext.h"
109 #include "builtins/common.h"
110
111 /* Not all systems declare errno in errno.h... and some systems #define it! */
112 #if !defined (errno)
113 extern int errno;
114 #endif /* !errno */
115
116 /* Variables used here but defined in other files. */
117 extern int interactive, interactive_shell, asynchronous_notification;
118 extern int subshell_environment;
119 extern int posixly_correct, no_symbolic_links, shell_level;
120 extern int interrupt_immediately, last_command_exit_value;
121 extern int loop_level, breaking;
122 extern Function *this_shell_builtin;
123 extern char *shell_name, *this_command_name;
124 extern sigset_t top_level_mask;
125
126 /* The array of known jobs. */
127 JOB **jobs = (JOB **)NULL;
128
129 /* The number of slots currently allocated to JOBS. */
130 int job_slots = 0;
131
132 /* The number of additional slots to allocate when we run out. */
133 #define JOB_SLOTS 5
134
135 /* The controlling tty for this shell. */
136 int shell_tty = -1;
137
138 /* The shell's process group. */
139 pid_t shell_pgrp = NO_PID;
140
141 /* The terminal's process group. */
142 pid_t terminal_pgrp = NO_PID;
143
144 /* The process group of the shell's parent. */
145 pid_t original_pgrp = NO_PID;
146
147 /* The process group of the pipeline currently being made. */
148 pid_t pipeline_pgrp = (pid_t)0;
149
150 #if defined (PGRP_PIPE)
151 /* Pipes which each shell uses to communicate with the process group leader
152    until all of the processes in a pipeline have been started.  Then the
153    process leader is allowed to continue. */
154 int pgrp_pipe[2] = { -1, -1 };
155 #endif
156       
157 /* The job which is current; i.e. the one that `%+' stands for. */
158 int current_job = NO_JOB;
159
160 /* The previous job; i.e. the one that `%-' stands for. */
161 int previous_job = NO_JOB;
162
163 /* Last child made by the shell.  */
164 pid_t last_made_pid = NO_PID;
165
166 /* Pid of the last asynchronous child. */
167 pid_t last_asynchronous_pid = NO_PID;
168
169 /* The pipeline currently being built. */
170 PROCESS *the_pipeline = (PROCESS *)NULL;
171
172 /* If this is non-zero, do job control. */
173 int job_control = 1;
174
175 /* Call this when you start making children. */
176 int already_making_children = 0;
177
178 /* Functions local to this file. */
179 static sighandler flush_child ();
180 static int waitchld();
181 static PROCESS *find_pipeline ();
182 static char *current_working_directory ();
183 static char *job_working_directory ();
184 static pid_t last_pid ();
185 static int set_new_line_discipline (), map_over_jobs (), last_running_job ();
186 static int most_recent_job_in_state (), last_stopped_job (), find_job ();
187 static void notify_of_job_status (), cleanup_dead_jobs (), discard_pipeline ();
188 static void add_process (), set_current_job (), reset_current ();
189 static void pretty_print_job ();
190 static void mark_dead_jobs_as_notified ();
191 #if defined (PGRP_PIPE)
192 static void pipe_read (), pipe_close ();
193 #endif
194
195 static int waiting_for_job, sigchld;
196
197 /* Set this to non-zero whenever you don't want the jobs list to change at
198    all: no jobs deleted and no status change notifications.  This is used,
199    for example, when executing SIGCHLD traps, which may run arbitrary
200    commands. */
201 static int freeze_jobs_list;
202
203 #if !defined (_POSIX_VERSION)
204
205 /* These are definitions to map POSIX 1003.1 functions onto existing BSD
206    library functions and system calls. */
207 #define setpgid(pid, pgrp)      setpgrp (pid, pgrp)
208 #define tcsetpgrp(fd, pgrp)     ioctl ((fd), TIOCSPGRP, &(pgrp))
209
210 pid_t
211 tcgetpgrp (fd)
212      int fd;
213 {
214   pid_t pgrp;
215
216   /* ioctl will handle setting errno correctly. */
217   if (ioctl (fd, TIOCGPGRP, &pgrp) < 0)
218     return (-1);
219   return (pgrp);
220 }
221
222 /* Perform OPERATION on NEWSET, perhaps leaving information in OLDSET. */
223 sigprocmask (operation, newset, oldset)
224      int operation, *newset, *oldset;
225 {
226   int old, new;
227
228   if (newset)
229     new = *newset;
230   else
231     new = 0;
232
233   switch (operation)
234     {
235     case SIG_BLOCK:
236       old = sigblock (new);
237       break;
238
239     case SIG_SETMASK:
240       sigsetmask (new);
241       break;
242
243     default:
244       internal_error ("Bad code in jobs.c: sigprocmask");
245     }
246
247   if (oldset)
248     *oldset = old;
249 }
250 #endif /* !_POSIX_VERSION */
251
252 /* Return the working directory for the current process.  Unlike
253    job_working_directory, this does not call malloc (), nor do any
254    of the functions it calls.  This is so that it can safely be called
255    from a signal handler. */
256 static char *
257 current_working_directory ()
258 {
259   char *dir;
260   static char d[MAXPATHLEN];
261
262   dir = get_string_value ("PWD");
263
264   if (!dir && the_current_working_directory && no_symbolic_links)
265     dir = the_current_working_directory;
266
267   if (!dir)
268     {
269       dir = getwd (d);
270       if (dir)
271         dir = d;
272     }
273
274   if (!dir)
275     return ("<unknown>");
276   else
277     return (dir);
278 }
279
280 /* Return the working directory for the current process. */
281 static char *
282 job_working_directory ()
283 {
284   char *dir;
285
286   dir = get_string_value ("PWD");
287   if (dir)
288     return (savestring (dir));
289
290   dir = get_working_directory ("job-working-directory");
291   if (dir)
292     return (dir);
293
294   return (savestring ("<unknown>"));
295 }
296
297 void
298 making_children ()
299 {
300   if (already_making_children)
301     return;
302
303   already_making_children = 1;
304   start_pipeline ();
305 }
306
307 void
308 stop_making_children ()
309 {
310   already_making_children = 0;
311 }
312
313 void
314 cleanup_the_pipeline ()
315 {
316   if (the_pipeline)
317     {
318       discard_pipeline (the_pipeline);
319       the_pipeline = (PROCESS *)NULL;
320     }
321 }
322
323 /* Start building a pipeline.  */
324 void
325 start_pipeline ()
326 {
327   if (the_pipeline)
328     {
329       discard_pipeline (the_pipeline);
330       the_pipeline = (PROCESS *)NULL;
331       pipeline_pgrp = 0;
332 #if defined (PGRP_PIPE)
333       pipe_close (pgrp_pipe);
334 #endif
335     }
336
337 #if defined (PGRP_PIPE)
338   if (job_control)
339     {
340       if (pipe (pgrp_pipe) == -1)
341         internal_error ("start_pipeline: pgrp pipe");
342     }
343 #endif
344 }
345
346 /* Stop building a pipeline.  Install the process list in the job array.
347    This returns the index of the newly installed job.
348    DEFERRED is a command structure to be executed upon satisfactory
349    execution exit of this pipeline. */
350 int
351 stop_pipeline (async, deferred)
352      int async;
353      COMMAND *deferred;
354 {
355   register int i, j;
356   JOB *newjob = (JOB *)NULL;
357   sigset_t set, oset;
358
359   BLOCK_CHILD (set, oset);
360
361 #if defined (PGRP_PIPE)
362   /* The parent closes the process group synchronization pipe. */
363   pipe_close (pgrp_pipe);
364 #endif
365     
366   cleanup_dead_jobs ();
367
368   if (!job_slots)
369     {
370       jobs =
371         (JOB **)xmalloc ((job_slots = JOB_SLOTS) * sizeof (JOB *));
372
373       /* Now blank out these new entries. */
374       for (i = 0; i < job_slots; i++)
375         jobs[i] = (JOB *)NULL;
376     }
377
378   /* Scan from the last slot backward, looking for the next free one. */
379   if (interactive)
380     {
381       for (i = job_slots; i; i--)
382         if (jobs[i - 1])
383           break;
384     }
385   else
386     {
387       /* If we're not interactive, we don't need to monotonically increase
388          the job number (in fact, we don't care about the job number at all),
389          so we can simply scan for the first free slot.  This helps to keep
390          us from continuously reallocating the jobs array when running
391          certain kinds of shell loops, and saves time spent searching. */
392       for (i = 0; i < job_slots; i++)
393         if (!jobs[i])
394           break;
395     }
396
397   /* Do we need more room? */
398   if (i == job_slots)
399     {
400       job_slots += JOB_SLOTS;
401       jobs = (JOB **)xrealloc (jobs, ((1 + job_slots) * sizeof (JOB *)));
402
403       for (j = i; j < job_slots; j++)
404         jobs[j] = (JOB *)NULL;
405     }
406
407   /* Add the current pipeline to the job list. */
408   if (the_pipeline)
409     {
410       register PROCESS *p;
411
412       newjob = (JOB *)xmalloc (sizeof (JOB));
413
414       for (p = the_pipeline; p->next != the_pipeline; p = p->next);
415       p->next = (PROCESS *)NULL;
416       newjob->pipe = REVERSE_LIST (the_pipeline, PROCESS *);
417       for (p = newjob->pipe; p->next; p = p->next);
418       p->next = newjob->pipe;
419
420       the_pipeline = (PROCESS *)NULL;
421       newjob->pgrp = pipeline_pgrp;
422       pipeline_pgrp = 0;
423
424       newjob->flags = 0;
425
426       /* Flag to see if in another pgrp. */
427       if (job_control)
428         newjob->flags |= J_JOBCONTROL;
429
430       /* Set the state of this pipeline. */
431       {
432         register PROCESS *p = newjob->pipe;
433         register int any_alive = 0;
434         register int any_stopped = 0;
435
436         do
437           {
438             any_alive |= p->running;
439             any_stopped |= WIFSTOPPED (p->status);
440             p = p->next;
441           }
442         while (p != newjob->pipe);
443
444         if (any_alive)
445           {
446             newjob->state = JRUNNING;
447           }
448         else
449           {
450             if (any_stopped)
451               newjob->state = JSTOPPED;
452             else
453               newjob->state = JDEAD;
454           }
455       }
456
457       newjob->wd = job_working_directory ();
458       newjob->deferred = deferred;
459
460       jobs[i] = newjob;
461     }
462
463   if (async)
464     {
465       if (newjob)
466         newjob->flags &= ~J_FOREGROUND;
467       reset_current ();
468     }
469   else
470     {
471       if (newjob)
472         {
473           newjob->flags |= J_FOREGROUND;
474           /*
475            *            !!!!! NOTE !!!!!  (chet@ins.cwru.edu)
476            *
477            * The currently-accepted job control wisdom says to set the
478            * terminal's process group n+1 times in an n-step pipeline:
479            * once in the parent and once in each child.  This is where
480            * the parent gives it away.
481            *
482            */
483           if (job_control && newjob->pgrp)
484             give_terminal_to (newjob->pgrp);
485         }
486     }
487
488   stop_making_children ();
489   UNBLOCK_CHILD (oset);
490   return (current_job);
491 }
492
493 /* Delete all DEAD jobs that the user had received notification about. */
494 static void
495 cleanup_dead_jobs ()
496 {
497   register int i;
498   sigset_t set, oset;
499
500   if (!job_slots || freeze_jobs_list)
501     return;
502
503   BLOCK_CHILD (set, oset);
504
505   for (i = 0; i < job_slots; i++)
506     if (jobs[i] && JOBSTATE (i) == JDEAD && (jobs[i]->flags & J_NOTIFIED))
507       delete_job (i);
508
509   UNBLOCK_CHILD (oset);
510 }
511
512 /* Delete the job at INDEX from the job list.  Must be called
513    with SIGCHLD blocked. */
514 void
515 delete_job (job_index)
516      int job_index;
517 {
518   register JOB *temp;
519
520   if (freeze_jobs_list)
521     return;
522
523   temp = jobs[job_index];
524   if (job_index == current_job || job_index == previous_job)
525     reset_current ();
526
527   jobs[job_index] = (JOB *)NULL;
528
529   free (temp->wd);
530   discard_pipeline (temp->pipe);
531
532   if (temp->deferred)
533     dispose_command (temp->deferred);
534
535   free (temp);
536 }
537
538 /* Get rid of the data structure associated with a process chain. */
539 static void
540 discard_pipeline (chain)
541      register PROCESS *chain;
542 {
543   register PROCESS *this, *next;
544
545   this = chain;
546   do
547     {
548       next = this->next;
549       if (this->command)
550         free (this->command);
551       free (this);
552       this = next;
553     }
554   while (this != chain);
555 }
556
557 /* Add this process to the chain being built in the_pipeline.
558    NAME is the command string that will be exec'ed later.
559    PID is the process id of the child. */
560 static void
561 add_process (name, pid)
562      char *name;
563      pid_t pid;
564 {
565   PROCESS *t = (PROCESS *)xmalloc (sizeof (PROCESS));
566
567   t->next = the_pipeline;
568   t->pid = pid;
569   WSTATUS (t->status) = 0;
570   t->running = 1;
571   t->command = name;
572   the_pipeline = t;
573
574   if (!(t->next))
575     t->next = t;
576   else
577     {
578       register PROCESS *p = t->next;
579
580       while (p->next != t->next)
581         p = p->next;
582       p->next = t;
583     }
584 }
585
586 #if 0
587 /* Take the last job and make it the first job.  Must be called with
588    SIGCHLD blocked. */
589 rotate_the_pipeline ()
590 {
591   PROCESS *p;
592
593   if (the_pipeline->next == the_pipeline)
594     return;
595   for (p = the_pipeline; p->next != the_pipeline; p = p->next)
596     ;
597   the_pipeline = p;
598 }
599
600 /* Reverse the order of the processes in the_pipeline.  Must be called with
601    SIGCHLD blocked. */
602 reverse_the_pipeline ()
603 {
604   PROCESS *p, *n;
605
606   if (the_pipeline->next == the_pipeline)
607     return;
608
609   for (p = the_pipeline; p->next != the_pipeline; p = p->next)
610     ;
611   p->next = (PROCESS *)NULL;
612
613   n = REVERSE_LIST (the_pipeline, PROCESS *);
614
615   the_pipeline = n;
616   for (p = the_pipeline; p->next; p = p->next)
617     ;
618   p->next = the_pipeline;
619 }
620 #endif
621
622 /* Map FUNC over the list of jobs.  If FUNC returns non-zero,
623    then it is time to stop mapping, and that is the return value
624    for map_over_jobs.  FUNC is called with a JOB, arg1, arg2,
625    and INDEX. */
626 static int
627 map_over_jobs (func, arg1, arg2)
628      Function *func;
629      int arg1, arg2;
630 {
631   register int i;
632   int result;
633   sigset_t set, oset;
634
635   BLOCK_CHILD (set, oset);
636   result = 0;
637
638   for (i = 0; i < job_slots; i++)
639     {
640       if (jobs[i])
641         {
642           result = (*func)(jobs[i], arg1, arg2, i);
643           if (result)
644             break;
645         }
646     }
647
648   UNBLOCK_CHILD (oset);
649   return (result);
650 }
651
652 /* Cause all the jobs in the current pipeline to exit. */
653 void
654 terminate_current_pipeline ()
655 {
656   if (pipeline_pgrp && pipeline_pgrp != shell_pgrp)
657     {
658       killpg (pipeline_pgrp, SIGTERM);
659       killpg (pipeline_pgrp, SIGCONT);
660     }
661 }
662
663 /* Cause all stopped jobs to exit. */
664 void
665 terminate_stopped_jobs ()
666 {
667   register int i;
668
669   for (i = 0; i < job_slots; i++)
670     {
671       if (jobs[i] && (JOBSTATE (i) == JSTOPPED))
672         {
673           killpg (jobs[i]->pgrp, SIGTERM);
674           killpg (jobs[i]->pgrp, SIGCONT);
675         }
676     }
677 }
678
679 /* Cause all jobs, running or stopped, to receive a hangup signal. */
680 void
681 hangup_all_jobs ()
682 {
683   register int i;
684
685   for (i = 0; i < job_slots; i++)
686     {
687       if (jobs[i])
688         {
689           killpg (jobs[i]->pgrp, SIGHUP);
690           if (JOBSTATE (i) == JSTOPPED)
691             killpg (jobs[i]->pgrp, SIGCONT);
692         }
693     }
694 }
695
696 void
697 kill_current_pipeline ()
698 {
699   stop_making_children ();
700   start_pipeline ();
701 }
702
703 /* Return the pipeline that PID belongs to.  Note that the pipeline
704    doesn't have to belong to a job.  Must be called with SIGCHLD blocked. */
705 static PROCESS *
706 find_pipeline (pid)
707      pid_t pid;
708 {
709   int job;
710
711   /* See if this process is in the pipeline that we are building. */
712   if (the_pipeline)
713     {
714       register PROCESS *p = the_pipeline;
715
716       do
717         {
718           /* Return it if we found it. */
719           if (p->pid == pid)
720             return (p);
721
722           p = p->next;
723         }
724       while (p != the_pipeline);
725     }
726
727   job = find_job (pid);
728
729   if (job == NO_JOB)
730     return ((PROCESS *)NULL);
731   else
732     return (jobs[job]->pipe);
733 }
734
735 /* Return the job index that PID belongs to, or NO_JOB if it doesn't
736    belong to any job.  Must be called with SIGCHLD blocked. */
737 static int
738 find_job (pid)
739      pid_t pid;
740 {
741   register int i;
742   register PROCESS *p;
743
744   for (i = 0; i < job_slots; i++)
745     {
746       if (jobs[i])
747         {
748           p = jobs[i]->pipe;
749
750           do
751             {
752               if (p->pid == pid)
753                 return (i);
754
755               p = p->next;
756             }
757           while (p != jobs[i]->pipe);
758         }
759     }
760
761   return (NO_JOB);
762 }
763
764 /* Print descriptive information about the job with leader pid PID. */
765 void
766 describe_pid (pid)
767      pid_t pid;
768 {
769   int job;
770   sigset_t set, oset;
771
772   BLOCK_CHILD (set, oset);
773
774   job = find_job (pid);
775
776   if (job != NO_JOB)
777     printf ("[%d] %d\n", job + 1, pid);
778   else
779     programming_error ("describe_pid: No such pid (%d)!\n", pid);
780
781   UNBLOCK_CHILD (oset);
782 }
783
784 /* This is the way to print out information on a job if you
785    know the index.  FORMAT is:
786
787     JLIST_NORMAL)   [1]+ Running           emacs
788     JLIST_LONG  )   [1]+ 2378 Running      emacs
789     -1    )   [1]+ 2378       emacs
790
791     JLIST_NORMAL)   [1]+ Stopped           ls | more
792     JLIST_LONG  )   [1]+ 2369 Stopped      ls
793                          2367       | more
794     JLIST_PID_ONLY)
795         Just list the pid of the process group leader (really
796         the process group).
797     JLIST_CHANGED_ONLY)
798         Use format JLIST_NORMAL, but list only jobs about which
799         the user has not been notified. */
800 static void
801 pretty_print_job (job_index, format, stream)
802      int job_index, format;
803      FILE *stream;
804 {
805   register PROCESS *p, *first, *last;
806   int name_padding;
807   char retcode_name_buffer[20];
808   sigset_t set, oset;
809
810   BLOCK_CHILD (set, oset);
811
812   /* Format only pid information about the process group leader? */
813   if (format == JLIST_PID_ONLY)
814     {
815       fprintf (stream, "%d\n", jobs[job_index]->pipe->pid);
816       UNBLOCK_CHILD (oset);
817       return;
818     }
819
820   if (format == JLIST_CHANGED_ONLY)
821     {
822       if (jobs[job_index]->flags & J_NOTIFIED)
823         {
824           UNBLOCK_CHILD (oset);
825           return;
826         }
827       format = JLIST_STANDARD;
828     }
829
830   fprintf (stream, "[%d]%c ", job_index + 1,
831            (job_index == current_job) ? '+':
832            (job_index == previous_job) ? '-' : ' ');
833
834   first = last = p = jobs[job_index]->pipe;
835   while (last->next != first)
836     last = last->next;
837
838   /* We have printed information about this job.  When the job's
839      status changes, waitchld () sets the notification flag to 0. */
840   jobs[job_index]->flags |= J_NOTIFIED;
841
842   for (;;)
843     {
844       if (p != first)
845         fprintf (stream, format ? "     " : " |");
846
847       if (format)
848         fprintf (stream, "%5d", p->pid);
849
850       fprintf (stream, " ");
851
852       if (format > -1)
853         {
854           PROCESS *show = format ? p : last;
855           char *temp = "Done";
856
857           if (JOBSTATE (job_index) == JSTOPPED && !format)
858             temp = "Stopped";
859
860           if (JOBSTATE (job_index) == JRUNNING)
861             temp = "Running";
862           else
863             {
864               if (WIFSTOPPED (show->status))
865                 temp = strsignal (WSTOPSIG (show->status));
866               else if (WIFSIGNALED (show->status))
867                 temp = strsignal (WTERMSIG (show->status));
868               else if (WIFEXITED (show->status))
869                 {
870                   int exit_status;
871
872                   temp = retcode_name_buffer;
873                   exit_status = WEXITSTATUS (show->status);
874
875                   if (!exit_status)
876                     strcpy (temp, "Done");
877                   else if (posixly_correct)
878                     sprintf (temp, "Done(%d)", exit_status);
879                   else
880                     sprintf (temp, "Exit %d", exit_status);
881                 }
882               else
883                 temp = "Unknown status";
884             }
885
886           if (p != first)
887             {
888               if (format)
889                 {
890                   if (show->running == first->running &&
891                       WSTATUS (show->status) == WSTATUS (first->status))
892                     temp = "";
893                 }
894               else
895                 temp = (char *)NULL;
896             }
897
898           if (temp)
899             {
900               int templ = strlen (temp);
901               fprintf (stream, "%s", temp);
902
903               if (templ)
904                 name_padding = LONGEST_SIGNAL_DESC - templ;
905               else
906                 name_padding = LONGEST_SIGNAL_DESC - 2; /* strlen ("| ") */
907
908               fprintf (stream, "%*s", name_padding, "");
909
910               if ((WIFSTOPPED (show->status) == 0) && (WIFCORED (show->status)))
911                 fprintf (stream, "(core dumped) ");
912             }
913         }
914
915       if (p != first && format)
916         fprintf (stream, "| ");
917
918       if (p->command)
919         fprintf (stream, "%s", p->command);
920
921       if (p == last) 
922         {
923           char *wd = current_working_directory ();
924
925           if (JOBSTATE (job_index) == JRUNNING &&
926               !(jobs[job_index]->flags & J_FOREGROUND))
927             fprintf (stream, " &");
928
929           if (strcmp (wd, jobs[job_index]->wd) != 0)
930             fprintf (stream,
931                      "  (wd: %s)", polite_directory_format (jobs[job_index]->wd));
932         }
933
934       if (format || (p == last))
935         fprintf (stream, "\r\n");
936
937       if (p == last)
938         break;
939       p = p->next;
940     }
941
942   fflush (stream);
943   UNBLOCK_CHILD (oset);
944 }
945
946 int
947 list_one_job (job, format, ignore, job_index)
948      JOB *job;
949      int format, ignore, job_index;
950 {
951   pretty_print_job (job_index, format, stdout);
952   return (0);
953 }
954
955 /* List jobs.  If FORMAT is non-zero, then the long form of the information
956    is printed, else just a short version. */
957 void
958 list_jobs (format)
959      int format;
960 {
961   cleanup_dead_jobs ();
962   map_over_jobs (list_one_job, format, (int)IGNORE_ARG);
963 }
964
965 /* Fork, handling errors.  Returns the pid of the newly made child, or 0.
966    COMMAND is just for remembering the name of the command; we don't do
967    anything else with it.  ASYNC_P says what to do with the tty.  If
968    non-zero, then don't give it away. */
969 pid_t
970 make_child (command, async_p)
971      char *command;
972      int async_p;
973 {
974   sigset_t set, oset;
975   pid_t pid;
976
977   sigemptyset (&set);
978   sigaddset (&set, SIGCHLD);
979   sigaddset (&set, SIGINT);
980   sigemptyset (&oset);
981   sigprocmask (SIG_BLOCK, &set, &oset);
982
983   making_children ();
984
985 #if defined (BUFFERED_INPUT)
986   /* If default_buffered_input is active, we are reading a script.  If
987      the command is asynchronous, we have already duplicated /dev/null
988      as fd 0, but have not changed the buffered stream corresponding to
989      the old fd 0.  We don't want to sync the stream in this case. */
990   if (default_buffered_input != -1 &&
991       (!async_p || default_buffered_input > 0))
992     sync_buffered_stream (default_buffered_input);
993 #endif /* BUFFERED_INPUT */
994
995   /* Create the child, handle severe errors. */
996   if ((pid = fork ()) < 0)
997     {
998       internal_error ("fork: %s", strerror (errno));
999
1000       /* Kill all of the processes in the current pipeline. */
1001       terminate_current_pipeline ();
1002
1003       /* Discard the current pipeline, if any. */
1004       if (the_pipeline)
1005         kill_current_pipeline ();
1006
1007       throw_to_top_level ();    /* Reset signals, etc. */
1008     }
1009
1010   if (pid == 0)
1011     {
1012       /* In the child.  Give this child the right process group, set the
1013          signals to the default state for a new process. */
1014       pid_t mine = getpid ();
1015
1016 #if defined (BUFFERED_INPUT)
1017       /* Close default_buffered_input if it's > 0.  We don't close it if it's
1018          0 because that's the file descriptor used when redirecting input,
1019          and it's wrong to close the file in that case. */
1020       if (default_buffered_input > 0)
1021         {
1022           close_buffered_fd (default_buffered_input);
1023           default_buffered_input = bash_input.location.buffered_fd = -1;
1024         }
1025 #endif /* BUFFERED_INPUT */
1026
1027       /* Restore top-level signal mask. */
1028       sigprocmask (SIG_SETMASK, &top_level_mask, (sigset_t *)NULL);
1029
1030       if (job_control)
1031         {
1032           /* All processes in this pipeline belong in the same
1033              process group. */
1034
1035           if (!pipeline_pgrp)   /* Then this is the first child. */
1036             pipeline_pgrp = mine;
1037
1038           /* Check for running command in backquotes. */
1039           if (pipeline_pgrp == shell_pgrp)
1040             {
1041               set_signal_handler (SIGTSTP, SIG_IGN);
1042               set_signal_handler (SIGTTOU, SIG_IGN);
1043               set_signal_handler (SIGTTIN, SIG_IGN);
1044             }
1045           else
1046             {
1047               set_signal_handler (SIGTSTP, SIG_DFL);
1048               set_signal_handler (SIGTTOU, SIG_DFL);
1049               set_signal_handler (SIGTTIN, SIG_DFL);
1050             }
1051
1052           /* Set the process group before trying to mess with the terminal's
1053              process group.  This is mandated by POSIX. */
1054           /* This is in accordance with the Posix 1003.1 standard,
1055              section B.7.2.4, which says that trying to set the terminal
1056              process group with tcsetpgrp() to an unused pgrp value (like
1057              this would have for the first child) is an error.  Section
1058              B.4.3.3, p. 237 also covers this, in the context of job control
1059              shells. */
1060           if (setpgid (mine, pipeline_pgrp) < 0)
1061             internal_error ("child setpgid (%d to %d) error %d: %s\n",
1062                             mine, pipeline_pgrp, errno, strerror (errno));
1063 #if defined (PGRP_PIPE)
1064           if (pipeline_pgrp == mine)
1065             {
1066 #endif
1067               if (!async_p)
1068                 give_terminal_to (pipeline_pgrp);
1069
1070 #if defined (PGRP_PIPE)
1071               pipe_read (pgrp_pipe);
1072             }
1073 #endif
1074         }
1075       else                      /* Without job control... */
1076         {
1077           if (!pipeline_pgrp)
1078             pipeline_pgrp = shell_pgrp;
1079
1080           /* If these signals are set to SIG_DFL, we encounter the curious
1081              situation of an interactive ^Z to a running process *working*
1082              and stopping the process, but being unable to do anything with
1083              that process to change its state.  On the other hand, if they
1084              are set to SIG_IGN, jobs started from scripts do not stop when
1085              the shell running the script gets a SIGTSTP and stops. */
1086
1087           set_signal_handler (SIGTSTP, SIG_DFL);
1088           set_signal_handler (SIGTTOU, SIG_DFL);
1089           set_signal_handler (SIGTTIN, SIG_DFL);
1090         }
1091
1092 #if defined (PGRP_PIPE)
1093       /* Release the process group pipe, since our call to setpgid ()
1094          is done.  The last call to pipe_close is done in stop_pipeline. */
1095       pipe_close (pgrp_pipe);
1096 #endif /* PGRP_PIPE */
1097
1098       if (async_p)
1099         last_asynchronous_pid = getpid ();
1100     }
1101   else
1102     {
1103       /* In the parent.  Remember the pid of the child just created
1104          as the proper pgrp if this is the first child. */
1105
1106       if (job_control)
1107         {
1108           if (!pipeline_pgrp)
1109             {
1110               pipeline_pgrp = pid;
1111               /* Don't twiddle terminal pgrps in the parent!  This is the bug,
1112                  not the good thing of twiddling them in the child! */
1113               /* give_terminal_to (pipeline_pgrp); */
1114             }
1115           /* This is done on the recommendation of the Rationale section of
1116              the POSIX 1003.1 standard, where it discusses job control and
1117              shells.  It is done to avoid possible race conditions. (Ref.
1118              1003.1 Rationale, section B.4.3.3, page 236). */
1119           setpgid (pid, pipeline_pgrp);
1120         }
1121       else
1122         {
1123           if (!pipeline_pgrp)
1124             pipeline_pgrp = shell_pgrp;
1125         }
1126
1127       /* Place all processes into the jobs array regardless of the
1128          state of job_control. */
1129       add_process (command, pid);
1130
1131       if (async_p)
1132         last_asynchronous_pid = pid;
1133
1134       last_made_pid = pid;
1135
1136       /* Unblock SIGINT and SIGCHLD. */
1137       sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
1138     }
1139
1140   return (pid);
1141 }
1142
1143 /* When we end a job abnormally, or if we stop a job, we set the tty to the
1144    state kept in here.  When a job ends normally, we set the state in here
1145    to the state of the tty. */
1146
1147 #if defined (NEW_TTY_DRIVER)
1148 static struct sgttyb shell_tty_info;
1149 static struct tchars shell_tchars;
1150 static struct ltchars shell_ltchars;
1151 #endif /* NEW_TTY_DRIVER */
1152
1153 #if defined (TERMIO_TTY_DRIVER)
1154 static struct termio shell_tty_info;
1155 #endif /* TERMIO_TTY_DRIVER */
1156
1157 #if defined (TERMIOS_TTY_DRIVER)
1158 static struct termios shell_tty_info;
1159 #endif /* TERMIOS_TTY_DRIVER */
1160
1161 #if defined (NEW_TTY_DRIVER) && defined (DRAIN_OUTPUT)
1162 /* Since the BSD tty driver does not allow us to change the tty modes
1163    while simultaneously waiting for output to drain and preserving
1164    typeahead, we have to drain the output ourselves before calling
1165    ioctl.  We cheat by finding the length of the output queue, and
1166    using select to wait for an appropriate length of time.  This is
1167    a hack, and should be labeled as such (it's a hastily-adapted
1168    mutation of a `usleep' implementation).  It's only reason for
1169    existing is the flaw in the BSD tty driver. */
1170
1171 static int ttspeeds[] =
1172 {
1173   0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
1174   1800, 2400, 4800, 9600, 19200, 38400
1175 };
1176
1177 static void
1178 draino (fd, ospeed)
1179      int fd, ospeed;
1180 {
1181   register int delay = ttspeeds[ospeed];
1182   int n;
1183
1184   if (!delay)
1185     return;
1186
1187   while ((ioctl (fd, TIOCOUTQ, &n) == 0) && n)
1188     {
1189       if (n > (delay / 100))
1190         {
1191           struct timeval tv;
1192
1193           n *= 10;              /* 2 bits more for conservativeness. */
1194           tv.tv_sec = n / delay;
1195           tv.tv_usec = ((n % delay) * 1000000) / delay;
1196           select (fd, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
1197         }
1198       else
1199         break;
1200     }
1201 }
1202 #endif /* NEW_TTY_DRIVER && DRAIN_OUTPUT */
1203
1204 /* Return the fd from which we are actually getting input. */
1205 #define input_tty() (shell_tty != -1) ? shell_tty : fileno (stderr)
1206
1207 /* Fill the contents of shell_tty_info with the current tty info. */
1208 get_tty_state ()
1209 {
1210   int tty = input_tty ();
1211
1212   if (tty != -1)
1213     {
1214 #if defined (NEW_TTY_DRIVER)
1215       ioctl (tty, TIOCGETP, &shell_tty_info);
1216       ioctl (tty, TIOCGETC, &shell_tchars);
1217       ioctl (tty, TIOCGLTC, &shell_ltchars);
1218 #endif /* NEW_TTY_DRIVER */
1219
1220 #if defined (TERMIO_TTY_DRIVER)
1221       ioctl (tty, TCGETA, &shell_tty_info);
1222 #endif /* TERMIO_TTY_DRIVER */
1223
1224 #if defined (TERMIOS_TTY_DRIVER)
1225       if (tcgetattr (tty, &shell_tty_info) < 0)
1226         {
1227 #if 0
1228           /* Only print an error message if we're really interactive at
1229              this time. */
1230           if (interactive)
1231             internal_error ("[%d: %d] tcgetattr: %s",
1232                             getpid (), shell_level, strerror (errno));
1233 #endif
1234           return -1;
1235         }
1236 #endif /* TERMIOS_TTY_DRIVER */
1237     }
1238   return 0;
1239 }
1240
1241 /* Make the current tty use the state in shell_tty_info. */
1242 set_tty_state ()
1243 {
1244   int tty = input_tty ();
1245
1246   if (tty != -1)
1247     {
1248 #if defined (NEW_TTY_DRIVER)
1249 #  if defined (DRAIN_OUTPUT)
1250       draino (tty, shell_tty_info.sg_ospeed);
1251 #  endif /* DRAIN_OUTPUT */
1252       ioctl (tty, TIOCSETN, &shell_tty_info);
1253       ioctl (tty, TIOCSETC, &shell_tchars);
1254       ioctl (tty, TIOCSLTC, &shell_ltchars);
1255 #endif /* NEW_TTY_DRIVER */
1256
1257 #if defined (TERMIO_TTY_DRIVER)
1258       ioctl (tty, TCSETAW, &shell_tty_info);
1259 #endif /* TERMIO_TTY_DRIVER */
1260
1261 #if defined (TERMIOS_TTY_DRIVER)
1262       if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
1263         {
1264           /* Only print an error message if we're really interactive at
1265              this time. */
1266           if (interactive)
1267             internal_error ("[%d: %d] tcsetattr: %s",
1268                             getpid (), shell_level, strerror (errno));
1269           return -1;
1270         }
1271 #endif /* TERMIOS_TTY_DRIVER */
1272     }
1273   return 0;
1274 }
1275
1276 /* Given an index into the jobs array JOB, return the pid of the last
1277    process in that job's pipeline.  This is the one whose exit status
1278    counts. */
1279 static pid_t
1280 last_pid (job)
1281      int job;
1282 {
1283   register PROCESS *p;
1284   sigset_t set, oset;
1285
1286   BLOCK_CHILD (set, oset);
1287
1288   p = jobs[job]->pipe;
1289   while (p->next != jobs[job]->pipe)
1290     p = p->next;
1291
1292   UNBLOCK_CHILD (oset);
1293   return (p->pid);
1294 }
1295
1296 /* Wait for a particular child of the shell to finish executing.
1297    This low-level function prints an error message if PID is not
1298    a child of this shell.  It returns -1 if it fails, or 0 if not. */
1299 int
1300 wait_for_single_pid (pid)
1301      pid_t pid;
1302 {
1303   register PROCESS *child;
1304
1305   {
1306     sigset_t set, oset;
1307
1308     BLOCK_CHILD (set, oset);
1309     child = find_pipeline (pid);
1310     UNBLOCK_CHILD (oset);
1311   }
1312
1313   if (!child)
1314     {
1315       report_error ("wait: pid %d is not a child of this shell", pid);
1316       return (127);
1317     }
1318
1319   return (wait_for (pid));
1320 }
1321
1322 /* Wait for all of the backgrounds of this shell to finish. */
1323 void
1324 wait_for_background_pids ()
1325 {
1326   while (1)
1327     {
1328       register int i, count = 0;
1329       sigset_t set, oset;
1330
1331       BLOCK_CHILD (set, oset);
1332
1333       for (i = 0; i < job_slots; i++)
1334         if (jobs[i] && (JOBSTATE (i) == JRUNNING) &&
1335             (jobs[i]->flags & J_FOREGROUND) == 0)
1336           {
1337             count++;
1338             break;
1339           }
1340
1341       if (!count)
1342         {
1343           UNBLOCK_CHILD (oset);
1344           break;
1345         }
1346
1347       for (i = 0; i < job_slots; i++)
1348         if (jobs[i] && (JOBSTATE (i) == JRUNNING) &&
1349             (jobs[i]->flags & J_FOREGROUND) == 0)
1350           {
1351             pid_t pid = last_pid (i);
1352             UNBLOCK_CHILD (oset);
1353             QUIT;
1354             wait_for_single_pid (pid);
1355             break;
1356           }
1357     }
1358 }
1359
1360 /* Make OLD_SIGINT_HANDLER the SIGINT signal handler. */
1361 #define INVALID_SIGNAL_HANDLER (SigHandler *)wait_for_background_pids
1362 static SigHandler *old_sigint_handler = INVALID_SIGNAL_HANDLER;
1363
1364 static void
1365 restore_sigint_handler ()
1366 {
1367   if (old_sigint_handler != INVALID_SIGNAL_HANDLER)
1368     {
1369       set_signal_handler (SIGINT, old_sigint_handler);
1370       old_sigint_handler = INVALID_SIGNAL_HANDLER;
1371     }
1372 }
1373
1374 static int wait_sigint_received = 0;
1375
1376 /* Handle SIGINT while we are waiting for children in a script to exit.
1377    The `wait' builtin should be interruptible, but all others should be
1378    effectively ignored (i.e. not cause the shell to exit). */
1379 static sighandler
1380 wait_sigint_handler (sig)
1381      int sig;
1382 {
1383   if (interrupt_immediately ||
1384       (this_shell_builtin && this_shell_builtin == wait_builtin))
1385     {
1386       last_command_exit_value = EXECUTION_FAILURE;
1387       restore_sigint_handler ();
1388       interrupt_state++;
1389       QUIT;
1390     }
1391
1392   wait_sigint_received = 1;     /* XXX - should this be interrupt_state? */
1393   /* Otherwise effectively ignore the SIGINT and allow the running job to
1394      be killed. */
1395 #if !defined (VOID_SIGHANDLER)
1396   return (0);
1397 #endif /* !VOID_SIGHANDLER */
1398 }
1399
1400 static int
1401 process_exit_status (status)
1402      WAIT status;
1403 {
1404   if (WIFSIGNALED (status))
1405     return (128 + WTERMSIG (status));
1406   else if (!WIFSTOPPED (status))
1407     return (WEXITSTATUS (status));
1408   else
1409     return (EXECUTION_SUCCESS);
1410 }
1411
1412 /* Wait for pid (one of our children) to terminate, then
1413    return the termination state. */
1414 int
1415 wait_for (pid)
1416      pid_t pid;
1417 {
1418   int job, termination_state;
1419   register PROCESS *child;
1420   sigset_t set, oset;
1421
1422   /* In the case that this code is interrupted, and we longjmp () out of it,
1423      we are relying on the code in throw_to_top_level () to restore the
1424      top-level signal mask. */
1425   BLOCK_CHILD (set, oset);
1426
1427   /* Ignore interrupts while waiting for a job run without job control
1428      to finish.  We don't want the shell to exit if an interrupt is
1429      received, only if one of the jobs run is killed via SIGINT.  If
1430      job control is not set, the job will be run in the same pgrp as 
1431      the shell, and the shell will see any signals the job gets. */
1432
1433   /* This is possibly a race condition -- should it go in stop_pipeline? */
1434   wait_sigint_received = 0;
1435   if (!job_control)
1436     old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
1437
1438   termination_state = last_command_exit_value;
1439
1440   /* If we say wait_for (), then we have a record of this child somewhere.
1441      If this child and all of its peers are not running, then don't
1442      sigpause (), since there is no need to. */
1443  wait_loop:
1444
1445   /* If the shell is interactive, and job control is disabled, see if the
1446      foreground process has died due to SIGINT and jump out of the wait
1447      loop if it has.  waitchld has already restored the old SIGINT
1448      signal handler. */
1449   if (interactive && !job_control)
1450     QUIT;
1451
1452   child = find_pipeline (pid);
1453
1454   if (!child)
1455     {
1456       give_terminal_to (shell_pgrp);
1457       UNBLOCK_CHILD (oset);
1458       programming_error ("wait_for: No record of pid %d", pid);
1459     }
1460
1461   /* If this child is part of a job, then we are really waiting for the
1462      job to finish.  Otherwise, we are waiting for the child to finish. */
1463
1464   job = find_job (pid);
1465
1466   if (job != NO_JOB)
1467     {
1468       register int job_state = 0, any_stopped = 0;
1469       register PROCESS *p = jobs[job]->pipe;
1470
1471       do
1472         {
1473           job_state |= p->running;
1474           if (!p->running)
1475             any_stopped |= WIFSTOPPED (p->status);
1476           p = p->next;
1477         }
1478       while (p != jobs[job]->pipe);
1479
1480       if (job_state == 0)
1481         {
1482           if (any_stopped)
1483             jobs[job]->state = JSTOPPED;
1484           else
1485             jobs[job]->state = JDEAD;
1486         }
1487     }
1488
1489   if (child->running || ((job != NO_JOB) && (JOBSTATE (job) == JRUNNING)))
1490     {
1491 #if defined (WAITPID_BROKEN)    /* SCOv4 */
1492       sigset_t suspend_set;
1493       sigemptyset (&suspend_set);
1494       sigsuspend (&suspend_set);
1495 #else /* !WAITPID_BROKEN */
1496 #  if defined (MUST_UNBLOCK_CHILD)      /* SCO */
1497       struct sigaction act, oact;
1498       sigset_t nullset, chldset;
1499
1500       sigemptyset (&nullset);
1501       sigemptyset (&chldset);
1502       sigprocmask (SIG_SETMASK, &nullset, &chldset);
1503       act.sa_handler = SIG_DFL;
1504       sigemptyset (&act.sa_mask);
1505       sigemptyset (&oact.sa_mask);
1506       act.sa_flags = 0;
1507       sigaction (SIGCHLD, &act, &oact);
1508 #  endif
1509       waiting_for_job = 1;
1510       waitchld (0);
1511       waiting_for_job = 0;
1512 #  if defined (MUST_UNBLOCK_CHILD)
1513       sigaction (SIGCHLD, &oact, (struct sigaction *)NULL);
1514       sigprocmask (SIG_SETMASK, &chldset, (sigset_t *)NULL);
1515 #  endif
1516 #endif /* !WAITPID_BROKEN */
1517       goto wait_loop;
1518     }
1519
1520   /* The exit state of the command is either the termination state of the
1521      child, or the termination state of the job.  If a job, the status
1522      of the last child in the pipeline is the significant one. */
1523
1524   if (job != NO_JOB)
1525     {
1526       register PROCESS *p = jobs[job]->pipe;
1527
1528       while (p->next != jobs[job]->pipe)
1529         p = p->next;
1530       termination_state = process_exit_status (p->status);
1531     }
1532   else
1533     termination_state = process_exit_status (child->status);
1534
1535   if (job == NO_JOB || (jobs[job]->flags & J_JOBCONTROL))
1536     give_terminal_to (shell_pgrp);
1537
1538   /* If the command did not exit cleanly, or the job is just
1539      being stopped, then reset the tty state back to what it
1540      was before this command.  Reset the tty state and notify
1541      the user of the job termination only if the shell is
1542      interactive.  Clean up any dead jobs in either case. */
1543   if (job != NO_JOB)
1544     {
1545       if (interactive_shell && !subshell_environment)
1546         {
1547           if (WIFSIGNALED (child->status) || WIFSTOPPED (child->status))
1548             set_tty_state ();
1549           else
1550             get_tty_state ();
1551
1552           /* If job control is enabled, the job was started with job
1553              control, the job was the foreground job, and it was killed
1554              by SIGINT, then print a newline to compensate for the kernel
1555              printing the ^C without a trailing newline. */
1556           if (job_control && (jobs[job]->flags & J_JOBCONTROL) &&
1557                 (jobs[job]->flags & J_FOREGROUND) && 
1558                 WIFSIGNALED (child->status) &&
1559                 WTERMSIG (child->status) == SIGINT)
1560             {
1561               /* If SIGINT is not trapped, set the interrupt state if in a
1562                  loop so the loop will be broken.  If not in a loop, print
1563                  the newline that the kernel does not. */
1564               if (signal_is_trapped (SIGINT) == 0)
1565                 {
1566                   if (loop_level)
1567                     interrupt_state++;
1568                   else
1569                     {
1570                       putchar ('\n');
1571                       fflush (stdout);
1572                     }
1573                 }
1574             }
1575
1576           notify_and_cleanup ();
1577         }
1578       else
1579         {
1580           /* If this job is dead, and the shell is not interactive, make
1581              sure we turn on the notify bit so we don't get an unwanted
1582              message about the job's termination, and so delete_job really
1583              clears the slot in the jobs table. */
1584           if (JOBSTATE(job) == JDEAD)
1585             jobs[job]->flags |= J_NOTIFIED;
1586           cleanup_dead_jobs ();
1587         }
1588     }
1589     
1590   UNBLOCK_CHILD (oset);
1591
1592   /* Restore the original SIGINT signal handler before we return. */
1593   restore_sigint_handler ();
1594
1595   return (termination_state);
1596 }
1597
1598 /* Wait for the last process in the pipeline for JOB. */
1599 int
1600 wait_for_job (job)
1601      int job;
1602 {
1603   pid_t pid = last_pid (job);
1604   return (wait_for (pid));
1605 }
1606
1607 /* Print info about dead jobs, and then delete them from the list
1608    of known jobs.  This does not actually delete jobs when the
1609    shell is not interactive, because the dead jobs are not marked
1610    as notified. */
1611 void
1612 notify_and_cleanup ()
1613 {
1614   if (freeze_jobs_list)
1615     return;
1616
1617   if (interactive)
1618     notify_of_job_status ();
1619
1620   cleanup_dead_jobs ();
1621 }
1622
1623 /* Make dead jobs disappear from the jobs array without notification.
1624    This is used when the shell is not interactive. */
1625 void
1626 reap_dead_jobs ()
1627 {
1628   mark_dead_jobs_as_notified ();
1629   cleanup_dead_jobs ();
1630 }
1631
1632 /* Return the next closest (chronologically) job to JOB which is in
1633    STATE.  STATE can be JSTOPPED, JRUNNING.  NO_JOB is returned if
1634    there is no next recent job. */
1635 static int
1636 most_recent_job_in_state (job, state)
1637      int job;
1638      JOB_STATE state;
1639 {
1640   register int i, result;
1641   sigset_t set, oset;
1642
1643   BLOCK_CHILD (set, oset);
1644   result = NO_JOB;
1645
1646   for (i = job - 1; i >= 0; i--)
1647     {
1648       if (jobs[i])
1649         {
1650           if (JOBSTATE (i) == state)
1651             {
1652               result = i;
1653               break;
1654             }
1655         }
1656     }
1657   UNBLOCK_CHILD (oset);
1658   return (result);
1659 }
1660
1661 /* Return the newest *stopped* job older than JOB, or NO_JOB if not
1662    found. */
1663 static int
1664 last_stopped_job (job)
1665      int job;
1666 {
1667   return (most_recent_job_in_state (job, JSTOPPED));
1668 }
1669
1670 /* Return the newest *running* job older than JOB, or NO_JOB if not
1671    found. */
1672 static int
1673 last_running_job (job)
1674      int job;
1675 {
1676   return (most_recent_job_in_state (job, JRUNNING));
1677 }
1678
1679 /* Make JOB be the current job, and make previous be useful.  Must be
1680    called with SIGCHLD blocked. */
1681 static void
1682 set_current_job (job)
1683      int job;
1684 {
1685   int candidate = NO_JOB;
1686
1687   if (current_job != job)
1688     {
1689       previous_job = current_job;
1690       current_job = job;
1691     }
1692
1693   /* First choice for previous_job is the old current_job. */
1694   if (previous_job != current_job &&
1695       previous_job != NO_JOB &&
1696       jobs[previous_job] &&
1697       JOBSTATE (previous_job) == JSTOPPED)
1698     return;
1699
1700   /* Second choice:  Newest stopped job that is older than
1701      the current job. */
1702   if (JOBSTATE (current_job) == JSTOPPED)
1703     {
1704       candidate = last_stopped_job (current_job);
1705
1706       if (candidate != NO_JOB)
1707         {
1708           previous_job = candidate;
1709           return;
1710         }
1711     }
1712
1713   /* If we get here, there is either only one stopped job, in which case it is
1714      the current job and the previous job should be set to the newest running
1715      job, or there are only running jobs and the previous job should be set to
1716      the newest running job older than the current job.  We decide on which
1717      alternative to use based on whether or not JOBSTATE(current_job) is
1718      JSTOPPED. */
1719
1720   if (JOBSTATE (current_job) == JRUNNING)
1721     candidate = last_running_job (current_job);
1722   else
1723     candidate = last_running_job (job_slots);
1724
1725   if (candidate != NO_JOB)
1726     {
1727       previous_job = candidate;
1728       return;
1729     }
1730
1731   /* There is only a single job, and it is both `+' and `-'. */
1732   previous_job = current_job;
1733 }
1734
1735 /* Make current_job be something useful, if it isn't already. */
1736
1737 /* Here's the deal:  The newest non-running job should be `+', and the
1738    next-newest non-running job should be `-'.  If there is only a single
1739    stopped job, the previous_job is the newest non-running job.  If there
1740    are only running jobs, the newest running job is `+' and the
1741    next-newest running job is `-'.  Must be called with SIGCHLD blocked. */
1742 static void
1743 reset_current ()
1744 {
1745   int candidate = NO_JOB;
1746
1747   if (current_job != NO_JOB &&
1748       job_slots && jobs[current_job] &&
1749       JOBSTATE (current_job) == JSTOPPED)
1750     {
1751       candidate = current_job;
1752     }
1753   else
1754     {
1755       /* First choice: the previous job! */
1756       if (previous_job != NO_JOB && jobs[previous_job] &&
1757           JOBSTATE (previous_job) == JSTOPPED)
1758         candidate = previous_job;
1759
1760       /* Second choice: the most recently stopped job. */
1761       if (candidate == NO_JOB)
1762         candidate = last_stopped_job (job_slots);
1763
1764       if (candidate == NO_JOB)
1765         {
1766           /* Third choice: the newest running job. */
1767           candidate = last_running_job (job_slots);
1768         }
1769     }
1770
1771   /* If we found a job to use, then use it.  Otherwise, there
1772      are no jobs period. */
1773   if (candidate != NO_JOB)
1774     set_current_job (candidate);
1775   else
1776     current_job = previous_job = NO_JOB;
1777 }
1778
1779 /* Start a job.  FOREGROUND if non-zero says to do that.  Otherwise,
1780    start the job in the background.  JOB is a zero-based index into
1781    JOBS.  Returns -1 if it is unable to start a job, and the return
1782    status of the job otherwise. */
1783 int
1784 start_job (job, foreground)
1785      int job, foreground;
1786 {
1787   register PROCESS *p;
1788   int already_running;
1789   sigset_t set, oset;
1790   char *wd;
1791 #if defined (NEW_TTY_DRIVER)
1792   static struct sgttyb save_stty;
1793 #endif
1794
1795 #if defined (TERMIO_TTY_DRIVER)
1796   static struct termio save_stty;
1797 #endif
1798
1799 #if defined (TERMIOS_TTY_DRIVER)
1800   static struct termios save_stty;
1801 #endif
1802
1803   BLOCK_CHILD (set, oset);
1804   already_running = (JOBSTATE (job) == JRUNNING);
1805
1806   if (JOBSTATE (job) == JDEAD)
1807     {
1808       report_error ("%s: job has terminated", this_command_name);
1809       UNBLOCK_CHILD (oset);
1810       return (-1);
1811     }
1812
1813   if (!foreground && already_running)
1814     {
1815       report_error ("%s: bg background job?", this_command_name);
1816       UNBLOCK_CHILD (oset);
1817       return (-1);
1818     }
1819
1820   wd = current_working_directory ();
1821
1822   /* You don't know about the state of this job.  Do you? */
1823   jobs[job]->flags &= ~J_NOTIFIED;
1824
1825   if (foreground)
1826     {
1827       set_current_job (job);
1828       jobs[job]->flags |= J_FOREGROUND;
1829     }
1830
1831   /* Tell the outside world what we're doing. */
1832   p = jobs[job]->pipe;
1833
1834   if (!foreground)
1835     fprintf (stderr, "[%d]%c ", job + 1,
1836            (job == current_job) ? '+': ((job == previous_job) ? '-' : ' '));
1837
1838   do
1839     {
1840       fprintf (stderr, "%s%s",
1841                p->command ? p->command : "",
1842                p->next != jobs[job]->pipe? " | " : "");
1843       p = p->next;
1844     }
1845   while (p != jobs[job]->pipe);
1846
1847   if (!foreground)
1848     fprintf (stderr, " &");
1849
1850   if (strcmp (wd, jobs[job]->wd) != 0)
1851     fprintf (stderr, "  (wd: %s)", polite_directory_format (jobs[job]->wd));
1852
1853   fprintf (stderr, "\n");
1854
1855   /* Run the job. */
1856   if (!already_running)
1857     {
1858       /* Each member of the pipeline is now running. */
1859       p = jobs[job]->pipe;
1860
1861       do
1862         {
1863           if (WIFSTOPPED (p->status))
1864             p->running = 1;
1865           p = p->next;
1866         }
1867       while (p != jobs[job]->pipe);
1868
1869       /* This means that the job is running. */
1870       JOBSTATE (job) = JRUNNING;
1871     }
1872
1873   /* Save the tty settings before we start the job in the foreground. */
1874   if (foreground)
1875     {
1876       get_tty_state ();
1877       save_stty = shell_tty_info;
1878     }
1879
1880   /* Give the terminal to this job. */
1881   if (foreground)
1882     {
1883       if (jobs[job]->flags & J_JOBCONTROL)
1884         give_terminal_to (jobs[job]->pgrp);
1885     }
1886   else
1887     jobs[job]->flags &= ~J_FOREGROUND;
1888
1889   /* If the job is already running, then don't bother jump-starting it. */
1890   if (!already_running)
1891     {
1892       jobs[job]->flags |= J_NOTIFIED;
1893       killpg (jobs[job]->pgrp, SIGCONT);
1894     }
1895
1896   UNBLOCK_CHILD (oset);
1897
1898   if (foreground)
1899     {
1900       pid_t pid = last_pid (job);
1901       int s = wait_for (pid);
1902
1903       shell_tty_info = save_stty;
1904       set_tty_state ();
1905       return (s);
1906     }
1907   else
1908     {
1909       BLOCK_CHILD (set, oset);
1910       reset_current ();
1911       UNBLOCK_CHILD (oset);
1912       return (0);
1913     }
1914 }
1915
1916 /* Give PID SIGNAL.  This determines what job the pid belongs to (if any).
1917    If PID does belong to a job, and the job is stopped, then CONTinue the
1918    job after giving it SIGNAL.  Returns -1 on failure.  If GROUP is non-null,
1919    then kill the process group associated with PID. */
1920 int
1921 kill_pid (pid, sig, group)
1922      pid_t pid;
1923      int sig, group;
1924 {
1925   register PROCESS *p;
1926   int job, result = EXECUTION_SUCCESS;
1927   sigset_t set, oset;
1928
1929   BLOCK_CHILD (set, oset);
1930   p = find_pipeline (pid);
1931   job = find_job (pid);
1932
1933   if (group)
1934     {
1935       if (job != NO_JOB)
1936         {
1937           jobs[job]->flags &= ~J_NOTIFIED;
1938
1939           /* Kill process in backquotes or one started without job control? */
1940           if (jobs[job]->pgrp == shell_pgrp)
1941             {
1942               p = jobs[job]->pipe;
1943
1944               do
1945                 {
1946                   kill (p->pid, sig);
1947                   if (p->running == 0 && (sig == SIGTERM || sig == SIGHUP))
1948                     kill (p->pid, SIGCONT);
1949                   p = p->next;
1950                 }
1951               while (p != jobs[job]->pipe);
1952             }
1953           else
1954             {
1955               result = killpg (jobs[job]->pgrp, sig);
1956               if (p && (JOBSTATE (job) == JSTOPPED) &&
1957                   (sig == SIGTERM || sig == SIGHUP))
1958                 killpg (jobs[job]->pgrp, SIGCONT);
1959             }
1960         }
1961       else
1962         result = killpg (pid, sig);
1963     }
1964   else
1965     result = kill (pid, sig);
1966
1967   UNBLOCK_CHILD (oset);
1968   return (result);
1969 }
1970
1971 /* Take care of system dependencies that must be handled when waiting for
1972    children.  The arguments to the WAITPID macro match those to the Posix.1
1973    waitpid() function. */
1974
1975 #if defined (Ultrix) && defined (mips) && defined (_POSIX_VERSION)
1976 #  define WAITPID(pid, statusp, options) \
1977         wait3 ((union wait *)statusp, options, (struct rusage *)0)
1978 #else
1979 #  if defined (_POSIX_VERSION)
1980 #    define WAITPID(pid, statusp, options) \
1981         waitpid ((pid_t)pid, statusp, options)
1982 #  else
1983 #    if defined (hpux)
1984 #      define WAITPID(pid, statusp, options) \
1985         wait3 (statusp, options, (int *)0)
1986 #    else
1987 #      define WAITPID(pid, statusp, options) \
1988         wait3 (statusp, options, (struct rusage *)0)
1989 #    endif /* !hpux */
1990 #  endif /* !_POSIX_VERSION */
1991 #endif /* !(Ultrix && mips && _POSIX_VERSION) */
1992
1993 /* If the system needs it, REINSTALL_SIGCHLD_HANDLER will reinstall the
1994    handler for SIGCHLD. */
1995
1996 #if defined (hpux) && !defined (_POSIX_VERSION)
1997 #  define REINSTALL_SIGCHLD_HANDLER signal (SIGCHLD, flush_child)
1998 #else
1999 #  define REINSTALL_SIGCHLD_HANDLER
2000 #endif /* !hpux || _POSIX_VERSION */
2001
2002 /* Flush_child () flushes at least one of the children that we are waiting for.
2003    It gets run when we have gotten a SIGCHLD signal, and stops when there
2004    aren't any children terminating any more.  If SIG is 0, this is to be a
2005    blocking wait for a single child. */
2006 static sighandler
2007 flush_child (sig)
2008      int sig;
2009 {
2010   REINSTALL_SIGCHLD_HANDLER;
2011   sigchld++;
2012   if (waiting_for_job == 0)
2013     waitchld (sig);
2014
2015 #if !defined (VOID_SIGHANDLER)
2016   return (0);
2017 #endif /* VOID_SIGHANDLER */
2018 }
2019   
2020 static int
2021 waitchld (s)
2022      int s;
2023 {
2024   WAIT status;
2025   PROCESS *child;
2026   pid_t pid;
2027   int call_set_current = 0, last_stopped_job = NO_JOB;
2028   int children_exited = 0, flag;
2029
2030   do
2031     {
2032       flag = WUNTRACED;
2033       if (sigchld || s)
2034         flag |= WNOHANG;
2035       pid = WAITPID (-1, &status, flag);
2036       if (sigchld && (flag & WNOHANG))
2037         sigchld--;
2038
2039       if (pid > 0)
2040         {
2041           /* Locate our PROCESS for this pid. */
2042           child = find_pipeline (pid);
2043
2044           /* It is not an error to have a child terminate that we did
2045              not have a record of.  This child could have been part of
2046              a pipeline in backquote substitution. */
2047           if (child)
2048             {
2049               int job = find_job (pid);
2050
2051               while (child->pid != pid)
2052                 child = child->next;
2053
2054               /* Remember status, and fact that process is not running. */
2055               child->status = status;
2056               child->running = 0;
2057
2058               if (job != NO_JOB)
2059                 {
2060                   int job_state = 0;
2061                   int any_stopped = 0;
2062                   int any_tstped = 0;
2063
2064                   child = jobs[job]->pipe;
2065                   jobs[job]->flags &= ~J_NOTIFIED;
2066
2067                   /* If all children are not running, but any of them is
2068                      stopped, then the job is stopped, not dead. */
2069                   do
2070                    {
2071                       job_state |= child->running;
2072                       if (!child->running)
2073                         {
2074                           any_stopped |= WIFSTOPPED (child->status);
2075                           any_tstped |= interactive && job_control &&
2076                                         WIFSTOPPED (child->status) &&
2077                                         WSTOPSIG (child->status) == SIGTSTP;
2078                         }
2079                       child = child->next;
2080                     }
2081                   while (child != jobs[job]->pipe);
2082
2083                   if (job_state == 0)
2084                     {
2085                       if (any_stopped)
2086                         {
2087                           jobs[job]->state = JSTOPPED;
2088                           jobs[job]->flags &= ~J_FOREGROUND;
2089                           call_set_current++;
2090                           last_stopped_job = job;
2091                           /* Suspending a job in a loop from the keyboard
2092                              breaks out of all active loops. */
2093                           if (any_tstped && loop_level)
2094                             breaking = loop_level;
2095                         }
2096                       else
2097                         {
2098                           jobs[job]->state = JDEAD;
2099
2100                           if (job == last_stopped_job)
2101                             last_stopped_job = NO_JOB;
2102
2103                           /* If the foreground job is killed by SIGINT when
2104                              job control is not active, we need to perform
2105                              some special handling. */
2106                           /* The check of wait_sigint_received is a way to
2107                              determine if the SIGINT came from the keyboard
2108                              (in which case the shell has already seen it,
2109                              and wait_sigint_received is non-zero, because
2110                              keyboard signals are sent to process groups)
2111                              or via kill(2) to the foreground process by
2112                              another process (or itself).  If the shell did
2113                              receive the SIGINT, it needs to perform normal
2114                              SIGINT processing. */
2115                           if ((WTERMSIG (jobs[job]->pipe->status) == SIGINT) &&
2116                               (jobs[job]->flags & J_FOREGROUND) &&
2117                               (jobs[job]->flags & J_JOBCONTROL) == 0 &&
2118                               wait_sigint_received)
2119                             {
2120                               wait_sigint_received = 0;
2121
2122                               /* If SIGINT is trapped, set the exit status so
2123                                  that the trap handler can see it. */
2124                               if (signal_is_trapped (SIGINT))
2125                                 last_command_exit_value = process_exit_status
2126                                   (jobs[job]->pipe->status);
2127
2128                               /* If the signal is trapped, let the trap handler
2129                                  get it no matter what and simply return if
2130                                  the trap handler returns.
2131                                  maybe_call_trap_handler may cause dead jobs
2132                                  to be removed from the job table because of
2133                                  a call to execute_command.  Watch out for
2134                                  this. */
2135                               if (maybe_call_trap_handler (SIGINT) == 0 &&
2136                                   old_sigint_handler != INVALID_SIGNAL_HANDLER)
2137                                 {
2138                                   /* wait_sigint_handler () has already
2139                                      seen SIGINT and allowed the wait
2140                                      builtin to jump out.  We need to
2141                                      call the original SIGINT handler. */
2142                                   SigHandler *temp_handler;
2143                                   temp_handler = old_sigint_handler;
2144                                   restore_sigint_handler ();
2145                                   if (temp_handler != SIG_IGN)
2146                                     (*temp_handler) (SIGINT);
2147                                 }
2148                             }
2149                         }
2150                     }
2151                 }
2152             }
2153           /* If we have caught a child, and a trap was set for SIGCHLD, then
2154              bump up the count of the number of children that have exited,
2155              so we know how many times to call it. */
2156           children_exited++;
2157         }
2158     }
2159   while ((s || sigchld) && pid > (pid_t)0);
2160
2161   /* If a job was running and became stopped, then set the current
2162      job.  Otherwise, don't change a thing. */
2163   if (call_set_current)
2164     if (last_stopped_job != NO_JOB)
2165       set_current_job (last_stopped_job);
2166     else
2167       reset_current ();
2168
2169   /* Call a SIGCHLD trap handler for each child that exits, if one is set. */
2170   if (job_control && signal_is_trapped (SIGCHLD) &&
2171       trap_list[SIGCHLD] != (char *)IGNORE_SIG)
2172     {
2173       char *trap_command;
2174
2175       /* Turn off the trap list during the call to parse_and_execute ()
2176          to avoid potentially infinite recursive calls.  Preserve the
2177          values of last_command_exit_value, last_made_pid, and the_pipeline
2178          around the execution of the trap commands. */
2179       trap_command = savestring (trap_list[SIGCHLD]);
2180
2181       begin_unwind_frame ("SIGCHLD trap");
2182       unwind_protect_int (last_command_exit_value);
2183       unwind_protect_int (last_made_pid);
2184       unwind_protect_int (interrupt_immediately);
2185       unwind_protect_int (freeze_jobs_list);
2186       unwind_protect_pointer (the_pipeline);
2187
2188       /* We have to add the commands this way because they will be run
2189          in reverse order of adding.  We don't want maybe_set_sigchld_trap ()
2190          to reference freed memory. */
2191       add_unwind_protect ((Function *)xfree, trap_command);
2192       add_unwind_protect ((Function *)maybe_set_sigchld_trap, trap_command);
2193
2194       the_pipeline = (PROCESS *)NULL;
2195       restore_default_signal (SIGCHLD);
2196       freeze_jobs_list = 1;
2197       while (children_exited--)
2198         {
2199           interrupt_immediately = 1;
2200           parse_and_execute (savestring (trap_command), "trap", -1);
2201         }
2202
2203       run_unwind_frame ("SIGCHLD trap");
2204     }
2205
2206   /* We have successfully recorded the useful information about this process
2207      that has just changed state.  If we notify asynchronously, and the job
2208      that this process belongs to is no longer running, then notify the user
2209      of that fact now. */
2210   if (asynchronous_notification && interactive)
2211     notify_of_job_status ();
2212
2213 }
2214
2215 /* Function to call when you want to notify people of changes
2216    in job status.  This prints out all jobs which are pending
2217    notification to stderr, and marks those printed as already
2218    notified, thus making them candidates for cleanup. */
2219 static void
2220 notify_of_job_status ()
2221 {
2222   register int job, termsig;
2223   char *dir;
2224   sigset_t set, oset;
2225
2226   sigemptyset (&set);
2227   sigaddset (&set, SIGCHLD);
2228   sigaddset (&set, SIGTTOU);
2229   sigemptyset (&oset);
2230   sigprocmask (SIG_BLOCK, &set, &oset);
2231
2232   dir = (char *)NULL;
2233
2234   for (job = 0; job < job_slots; job++)
2235     {
2236       if (jobs[job] && (jobs[job]->flags & J_NOTIFIED) == 0)
2237         {
2238           WAIT s;
2239
2240           s = jobs[job]->pipe->status;
2241           termsig = WTERMSIG (s);
2242
2243           /* If job control is disabled, don't print the status messages.
2244              Mark dead jobs as notified so that they get cleaned up. */
2245           if (!job_control)
2246             {
2247               if (JOBSTATE (job) == JDEAD)
2248                 jobs[job]->flags |= J_NOTIFIED;
2249               continue;
2250             }
2251
2252           switch (JOBSTATE (job))
2253             {
2254               /* Print info on jobs that are running in the background,
2255                  and on foreground jobs that were killed by anything
2256                  except SIGINT. */
2257
2258             case JDEAD:
2259
2260               if (jobs[job]->flags & J_FOREGROUND)
2261                 {
2262                   if (termsig && WIFSIGNALED (s) && termsig != SIGINT)
2263                     {
2264                       fprintf (stderr, "%s", strsignal (termsig));
2265
2266                       if (WIFCORED (s))
2267                         fprintf (stderr, " (core dumped)");
2268
2269                       fprintf (stderr, "\n");
2270                     }
2271                 }
2272               else
2273                 {
2274                   if (!dir)
2275                     dir = current_working_directory ();
2276                   pretty_print_job (job, 0, stderr);
2277                   if (dir && strcmp (dir, jobs[job]->wd) != 0)
2278                     fprintf (stderr,
2279                              "(wd now: %s)\n", polite_directory_format (dir));
2280                 }
2281
2282               jobs[job]->flags |= J_NOTIFIED;
2283               break;
2284
2285             case JSTOPPED:
2286               fprintf (stderr, "\n");
2287               if (!dir)
2288                 dir = current_working_directory ();
2289               pretty_print_job (job, 0, stderr);
2290               if (dir && (strcmp (dir, jobs[job]->wd) != 0))
2291                 fprintf (stderr,
2292                          "(wd now: %s)\n", polite_directory_format (dir));
2293               jobs[job]->flags |= J_NOTIFIED;
2294               break;
2295
2296             case JRUNNING:
2297             case JMIXED:
2298               break;
2299
2300             default:
2301               programming_error ("notify_of_job_status");
2302             }
2303         }
2304     }
2305   sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
2306 }
2307
2308 /* getpgrp () varies between systems.  Even systems that claim to be
2309    Posix.1 compatible lie sometimes (Ultrix, SunOS4, apollo). */
2310 #if defined (_POSIX_VERSION) && !defined (BSD_GETPGRP)
2311 #  define getpgid(p) getpgrp ()
2312 #else
2313 #  define getpgid(p) getpgrp (p)
2314 #endif /* !_POSIX_VERSION || BSD_GETPGRP */
2315
2316 /* Initialize the job control mechanism, and set up the tty stuff. */
2317 initialize_jobs ()
2318 {
2319   shell_pgrp = getpgid (0);
2320
2321   if (shell_pgrp == -1)
2322     {
2323       internal_error ("initialize_jobs: getpgrp failed: %s", strerror (errno));
2324       exit (1);
2325     }
2326
2327   /* We can only have job control if we are interactive?
2328      I guess that makes sense. */
2329
2330   if (!interactive)
2331     {
2332       job_control = 0;
2333       original_pgrp = NO_PID;
2334     }
2335   else
2336     {
2337       /* Make sure that we are using the new line discipline. */
2338
2339       /* Get our controlling terminal.  If job_control is set, or
2340          interactive is set, then this is an interactive shell no
2341          matter what. */
2342       shell_tty = dup (fileno (stderr));
2343
2344       /* Find the highest unused file descriptor we can. */
2345       {
2346         int ignore, nds = getdtablesize ();
2347
2348         if (nds <= 0)
2349           nds = 20;
2350         else if (nds > 256)
2351           nds = 256;
2352
2353         while (--nds > 3)
2354           {
2355             if (fcntl (nds, F_GETFD, &ignore) == -1)
2356               break;
2357           }
2358
2359         if (nds && shell_tty != nds && (dup2 (shell_tty, nds) != -1))
2360           {
2361             if (shell_tty != fileno (stderr))
2362               close (shell_tty);
2363             shell_tty = nds;
2364           }
2365       }
2366
2367 #if defined (RLOGIN_PGRP_BUG)
2368       /* Compensate for a bug in systems that compiled the BSD
2369          /usr/etc/rlogind with DEBUG defined, like NeXT and Alliant. */
2370       if (shell_pgrp == 0)
2371         {
2372           shell_pgrp = getpid ();
2373           setpgid (0, shell_pgrp);
2374           tcsetpgrp (shell_tty, shell_pgrp);
2375         }
2376 #endif /* RLOGIN_PGRP_BUG */
2377
2378       while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)
2379         {
2380           if (shell_pgrp != terminal_pgrp)
2381             {
2382               SigHandler *old_ttin = (SigHandler *)set_signal_handler (SIGTTIN, SIG_DFL);
2383               kill (0, SIGTTIN);
2384               set_signal_handler (SIGTTIN, old_ttin);
2385               continue;
2386             }
2387           break;
2388         }
2389
2390       if (set_new_line_discipline (shell_tty) < 0)
2391         {
2392           internal_error ("initialize_jobs: line discipline: %s",
2393                           strerror (errno));
2394           job_control = 0;
2395         }
2396       else
2397         {
2398           original_pgrp = shell_pgrp;
2399           shell_pgrp = getpid ();
2400
2401           if ((original_pgrp != shell_pgrp) && (setpgid (0, shell_pgrp) < 0))
2402             {
2403               internal_error ("initialize_jobs: setpgid: %s", strerror (errno));
2404               shell_pgrp = original_pgrp;
2405             }
2406
2407           job_control = 1;
2408           if (give_terminal_to (shell_pgrp) < 0)                /* XXX */
2409             /* job_control = 0 */;                              /* XXX */
2410         }
2411       if (job_control == 0)
2412         internal_error ("no job control in this shell");        /* XXX */
2413     }
2414
2415   if (shell_tty != fileno (stderr))
2416     SET_CLOSE_ON_EXEC (shell_tty);
2417
2418   set_signal_handler (SIGCHLD, flush_child);
2419
2420   change_flag ('m', job_control ? '-' : '+');
2421
2422   if (interactive)
2423     get_tty_state ();
2424   return job_control;
2425 }
2426
2427 /* Set the line discipline to the best this system has to offer.
2428    Return -1 if this is not possible. */
2429 static int
2430 set_new_line_discipline (tty)
2431      int tty;
2432 {
2433 #if defined (NEW_TTY_DRIVER)
2434   int ldisc;
2435
2436   if (ioctl (tty, TIOCGETD, &ldisc) < 0)
2437     return (-1);
2438
2439   if (ldisc != NTTYDISC)
2440     {
2441       ldisc = NTTYDISC;
2442
2443       if (ioctl (tty, TIOCSETD, &ldisc) < 0)
2444         return (-1);
2445     }
2446   return (0);
2447 #endif /* NEW_TTY_DRIVER */
2448
2449 #if defined (TERMIO_TTY_DRIVER)
2450 #  if defined (NTTYDISC)
2451   if (ioctl (tty, TCGETA, &shell_tty_info) < 0)
2452     return (-1);
2453
2454   if (shell_tty_info.c_line != NTTYDISC)
2455     {
2456       shell_tty_info.c_line = NTTYDISC;
2457       if (ioctl (tty, TCSETAW, &shell_tty_info) < 0)
2458         return (-1);
2459     }
2460 #  endif /* NTTYDISC */
2461   return (0);
2462 #endif /* TERMIO_TTY_DRIVER */
2463
2464 #if defined (TERMIOS_TTY_DRIVER)
2465 #  if defined (TERMIOS_LDISC)
2466   if (tcgetattr (tty, &shell_tty_info) < 0)
2467     return (-1);
2468
2469   if (shell_tty_info.c_line != NTTYDISC)
2470     {
2471       shell_tty_info.c_line = NTTYDISC;
2472       if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
2473         return (-1);
2474     }
2475 #  endif /* TERMIOS_LDISC */
2476   return (0);
2477 #endif /* TERMIOS_TTY_DRIVER */
2478
2479 #if !defined (NEW_TTY_DRIVER) && !defined (TERMIO_TTY_DRIVER) && !defined (TERMIOS_TTY_DRIVER)
2480   return (-1);
2481 #endif
2482 }
2483
2484 static SigHandler *old_tstp, *old_ttou, *old_ttin;
2485 static SigHandler *old_cont = (SigHandler *)SIG_DFL;
2486 static sighandler stop_signal_handler (), cont_signal_handler ();
2487
2488 #if !defined (READLINE) && defined (TIOCGWINSZ) && defined (SIGWINCH)
2489 static SigHandler *old_winch;
2490
2491 static sighandler
2492 sigwinch_sighandler (sig)
2493      int sig;
2494 {
2495   struct winsize win;
2496
2497 #if defined (USG) && !defined (_POSIX_VERSION)
2498   set_signal_handler (SIGWINCH, sigwinch_sighandler);
2499 #endif /* USG && !_POSIX_VERSION */
2500   if ((ioctl (shell_tty, TIOCGWINSZ, &win) == 0) &&
2501       win.ws_row > 0 && win.ws_col > 0)
2502     {
2503 #if defined (aixpc)
2504       shell_tty_info.c_winsize = win;   /* structure copying */
2505 #endif
2506       set_lines_and_columns (win.ws_row, win.ws_col);
2507     }
2508 }
2509 #endif /* !READLINE && TIOCGWINSZ && SIGWINCH */
2510
2511 /* Setup this shell to handle C-C, etc. */
2512 void
2513 initialize_job_signals ()
2514 {
2515   if (interactive)
2516     {
2517       set_signal_handler (SIGINT, sigint_sighandler);
2518       set_signal_handler (SIGTSTP, SIG_IGN);
2519       set_signal_handler (SIGTTOU, SIG_IGN);
2520       set_signal_handler (SIGTTIN, SIG_IGN);
2521 #if !defined (READLINE) && defined (TIOCGWINSZ) && defined (SIGWINCH)
2522       old_winch = set_signal_handler (SIGWINCH, sigwinch_sighandler);
2523 #endif /* !READLINE && TIOCGWINSZ && SIGWINCH */
2524     }
2525   else if (job_control)
2526     {
2527       old_tstp = set_signal_handler (SIGTSTP, stop_signal_handler);
2528       old_ttou = set_signal_handler (SIGTTOU, stop_signal_handler);
2529       old_ttin = set_signal_handler (SIGTTIN, stop_signal_handler);
2530     }
2531   /* Leave these things alone for non-interactive shells without job
2532      control. */
2533 }
2534
2535 /* Here we handle CONT signals. */
2536 static sighandler
2537 cont_signal_handler (sig)
2538      int sig;
2539 {
2540   initialize_job_signals ();
2541   set_signal_handler (SIGCONT, old_cont);
2542   kill (getpid (), SIGCONT);
2543
2544 #if !defined (VOID_SIGHANDLER)
2545   return (0);
2546 #endif /* VOID_SIGHANDLER */
2547 }
2548
2549 /* Here we handle stop signals while we are running not as a login shell. */
2550 static sighandler
2551 stop_signal_handler (sig)
2552      int sig;
2553 {
2554   set_signal_handler (SIGTSTP, old_tstp);
2555   set_signal_handler (SIGTTOU, old_ttou);
2556   set_signal_handler (SIGTTIN, old_ttin);
2557
2558   old_cont = set_signal_handler (SIGCONT, cont_signal_handler);
2559
2560   give_terminal_to (shell_pgrp);
2561
2562   kill (getpid (), sig);
2563
2564 #if !defined (VOID_SIGHANDLER)
2565   return (0);
2566 #endif /* VOID_SIGHANDLER */
2567 }
2568
2569 /* Give the terminal to PGRP.  */
2570 give_terminal_to (pgrp)
2571      pid_t pgrp;
2572 {
2573   sigset_t set, oset;
2574   int r = 0;
2575
2576   if (job_control)
2577     {
2578       sigemptyset (&set);
2579       sigaddset (&set, SIGTTOU);
2580       sigaddset (&set, SIGTTIN);
2581       sigaddset (&set, SIGTSTP);
2582       sigaddset (&set, SIGCHLD);
2583       sigemptyset (&oset);
2584       sigprocmask (SIG_BLOCK, &set, &oset);
2585
2586       if (tcsetpgrp (shell_tty, pgrp) < 0)
2587         {
2588           /* Maybe we should print an error message? */
2589 /*        internal_error ("tcsetpgrp(%d) failed: pid %d to pgrp %d: %s",
2590             shell_tty, getpid(), pgrp, strerror (errno)); */
2591           r = -1;
2592         }
2593       else
2594         terminal_pgrp = pgrp;
2595
2596       sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
2597     }
2598
2599   return r;
2600 }
2601
2602 /* Clear out any jobs in the job array.  This is intended to be used by
2603    children of the shell, who should not have any job structures as baggage
2604    when they start executing (forking subshells for parenthesized execution
2605    and functions with pipes are the two that spring to mind). */
2606 static void
2607 delete_all_jobs ()
2608 {
2609   register int i;
2610   sigset_t set, oset;
2611
2612   if (job_slots)
2613     {
2614       BLOCK_CHILD (set, oset);
2615
2616       if (job_slots)
2617         {
2618           current_job = previous_job = NO_JOB;
2619
2620           for (i = 0; i < job_slots; i++)
2621           if (jobs[i] != (JOB *) NULL)
2622             delete_job (i);
2623
2624           free ((char *)jobs);
2625           job_slots = 0;
2626         }
2627
2628       UNBLOCK_CHILD (oset);
2629     }
2630 }
2631
2632 /* Mark all dead jobs as notified, so delete_job () cleans them out
2633    of the job table properly. */
2634 static void
2635 mark_dead_jobs_as_notified ()
2636 {
2637   register int i;
2638   sigset_t set, oset;
2639
2640   if (job_slots)
2641     {
2642       BLOCK_CHILD (set, oset);
2643
2644       for (i = 0; i < job_slots; i++)
2645         if (jobs[i] && JOBSTATE (i) == JDEAD)
2646           jobs[i]->flags |= J_NOTIFIED;
2647
2648       UNBLOCK_CHILD (oset);
2649     }
2650 }
2651
2652 /* Allow or disallow job control to take place.  Returns the old value
2653    of job_control. */
2654 int
2655 set_job_control (arg)
2656      int arg;
2657 {
2658   int old;
2659
2660   old = job_control;
2661   job_control = arg;
2662   return (old);
2663 }
2664
2665 /* Turn off all traces of job control.  This is run by children of the shell
2666    which are going to do shellsy things, like wait (), etc. */
2667 void
2668 without_job_control ()
2669 {
2670   stop_making_children ();
2671   start_pipeline ();
2672   delete_all_jobs ();
2673   set_job_control (0);
2674 }
2675
2676 /* If this shell is interactive, terminate all stopped jobs and
2677    restore the original terminal process group.  This is done
2678    before the `exec' builtin calls shell_execve. */
2679 void
2680 end_job_control ()
2681 {
2682   if (interactive_shell)                /* XXX - should it be interactive? */
2683     {
2684       terminate_stopped_jobs ();
2685
2686       if (original_pgrp >= 0)
2687         give_terminal_to (original_pgrp);
2688     }
2689
2690   if (original_pgrp >= 0)
2691     setpgid (0, original_pgrp);
2692 }
2693
2694 /* Restart job control by closing shell tty and reinitializing.  This is
2695    called after an exec fails in an interactive shell and we do not exit. */
2696 void
2697 restart_job_control ()
2698 {
2699   if (shell_tty != -1)
2700     close (shell_tty);
2701   initialize_jobs ();
2702 }
2703
2704 /* Set the handler to run when the shell receives a SIGCHLD signal. */
2705 void
2706 set_sigchld_handler ()
2707 {
2708   set_signal_handler (SIGCHLD, flush_child);
2709 }
2710
2711 #if defined (PGRP_PIPE)
2712 /* Read from the read end of a pipe.  This is how the process group leader
2713    blocks until all of the processes in a pipeline have been made. */
2714 static void
2715 pipe_read (pp)
2716      int *pp;
2717 {
2718   char ch;
2719
2720   if (pp[1] >= 0)
2721     {
2722       close (pp[1]);
2723       pp[1] = -1;
2724     }
2725
2726   if (pp[0] >= 0)
2727     {
2728       while (read (pp[0], &ch, 1) == -1 && errno == EINTR)
2729         continue;
2730     }
2731 }
2732
2733 /* Close the read and write ends of PP, an array of file descriptors. */
2734 static void
2735 pipe_close (pp)
2736      int *pp;
2737 {
2738   if (pp[0] >= 0)
2739     close (pp[0]);
2740
2741   if (pp[1] >= 0)
2742     close (pp[1]);
2743
2744   pp[0] = pp[1] = -1;
2745 }
2746
2747 /* Functional interface closes our local-to-job-control pipes. */
2748 close_pgrp_pipe ()
2749 {
2750   pipe_close (pgrp_pipe);
2751 }
2752
2753 #endif /* PGRP_PIPE */
2754
2755 #endif /* JOB_CONTROL */