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