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