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