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