]> git.ipfire.org Git - thirdparty/bash.git/blame - jobs.c
Bash-4.0 patchlevel 38
[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 {
704 prev->next = p->next; /* remove from list */
705 break;
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 {
1711 sys_error ("fork: retry");
1712 if (sleep (forksleep) != 0)
1713 break;
1714 forksleep <<= 1;
1715 }
1716
1717 if (pid < 0)
726f6388 1718 {
ccc6cda3 1719 sys_error ("fork");
726f6388
JA
1720
1721 /* Kill all of the processes in the current pipeline. */
1722 terminate_current_pipeline ();
1723
1724 /* Discard the current pipeline, if any. */
1725 if (the_pipeline)
1726 kill_current_pipeline ();
1727
1728 throw_to_top_level (); /* Reset signals, etc. */
1729 }
1730
1731 if (pid == 0)
1732 {
1733 /* In the child. Give this child the right process group, set the
1734 signals to the default state for a new process. */
b72432fd 1735 pid_t mypid;
726f6388 1736
b72432fd 1737 mypid = getpid ();
726f6388
JA
1738#if defined (BUFFERED_INPUT)
1739 /* Close default_buffered_input if it's > 0. We don't close it if it's
1740 0 because that's the file descriptor used when redirecting input,
1741 and it's wrong to close the file in that case. */
cce855bc 1742 unset_bash_input (0);
726f6388
JA
1743#endif /* BUFFERED_INPUT */
1744
1745 /* Restore top-level signal mask. */
1746 sigprocmask (SIG_SETMASK, &top_level_mask, (sigset_t *)NULL);
1747
1748 if (job_control)
1749 {
1750 /* All processes in this pipeline belong in the same
1751 process group. */
1752
ccc6cda3 1753 if (pipeline_pgrp == 0) /* This is the first child. */
b72432fd 1754 pipeline_pgrp = mypid;
726f6388
JA
1755
1756 /* Check for running command in backquotes. */
1757 if (pipeline_pgrp == shell_pgrp)
ccc6cda3 1758 ignore_tty_job_signals ();
726f6388 1759 else
ccc6cda3 1760 default_tty_job_signals ();
726f6388
JA
1761
1762 /* Set the process group before trying to mess with the terminal's
1763 process group. This is mandated by POSIX. */
1764 /* This is in accordance with the Posix 1003.1 standard,
1765 section B.7.2.4, which says that trying to set the terminal
1766 process group with tcsetpgrp() to an unused pgrp value (like
1767 this would have for the first child) is an error. Section
1768 B.4.3.3, p. 237 also covers this, in the context of job control
1769 shells. */
b72432fd 1770 if (setpgid (mypid, pipeline_pgrp) < 0)
3185942a 1771 sys_error (_("child setpgid (%ld to %ld)"), (long)mypid, (long)pipeline_pgrp);
b80f6443
JA
1772
1773 /* By convention (and assumption above), if
1774 pipeline_pgrp == shell_pgrp, we are making a child for
1775 command substitution.
1776 In this case, we don't want to give the terminal to the
1777 shell's process group (we could be in the middle of a
1778 pipeline, for example). */
0628567a 1779 if (async_p == 0 && pipeline_pgrp != shell_pgrp && ((subshell_environment&SUBSHELL_ASYNC) == 0))
b80f6443 1780 give_terminal_to (pipeline_pgrp, 0);
726f6388
JA
1781
1782#if defined (PGRP_PIPE)
b80f6443
JA
1783 if (pipeline_pgrp == mypid)
1784 pipe_read (pgrp_pipe);
726f6388
JA
1785#endif
1786 }
1787 else /* Without job control... */
1788 {
ccc6cda3 1789 if (pipeline_pgrp == 0)
726f6388
JA
1790 pipeline_pgrp = shell_pgrp;
1791
1792 /* If these signals are set to SIG_DFL, we encounter the curious
1793 situation of an interactive ^Z to a running process *working*
1794 and stopping the process, but being unable to do anything with
1795 that process to change its state. On the other hand, if they
1796 are set to SIG_IGN, jobs started from scripts do not stop when
1797 the shell running the script gets a SIGTSTP and stops. */
1798
ccc6cda3 1799 default_tty_job_signals ();
726f6388
JA
1800 }
1801
1802#if defined (PGRP_PIPE)
1803 /* Release the process group pipe, since our call to setpgid ()
3185942a
JA
1804 is done. The last call to sh_closepipe is done in stop_pipeline. */
1805 sh_closepipe (pgrp_pipe);
726f6388
JA
1806#endif /* PGRP_PIPE */
1807
3185942a
JA
1808#if 0
1809 /* Don't set last_asynchronous_pid in the child */
726f6388 1810 if (async_p)
3185942a
JA
1811 last_asynchronous_pid = mypid; /* XXX */
1812 else
1813#endif
95732b49 1814#if defined (RECYCLES_PIDS)
3185942a 1815 if (last_asynchronous_pid == mypid)
95732b49
JA
1816 /* Avoid pid aliasing. 1 seems like a safe, unusual pid value. */
1817 last_asynchronous_pid = 1;
1818#endif
726f6388
JA
1819 }
1820 else
1821 {
1822 /* In the parent. Remember the pid of the child just created
1823 as the proper pgrp if this is the first child. */
1824
0628567a
JA
1825 if (first_pid == NO_PID)
1826 first_pid = pid;
1827 else if (pid_wrap == -1 && pid < first_pid)
1828 pid_wrap = 0;
1829 else if (pid_wrap == 0 && pid >= first_pid)
1830 pid_wrap = 1;
1831
726f6388
JA
1832 if (job_control)
1833 {
ccc6cda3 1834 if (pipeline_pgrp == 0)
726f6388
JA
1835 {
1836 pipeline_pgrp = pid;
1837 /* Don't twiddle terminal pgrps in the parent! This is the bug,
1838 not the good thing of twiddling them in the child! */
28ef6c31 1839 /* give_terminal_to (pipeline_pgrp, 0); */
726f6388
JA
1840 }
1841 /* This is done on the recommendation of the Rationale section of
1842 the POSIX 1003.1 standard, where it discusses job control and
1843 shells. It is done to avoid possible race conditions. (Ref.
1844 1003.1 Rationale, section B.4.3.3, page 236). */
1845 setpgid (pid, pipeline_pgrp);
1846 }
1847 else
1848 {
ccc6cda3 1849 if (pipeline_pgrp == 0)
726f6388
JA
1850 pipeline_pgrp = shell_pgrp;
1851 }
1852
1853 /* Place all processes into the jobs array regardless of the
1854 state of job_control. */
1855 add_process (command, pid);
1856
1857 if (async_p)
1858 last_asynchronous_pid = pid;
95732b49
JA
1859#if defined (RECYCLES_PIDS)
1860 else if (last_asynchronous_pid == pid)
1861 /* Avoid pid aliasing. 1 seems like a safe, unusual pid value. */
1862 last_asynchronous_pid = 1;
1863#endif
1864
0628567a
JA
1865 if (pid_wrap > 0)
1866 delete_old_job (pid);
1867
95732b49
JA
1868#if !defined (RECYCLES_PIDS)
1869 /* Only check for saved status if we've saved more than CHILD_MAX
1870 statuses, unless the system recycles pids. */
1871 if ((js.c_reaped + bgpids.npid) >= js.c_childmax)
1872#endif
1873 bgp_delete (pid); /* new process, discard any saved status */
726f6388
JA
1874
1875 last_made_pid = pid;
1876
95732b49
JA
1877 /* keep stats */
1878 js.c_totforked++;
1879 js.c_living++;
1880
1881 /* Unblock SIGINT and SIGCHLD unless creating a pipeline, in which case
1882 SIGCHLD remains blocked until all commands in the pipeline have been
1883 created. */
726f6388
JA
1884 sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
1885 }
1886
1887 return (pid);
1888}
1889
7117c2d2 1890/* These two functions are called only in child processes. */
ccc6cda3
JA
1891void
1892ignore_tty_job_signals ()
1893{
1894 set_signal_handler (SIGTSTP, SIG_IGN);
1895 set_signal_handler (SIGTTIN, SIG_IGN);
1896 set_signal_handler (SIGTTOU, SIG_IGN);
1897}
1898
1899void
1900default_tty_job_signals ()
1901{
1902 set_signal_handler (SIGTSTP, SIG_DFL);
1903 set_signal_handler (SIGTTIN, SIG_DFL);
1904 set_signal_handler (SIGTTOU, SIG_DFL);
1905}
1906
726f6388
JA
1907/* When we end a job abnormally, or if we stop a job, we set the tty to the
1908 state kept in here. When a job ends normally, we set the state in here
1909 to the state of the tty. */
1910
28ef6c31
JA
1911static TTYSTRUCT shell_tty_info;
1912
726f6388 1913#if defined (NEW_TTY_DRIVER)
726f6388
JA
1914static struct tchars shell_tchars;
1915static struct ltchars shell_ltchars;
1916#endif /* NEW_TTY_DRIVER */
1917
726f6388
JA
1918#if defined (NEW_TTY_DRIVER) && defined (DRAIN_OUTPUT)
1919/* Since the BSD tty driver does not allow us to change the tty modes
1920 while simultaneously waiting for output to drain and preserving
1921 typeahead, we have to drain the output ourselves before calling
1922 ioctl. We cheat by finding the length of the output queue, and
1923 using select to wait for an appropriate length of time. This is
1924 a hack, and should be labeled as such (it's a hastily-adapted
1925 mutation of a `usleep' implementation). It's only reason for
1926 existing is the flaw in the BSD tty driver. */
1927
1928static int ttspeeds[] =
1929{
1930 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200,
1931 1800, 2400, 4800, 9600, 19200, 38400
1932};
1933
1934static void
1935draino (fd, ospeed)
1936 int fd, ospeed;
1937{
1938 register int delay = ttspeeds[ospeed];
1939 int n;
1940
1941 if (!delay)
1942 return;
1943
1944 while ((ioctl (fd, TIOCOUTQ, &n) == 0) && n)
1945 {
1946 if (n > (delay / 100))
1947 {
1948 struct timeval tv;
1949
1950 n *= 10; /* 2 bits more for conservativeness. */
1951 tv.tv_sec = n / delay;
1952 tv.tv_usec = ((n % delay) * 1000000) / delay;
1953 select (fd, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv);
1954 }
1955 else
1956 break;
1957 }
1958}
1959#endif /* NEW_TTY_DRIVER && DRAIN_OUTPUT */
1960
1961/* Return the fd from which we are actually getting input. */
1962#define input_tty() (shell_tty != -1) ? shell_tty : fileno (stderr)
1963
1964/* Fill the contents of shell_tty_info with the current tty info. */
ccc6cda3 1965int
726f6388
JA
1966get_tty_state ()
1967{
ccc6cda3 1968 int tty;
726f6388 1969
ccc6cda3 1970 tty = input_tty ();
726f6388
JA
1971 if (tty != -1)
1972 {
1973#if defined (NEW_TTY_DRIVER)
1974 ioctl (tty, TIOCGETP, &shell_tty_info);
1975 ioctl (tty, TIOCGETC, &shell_tchars);
1976 ioctl (tty, TIOCGLTC, &shell_ltchars);
1977#endif /* NEW_TTY_DRIVER */
1978
1979#if defined (TERMIO_TTY_DRIVER)
1980 ioctl (tty, TCGETA, &shell_tty_info);
1981#endif /* TERMIO_TTY_DRIVER */
1982
1983#if defined (TERMIOS_TTY_DRIVER)
1984 if (tcgetattr (tty, &shell_tty_info) < 0)
1985 {
1986#if 0
1987 /* Only print an error message if we're really interactive at
1988 this time. */
1989 if (interactive)
3185942a 1990 sys_error ("[%ld: %d (%d)] tcgetattr", (long)getpid (), shell_level, tty);
726f6388
JA
1991#endif
1992 return -1;
1993 }
1994#endif /* TERMIOS_TTY_DRIVER */
ccc6cda3 1995 if (check_window_size)
95732b49 1996 get_new_window_size (0, (int *)0, (int *)0);
726f6388
JA
1997 }
1998 return 0;
1999}
2000
2001/* Make the current tty use the state in shell_tty_info. */
ccc6cda3 2002int
726f6388
JA
2003set_tty_state ()
2004{
d166f048 2005 int tty;
726f6388 2006
d166f048 2007 tty = input_tty ();
726f6388
JA
2008 if (tty != -1)
2009 {
2010#if defined (NEW_TTY_DRIVER)
2011# if defined (DRAIN_OUTPUT)
2012 draino (tty, shell_tty_info.sg_ospeed);
2013# endif /* DRAIN_OUTPUT */
2014 ioctl (tty, TIOCSETN, &shell_tty_info);
2015 ioctl (tty, TIOCSETC, &shell_tchars);
2016 ioctl (tty, TIOCSLTC, &shell_ltchars);
2017#endif /* NEW_TTY_DRIVER */
2018
2019#if defined (TERMIO_TTY_DRIVER)
2020 ioctl (tty, TCSETAW, &shell_tty_info);
2021#endif /* TERMIO_TTY_DRIVER */
2022
2023#if defined (TERMIOS_TTY_DRIVER)
2024 if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
2025 {
2026 /* Only print an error message if we're really interactive at
2027 this time. */
2028 if (interactive)
3185942a 2029 sys_error ("[%ld: %d (%d)] tcsetattr", (long)getpid (), shell_level, tty);
726f6388
JA
2030 return -1;
2031 }
2032#endif /* TERMIOS_TTY_DRIVER */
2033 }
2034 return 0;
2035}
2036
95732b49 2037/* Given an index into the jobs array JOB, return the PROCESS struct of the last
726f6388 2038 process in that job's pipeline. This is the one whose exit status
7117c2d2 2039 counts. Must be called with SIGCHLD blocked or queued. */
95732b49
JA
2040static PROCESS *
2041find_last_proc (job, block)
726f6388 2042 int job;
7117c2d2 2043 int block;
726f6388
JA
2044{
2045 register PROCESS *p;
7117c2d2
JA
2046 sigset_t set, oset;
2047
2048 if (block)
2049 BLOCK_CHILD (set, oset);
726f6388
JA
2050
2051 p = jobs[job]->pipe;
0628567a 2052 while (p && p->next != jobs[job]->pipe)
726f6388
JA
2053 p = p->next;
2054
7117c2d2
JA
2055 if (block)
2056 UNBLOCK_CHILD (oset);
cce855bc 2057
95732b49 2058 return (p);
cce855bc
JA
2059}
2060
95732b49
JA
2061static pid_t
2062find_last_pid (job, block)
2063 int job;
2064 int block;
2065{
2066 PROCESS *p;
2067
2068 p = find_last_proc (job, block);
2069 /* Possible race condition here. */
2070 return p->pid;
2071}
2072
726f6388
JA
2073/* Wait for a particular child of the shell to finish executing.
2074 This low-level function prints an error message if PID is not
7117c2d2
JA
2075 a child of this shell. It returns -1 if it fails, or whatever
2076 wait_for returns otherwise. If the child is not found in the
bb70624e 2077 jobs table, it returns 127. */
726f6388
JA
2078int
2079wait_for_single_pid (pid)
2080 pid_t pid;
2081{
2082 register PROCESS *child;
ccc6cda3 2083 sigset_t set, oset;
cce855bc 2084 int r, job;
726f6388 2085
ccc6cda3 2086 BLOCK_CHILD (set, oset);
7117c2d2 2087 child = find_pipeline (pid, 0, (int *)NULL);
ccc6cda3 2088 UNBLOCK_CHILD (oset);
726f6388 2089
95732b49
JA
2090 if (child == 0)
2091 {
2092 r = bgp_search (pid);
2093 if (r >= 0)
2094 return r;
2095 }
2096
ccc6cda3 2097 if (child == 0)
726f6388 2098 {
b80f6443 2099 internal_error (_("wait: pid %ld is not a child of this shell"), (long)pid);
726f6388
JA
2100 return (127);
2101 }
2102
cce855bc
JA
2103 r = wait_for (pid);
2104
b72432fd
JA
2105 /* POSIX.2: if we just waited for a job, we can remove it from the jobs
2106 table. */
2107 BLOCK_CHILD (set, oset);
95732b49 2108 job = find_job (pid, 0, NULL);
b72432fd
JA
2109 if (job != NO_JOB && jobs[job] && DEADJOB (job))
2110 jobs[job]->flags |= J_NOTIFIED;
2111 UNBLOCK_CHILD (oset);
cce855bc 2112
95732b49
JA
2113 /* If running in posix mode, remove the job from the jobs table immediately */
2114 if (posixly_correct)
2115 {
2116 cleanup_dead_jobs ();
2117 bgp_delete (pid);
2118 }
2119
cce855bc 2120 return r;
726f6388
JA
2121}
2122
2123/* Wait for all of the backgrounds of this shell to finish. */
2124void
2125wait_for_background_pids ()
2126{
7117c2d2 2127 register int i, r, waited_for;
ccc6cda3
JA
2128 sigset_t set, oset;
2129 pid_t pid;
726f6388 2130
bb70624e 2131 for (waited_for = 0;;)
ccc6cda3 2132 {
726f6388
JA
2133 BLOCK_CHILD (set, oset);
2134
7117c2d2 2135 /* find first running job; if none running in foreground, break */
0628567a 2136 /* XXX could use js.j_firstj and js.j_lastj here */
95732b49
JA
2137 for (i = 0; i < js.j_jobslots; i++)
2138 {
2139#if defined (DEBUG)
2140 if (i < js.j_firstj && jobs[i])
2141 itrace("wait_for_background_pids: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
0628567a
JA
2142 if (i > js.j_lastj && jobs[i])
2143 itrace("wait_for_background_pids: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
95732b49
JA
2144#endif
2145 if (jobs[i] && RUNNING (i) && IS_FOREGROUND (i) == 0)
2146 break;
2147 }
2148 if (i == js.j_jobslots)
726f6388
JA
2149 {
2150 UNBLOCK_CHILD (oset);
2151 break;
2152 }
2153
7117c2d2
JA
2154 /* now wait for the last pid in that job. */
2155 pid = find_last_pid (i, 0);
2156 UNBLOCK_CHILD (oset);
2157 QUIT;
2158 errno = 0; /* XXX */
2159 r = wait_for_single_pid (pid);
2160 if (r == -1)
2161 {
2162 /* If we're mistaken about job state, compensate. */
2163 if (errno == ECHILD)
2164 mark_all_jobs_as_dead ();
2165 }
2166 else
2167 waited_for++;
726f6388 2168 }
b72432fd
JA
2169
2170 /* POSIX.2 says the shell can discard the statuses of all completed jobs if
2171 `wait' is called with no arguments. */
2172 mark_dead_jobs_as_notified (1);
2173 cleanup_dead_jobs ();
95732b49 2174 bgp_clear ();
726f6388
JA
2175}
2176
2177/* Make OLD_SIGINT_HANDLER the SIGINT signal handler. */
2178#define INVALID_SIGNAL_HANDLER (SigHandler *)wait_for_background_pids
2179static SigHandler *old_sigint_handler = INVALID_SIGNAL_HANDLER;
2180
2181static void
2182restore_sigint_handler ()
2183{
2184 if (old_sigint_handler != INVALID_SIGNAL_HANDLER)
2185 {
2186 set_signal_handler (SIGINT, old_sigint_handler);
2187 old_sigint_handler = INVALID_SIGNAL_HANDLER;
2188 }
2189}
2190
ccc6cda3 2191static int wait_sigint_received;
726f6388
JA
2192
2193/* Handle SIGINT while we are waiting for children in a script to exit.
2194 The `wait' builtin should be interruptible, but all others should be
2195 effectively ignored (i.e. not cause the shell to exit). */
2196static sighandler
2197wait_sigint_handler (sig)
2198 int sig;
2199{
bb70624e
JA
2200 SigHandler *sigint_handler;
2201
726f6388
JA
2202 if (interrupt_immediately ||
2203 (this_shell_builtin && this_shell_builtin == wait_builtin))
2204 {
2205 last_command_exit_value = EXECUTION_FAILURE;
2206 restore_sigint_handler ();
bb70624e 2207 /* If we got a SIGINT while in `wait', and SIGINT is trapped, do
28ef6c31 2208 what POSIX.2 says (see builtins/wait.def for more info). */
bb70624e
JA
2209 if (this_shell_builtin && this_shell_builtin == wait_builtin &&
2210 signal_is_trapped (SIGINT) &&
2211 ((sigint_handler = trap_to_sighandler (SIGINT)) == trap_handler))
2212 {
2213 interrupt_immediately = 0;
2214 trap_handler (SIGINT); /* set pending_traps[SIGINT] */
7117c2d2 2215 wait_signal_received = SIGINT;
bb70624e
JA
2216 longjmp (wait_intr_buf, 1);
2217 }
2218
ccc6cda3 2219 ADDINTERRUPT;
726f6388
JA
2220 QUIT;
2221 }
2222
ccc6cda3
JA
2223 /* XXX - should this be interrupt_state? If it is, the shell will act
2224 as if it got the SIGINT interrupt. */
2225 wait_sigint_received = 1;
2226
726f6388
JA
2227 /* Otherwise effectively ignore the SIGINT and allow the running job to
2228 be killed. */
ccc6cda3 2229 SIGRETURN (0);
726f6388
JA
2230}
2231
b80f6443
JA
2232static int
2233process_exit_signal (status)
2234 WAIT status;
2235{
2236 return (WIFSIGNALED (status) ? WTERMSIG (status) : 0);
2237}
2238
726f6388
JA
2239static int
2240process_exit_status (status)
2241 WAIT status;
2242{
2243 if (WIFSIGNALED (status))
2244 return (128 + WTERMSIG (status));
ccc6cda3 2245 else if (WIFSTOPPED (status) == 0)
726f6388
JA
2246 return (WEXITSTATUS (status));
2247 else
2248 return (EXECUTION_SUCCESS);
2249}
2250
f1be666c
JA
2251static WAIT
2252job_signal_status (job)
2253 int job;
2254{
2255 register PROCESS *p;
2256 WAIT s;
2257
2258 p = jobs[job]->pipe;
2259 do
2260 {
2261 s = p->status;
2262 if (WIFSIGNALED(s) || WIFSTOPPED(s))
2263 break;
2264 p = p->next;
2265 }
2266 while (p != jobs[job]->pipe);
2267
2268 return s;
2269}
2270
28ef6c31
JA
2271/* Return the exit status of the last process in the pipeline for job JOB.
2272 This is the exit status of the entire job. */
2273static WAIT
bb70624e 2274raw_job_exit_status (job)
f73dda09 2275 int job;
ccc6cda3
JA
2276{
2277 register PROCESS *p;
b80f6443 2278 int fail;
3185942a 2279 WAIT ret;
b80f6443
JA
2280
2281 if (pipefail_opt)
2282 {
2283 fail = 0;
eb873671
JA
2284 p = jobs[job]->pipe;
2285 do
2286 {
3185942a
JA
2287 if (WSTATUS (p->status) != EXECUTION_SUCCESS)
2288 fail = WSTATUS(p->status);
eb873671
JA
2289 p = p->next;
2290 }
2291 while (p != jobs[job]->pipe);
3185942a
JA
2292 WSTATUS (ret) = fail;
2293 return ret;
b80f6443
JA
2294 }
2295
ccc6cda3
JA
2296 for (p = jobs[job]->pipe; p->next != jobs[job]->pipe; p = p->next)
2297 ;
bb70624e
JA
2298 return (p->status);
2299}
2300
28ef6c31
JA
2301/* Return the exit status of job JOB. This is the exit status of the last
2302 (rightmost) process in the job's pipeline, modified if the job was killed
2303 by a signal or stopped. */
f73dda09 2304static int
bb70624e
JA
2305job_exit_status (job)
2306 int job;
2307{
2308 return (process_exit_status (raw_job_exit_status (job)));
ccc6cda3
JA
2309}
2310
b80f6443
JA
2311static int
2312job_exit_signal (job)
2313 int job;
2314{
2315 return (process_exit_signal (raw_job_exit_status (job)));
2316}
2317
ccc6cda3
JA
2318#define FIND_CHILD(pid, child) \
2319 do \
2320 { \
7117c2d2 2321 child = find_pipeline (pid, 0, (int *)NULL); \
ccc6cda3
JA
2322 if (child == 0) \
2323 { \
28ef6c31 2324 give_terminal_to (shell_pgrp, 0); \
ccc6cda3 2325 UNBLOCK_CHILD (oset); \
b80f6443 2326 internal_error (_("wait_for: No record of process %ld"), (long)pid); \
ccc6cda3
JA
2327 restore_sigint_handler (); \
2328 return (termination_state = 127); \
2329 } \
2330 } \
2331 while (0)
2332
bb70624e
JA
2333/* Wait for pid (one of our children) to terminate, then
2334 return the termination state. Returns 127 if PID is not found in
2335 the jobs table. Returns -1 if waitchld() returns -1, indicating
2336 that there are no unwaited-for child processes. */
726f6388
JA
2337int
2338wait_for (pid)
2339 pid_t pid;
2340{
28ef6c31
JA
2341 int job, termination_state, r;
2342 WAIT s;
726f6388
JA
2343 register PROCESS *child;
2344 sigset_t set, oset;
ccc6cda3 2345 register PROCESS *p;
726f6388
JA
2346
2347 /* In the case that this code is interrupted, and we longjmp () out of it,
2348 we are relying on the code in throw_to_top_level () to restore the
2349 top-level signal mask. */
2350 BLOCK_CHILD (set, oset);
2351
2352 /* Ignore interrupts while waiting for a job run without job control
2353 to finish. We don't want the shell to exit if an interrupt is
2354 received, only if one of the jobs run is killed via SIGINT. If
ccc6cda3 2355 job control is not set, the job will be run in the same pgrp as
f1be666c
JA
2356 the shell, and the shell will see any signals the job gets. In
2357 fact, we want this set every time the waiting shell and the waited-
2358 for process are in the same process group, including command
2359 substitution. */
726f6388
JA
2360
2361 /* This is possibly a race condition -- should it go in stop_pipeline? */
2362 wait_sigint_received = 0;
f1be666c 2363 if (job_control == 0 || (subshell_environment&SUBSHELL_COMSUB))
0628567a
JA
2364 {
2365 old_sigint_handler = set_signal_handler (SIGINT, wait_sigint_handler);
2366 if (old_sigint_handler == SIG_IGN)
2367 set_signal_handler (SIGINT, old_sigint_handler);
2368 }
726f6388
JA
2369
2370 termination_state = last_command_exit_value;
2371
ccc6cda3 2372 if (interactive && job_control == 0)
726f6388
JA
2373 QUIT;
2374
ccc6cda3
JA
2375 /* If we say wait_for (), then we have a record of this child somewhere.
2376 If it and none of its peers are running, don't call waitchld(). */
726f6388 2377
ccc6cda3
JA
2378 job = NO_JOB;
2379 do
726f6388 2380 {
ccc6cda3 2381 FIND_CHILD (pid, child);
726f6388 2382
ccc6cda3 2383 /* If this child is part of a job, then we are really waiting for the
28ef6c31
JA
2384 job to finish. Otherwise, we are waiting for the child to finish.
2385 We check for JDEAD in case the job state has been set by waitchld
2386 after receipt of a SIGCHLD. */
ccc6cda3 2387 if (job == NO_JOB)
95732b49 2388 job = find_job (pid, 0, NULL);
726f6388 2389
28ef6c31
JA
2390 /* waitchld() takes care of setting the state of the job. If the job
2391 has already exited before this is called, sigchld_handler will have
2392 called waitchld and the state will be set to JDEAD. */
726f6388 2393
95732b49 2394 if (PRUNNING(child) || (job != NO_JOB && RUNNING (job)))
ccc6cda3
JA
2395 {
2396#if defined (WAITPID_BROKEN) /* SCOv4 */
2397 sigset_t suspend_set;
2398 sigemptyset (&suspend_set);
2399 sigsuspend (&suspend_set);
726f6388 2400#else /* !WAITPID_BROKEN */
ccc6cda3
JA
2401# if defined (MUST_UNBLOCK_CHLD)
2402 struct sigaction act, oact;
2403 sigset_t nullset, chldset;
2404
2405 sigemptyset (&nullset);
2406 sigemptyset (&chldset);
2407 sigprocmask (SIG_SETMASK, &nullset, &chldset);
2408 act.sa_handler = SIG_DFL;
2409 sigemptyset (&act.sa_mask);
2410 sigemptyset (&oact.sa_mask);
2411 act.sa_flags = 0;
2412 sigaction (SIGCHLD, &act, &oact);
726f6388 2413# endif
7117c2d2 2414 queue_sigchld = 1;
bb70624e 2415 r = waitchld (pid, 1);
ccc6cda3
JA
2416# if defined (MUST_UNBLOCK_CHLD)
2417 sigaction (SIGCHLD, &oact, (struct sigaction *)NULL);
2418 sigprocmask (SIG_SETMASK, &chldset, (sigset_t *)NULL);
726f6388 2419# endif
7117c2d2 2420 queue_sigchld = 0;
bb70624e
JA
2421 if (r == -1 && errno == ECHILD && this_shell_builtin == wait_builtin)
2422 {
2423 termination_state = -1;
2424 goto wait_for_return;
2425 }
28ef6c31
JA
2426
2427 /* If child is marked as running, but waitpid() returns -1/ECHILD,
2428 there is something wrong. Somewhere, wait should have returned
2429 that child's pid. Mark the child as not running and the job,
2430 if it exists, as JDEAD. */
2431 if (r == -1 && errno == ECHILD)
2432 {
7117c2d2 2433 child->running = PS_DONE;
3185942a 2434 WSTATUS (child->status) = 0; /* XXX -- can't find true status */
0628567a 2435 js.c_living = 0; /* no living child processes */
28ef6c31 2436 if (job != NO_JOB)
95732b49
JA
2437 {
2438 jobs[job]->state = JDEAD;
2439 js.c_reaped++;
2440 js.j_ndead++;
2441 }
28ef6c31 2442 }
ccc6cda3
JA
2443#endif /* WAITPID_BROKEN */
2444 }
2445
2446 /* If the shell is interactive, and job control is disabled, see
2447 if the foreground process has died due to SIGINT and jump out
2448 of the wait loop if it has. waitchld has already restored the
2449 old SIGINT signal handler. */
2450 if (interactive && job_control == 0)
2451 QUIT;
726f6388 2452 }
95732b49 2453 while (PRUNNING (child) || (job != NO_JOB && RUNNING (job)));
726f6388
JA
2454
2455 /* The exit state of the command is either the termination state of the
2456 child, or the termination state of the job. If a job, the status
b80f6443
JA
2457 of the last child in the pipeline is the significant one. If the command
2458 or job was terminated by a signal, note that value also. */
2459 termination_state = (job != NO_JOB) ? job_exit_status (job)
2460 : process_exit_status (child->status);
2461 last_command_exit_signal = (job != NO_JOB) ? job_exit_signal (job)
2462 : process_exit_signal (child->status);
726f6388 2463
95732b49
JA
2464 /* XXX */
2465 if ((job != NO_JOB && JOBSTATE (job) == JSTOPPED) || WIFSTOPPED (child->status))
2466 termination_state = 128 + WSTOPSIG (child->status);
2467
ccc6cda3 2468 if (job == NO_JOB || IS_JOBCONTROL (job))
b72432fd
JA
2469 {
2470 /* XXX - under what circumstances is a job not present in the jobs
2471 table (job == NO_JOB)?
2472 1. command substitution
2473
2474 In the case of command substitution, at least, it's probably not
2475 the right thing to give the terminal to the shell's process group,
2476 even though there is code in subst.c:command_substitute to work
2477 around it.
2478
2479 Things that don't:
2480 $PROMPT_COMMAND execution
2481 process substitution
2482 */
2483#if 0
2484if (job == NO_JOB)
f73dda09 2485 itrace("wait_for: job == NO_JOB, giving the terminal to shell_pgrp (%ld)", (long)shell_pgrp);
b72432fd 2486#endif
28ef6c31 2487 give_terminal_to (shell_pgrp, 0);
b72432fd 2488 }
726f6388
JA
2489
2490 /* If the command did not exit cleanly, or the job is just
2491 being stopped, then reset the tty state back to what it
2492 was before this command. Reset the tty state and notify
2493 the user of the job termination only if the shell is
2494 interactive. Clean up any dead jobs in either case. */
2495 if (job != NO_JOB)
2496 {
ccc6cda3 2497 if (interactive_shell && subshell_environment == 0)
726f6388 2498 {
bb70624e
JA
2499 /* This used to use `child->status'. That's wrong, however, for
2500 pipelines. `child' is the first process in the pipeline. It's
2501 likely that the process we want to check for abnormal termination
2502 or stopping is the last process in the pipeline, especially if
2503 it's long-lived and the first process is short-lived. Since we
2504 know we have a job here, we can check all the processes in this
2505 job's pipeline and see if one of them stopped or terminated due
2506 to a signal. We might want to change this later to just check
2507 the last process in the pipeline. If no process exits due to a
2508 signal, S is left as the status of the last job in the pipeline. */
f1be666c 2509 s = job_signal_status (job);
bb70624e
JA
2510
2511 if (WIFSIGNALED (s) || WIFSTOPPED (s))
e8ce775d
JA
2512 {
2513 set_tty_state ();
28ef6c31 2514
bb70624e
JA
2515 /* If the current job was stopped or killed by a signal, and
2516 the user has requested it, get a possibly new window size */
95732b49
JA
2517 if (check_window_size && (job == js.j_current || IS_FOREGROUND (job)))
2518 get_new_window_size (0, (int *)0, (int *)0);
e8ce775d 2519 }
726f6388
JA
2520 else
2521 get_tty_state ();
2522
2523 /* If job control is enabled, the job was started with job
2524 control, the job was the foreground job, and it was killed
2525 by SIGINT, then print a newline to compensate for the kernel
2526 printing the ^C without a trailing newline. */
ccc6cda3 2527 if (job_control && IS_JOBCONTROL (job) && IS_FOREGROUND (job) &&
bb70624e 2528 WIFSIGNALED (s) && WTERMSIG (s) == SIGINT)
726f6388 2529 {
ccc6cda3
JA
2530 /* If SIGINT is not trapped and the shell is in a for, while,
2531 or until loop, act as if the shell received SIGINT as
2532 well, so the loop can be broken. This doesn't call the
2533 SIGINT signal handler; maybe it should. */
3185942a 2534 if (signal_is_trapped (SIGINT) == 0 && (loop_level || (shell_compatibility_level > 32 && executing_list)))
ccc6cda3
JA
2535 ADDINTERRUPT;
2536 else
726f6388 2537 {
ccc6cda3
JA
2538 putchar ('\n');
2539 fflush (stdout);
726f6388
JA
2540 }
2541 }
726f6388 2542 }
f1be666c
JA
2543 else if ((subshell_environment & SUBSHELL_COMSUB) && wait_sigint_received)
2544 {
2545 /* If waiting for a job in a subshell started to do command
2546 substitution, simulate getting and being killed by the SIGINT to
2547 pass the status back to our parent. */
2548 s = job_signal_status (job);
2549
2550 if (WIFSIGNALED (s) && WTERMSIG (s) == SIGINT && signal_is_trapped (SIGINT) == 0)
2551 {
2552 UNBLOCK_CHILD (oset);
2553 restore_sigint_handler ();
2554 old_sigint_handler = set_signal_handler (SIGINT, SIG_DFL);
2555 if (old_sigint_handler == SIG_IGN)
2556 restore_sigint_handler ();
2557 else
2558 kill (getpid (), SIGINT);
2559 }
2560 }
28ef6c31 2561
7117c2d2
JA
2562 /* Moved here from set_job_status_and_cleanup, which is in the SIGCHLD
2563 signal handler path */
2564 if (DEADJOB (job) && IS_FOREGROUND (job) /*&& subshell_environment == 0*/)
2565 setjstatus (job);
2566
28ef6c31
JA
2567 /* If this job is dead, notify the user of the status. If the shell
2568 is interactive, this will display a message on the terminal. If
2569 the shell is not interactive, make sure we turn on the notify bit
2570 so we don't get an unwanted message about the job's termination,
2571 and so delete_job really clears the slot in the jobs table. */
2572 notify_and_cleanup ();
726f6388 2573 }
ccc6cda3 2574
bb70624e
JA
2575wait_for_return:
2576
726f6388
JA
2577 UNBLOCK_CHILD (oset);
2578
2579 /* Restore the original SIGINT signal handler before we return. */
2580 restore_sigint_handler ();
2581
2582 return (termination_state);
2583}
2584
bb70624e
JA
2585/* Wait for the last process in the pipeline for JOB. Returns whatever
2586 wait_for returns: the last process's termination state or -1 if there
2587 are no unwaited-for child processes or an error occurs. */
726f6388
JA
2588int
2589wait_for_job (job)
2590 int job;
2591{
ccc6cda3 2592 pid_t pid;
cce855bc
JA
2593 int r;
2594 sigset_t set, oset;
2595
2596 BLOCK_CHILD(set, oset);
2597 if (JOBSTATE (job) == JSTOPPED)
b80f6443 2598 internal_warning (_("wait_for_job: job %d is stopped"), job+1);
ccc6cda3 2599
7117c2d2
JA
2600 pid = find_last_pid (job, 0);
2601 UNBLOCK_CHILD(oset);
cce855bc
JA
2602 r = wait_for (pid);
2603
b72432fd
JA
2604 /* POSIX.2: we can remove the job from the jobs table if we just waited
2605 for it. */
2606 BLOCK_CHILD (set, oset);
2607 if (job != NO_JOB && jobs[job] && DEADJOB (job))
2608 jobs[job]->flags |= J_NOTIFIED;
2609 UNBLOCK_CHILD (oset);
cce855bc
JA
2610
2611 return r;
726f6388
JA
2612}
2613
2614/* Print info about dead jobs, and then delete them from the list
2615 of known jobs. This does not actually delete jobs when the
2616 shell is not interactive, because the dead jobs are not marked
2617 as notified. */
2618void
2619notify_and_cleanup ()
2620{
ccc6cda3 2621 if (jobs_list_frozen)
726f6388
JA
2622 return;
2623
28ef6c31 2624 if (interactive || interactive_shell == 0 || sourcelevel)
726f6388
JA
2625 notify_of_job_status ();
2626
2627 cleanup_dead_jobs ();
2628}
2629
2630/* Make dead jobs disappear from the jobs array without notification.
2631 This is used when the shell is not interactive. */
2632void
2633reap_dead_jobs ()
2634{
b72432fd 2635 mark_dead_jobs_as_notified (0);
726f6388
JA
2636 cleanup_dead_jobs ();
2637}
2638
2639/* Return the next closest (chronologically) job to JOB which is in
2640 STATE. STATE can be JSTOPPED, JRUNNING. NO_JOB is returned if
2641 there is no next recent job. */
2642static int
2643most_recent_job_in_state (job, state)
2644 int job;
2645 JOB_STATE state;
2646{
2647 register int i, result;
2648 sigset_t set, oset;
2649
2650 BLOCK_CHILD (set, oset);
7117c2d2 2651
ccc6cda3 2652 for (result = NO_JOB, i = job - 1; i >= 0; i--)
726f6388 2653 {
ccc6cda3 2654 if (jobs[i] && (JOBSTATE (i) == state))
726f6388 2655 {
ccc6cda3
JA
2656 result = i;
2657 break;
726f6388
JA
2658 }
2659 }
7117c2d2 2660
726f6388 2661 UNBLOCK_CHILD (oset);
ccc6cda3 2662
726f6388
JA
2663 return (result);
2664}
2665
2666/* Return the newest *stopped* job older than JOB, or NO_JOB if not
2667 found. */
2668static int
28ef6c31 2669job_last_stopped (job)
726f6388
JA
2670 int job;
2671{
2672 return (most_recent_job_in_state (job, JSTOPPED));
2673}
2674
2675/* Return the newest *running* job older than JOB, or NO_JOB if not
2676 found. */
2677static int
28ef6c31 2678job_last_running (job)
726f6388
JA
2679 int job;
2680{
2681 return (most_recent_job_in_state (job, JRUNNING));
2682}
2683
2684/* Make JOB be the current job, and make previous be useful. Must be
2685 called with SIGCHLD blocked. */
2686static void
2687set_current_job (job)
2688 int job;
2689{
ccc6cda3 2690 int candidate;
726f6388 2691
95732b49 2692 if (js.j_current != job)
726f6388 2693 {
95732b49
JA
2694 js.j_previous = js.j_current;
2695 js.j_current = job;
726f6388
JA
2696 }
2697
95732b49
JA
2698 /* First choice for previous job is the old current job. */
2699 if (js.j_previous != js.j_current &&
2700 js.j_previous != NO_JOB &&
2701 jobs[js.j_previous] &&
2702 STOPPED (js.j_previous))
726f6388
JA
2703 return;
2704
2705 /* Second choice: Newest stopped job that is older than
2706 the current job. */
ccc6cda3 2707 candidate = NO_JOB;
95732b49 2708 if (STOPPED (js.j_current))
726f6388 2709 {
95732b49 2710 candidate = job_last_stopped (js.j_current);
726f6388
JA
2711
2712 if (candidate != NO_JOB)
2713 {
95732b49 2714 js.j_previous = candidate;
726f6388
JA
2715 return;
2716 }
2717 }
2718
2719 /* If we get here, there is either only one stopped job, in which case it is
2720 the current job and the previous job should be set to the newest running
2721 job, or there are only running jobs and the previous job should be set to
2722 the newest running job older than the current job. We decide on which
95732b49 2723 alternative to use based on whether or not JOBSTATE(js.j_current) is
726f6388
JA
2724 JSTOPPED. */
2725
95732b49
JA
2726 candidate = RUNNING (js.j_current) ? job_last_running (js.j_current)
2727 : job_last_running (js.j_jobslots);
726f6388
JA
2728
2729 if (candidate != NO_JOB)
2730 {
95732b49 2731 js.j_previous = candidate;
726f6388
JA
2732 return;
2733 }
2734
2735 /* There is only a single job, and it is both `+' and `-'. */
95732b49 2736 js.j_previous = js.j_current;
726f6388
JA
2737}
2738
2739/* Make current_job be something useful, if it isn't already. */
2740
2741/* Here's the deal: The newest non-running job should be `+', and the
2742 next-newest non-running job should be `-'. If there is only a single
95732b49 2743 stopped job, the js.j_previous is the newest non-running job. If there
726f6388
JA
2744 are only running jobs, the newest running job is `+' and the
2745 next-newest running job is `-'. Must be called with SIGCHLD blocked. */
ccc6cda3 2746
726f6388
JA
2747static void
2748reset_current ()
2749{
ccc6cda3 2750 int candidate;
726f6388 2751
95732b49
JA
2752 if (js.j_jobslots && js.j_current != NO_JOB && jobs[js.j_current] && STOPPED (js.j_current))
2753 candidate = js.j_current;
726f6388
JA
2754 else
2755 {
ccc6cda3
JA
2756 candidate = NO_JOB;
2757
2758 /* First choice: the previous job. */
95732b49
JA
2759 if (js.j_previous != NO_JOB && jobs[js.j_previous] && STOPPED (js.j_previous))
2760 candidate = js.j_previous;
726f6388
JA
2761
2762 /* Second choice: the most recently stopped job. */
2763 if (candidate == NO_JOB)
95732b49 2764 candidate = job_last_stopped (js.j_jobslots);
726f6388 2765
ccc6cda3 2766 /* Third choice: the newest running job. */
726f6388 2767 if (candidate == NO_JOB)
95732b49 2768 candidate = job_last_running (js.j_jobslots);
726f6388
JA
2769 }
2770
2771 /* If we found a job to use, then use it. Otherwise, there
2772 are no jobs period. */
2773 if (candidate != NO_JOB)
2774 set_current_job (candidate);
2775 else
95732b49 2776 js.j_current = js.j_previous = NO_JOB;
726f6388
JA
2777}
2778
d166f048
JA
2779/* Set up the job structures so we know the job and its processes are
2780 all running. */
2781static void
2782set_job_running (job)
2783 int job;
2784{
2785 register PROCESS *p;
2786
2787 /* Each member of the pipeline is now running. */
2788 p = jobs[job]->pipe;
2789
2790 do
2791 {
2792 if (WIFSTOPPED (p->status))
7117c2d2 2793 p->running = PS_RUNNING; /* XXX - could be PS_STOPPED */
d166f048
JA
2794 p = p->next;
2795 }
2796 while (p != jobs[job]->pipe);
2797
2798 /* This means that the job is running. */
2799 JOBSTATE (job) = JRUNNING;
2800}
2801
726f6388
JA
2802/* Start a job. FOREGROUND if non-zero says to do that. Otherwise,
2803 start the job in the background. JOB is a zero-based index into
2804 JOBS. Returns -1 if it is unable to start a job, and the return
2805 status of the job otherwise. */
2806int
2807start_job (job, foreground)
2808 int job, foreground;
2809{
2810 register PROCESS *p;
2811 int already_running;
2812 sigset_t set, oset;
95732b49 2813 char *wd, *s;
28ef6c31 2814 static TTYSTRUCT save_stty;
726f6388
JA
2815
2816 BLOCK_CHILD (set, oset);
726f6388 2817
ccc6cda3 2818 if (DEADJOB (job))
726f6388 2819 {
b80f6443 2820 internal_error (_("%s: job has terminated"), this_command_name);
726f6388
JA
2821 UNBLOCK_CHILD (oset);
2822 return (-1);
2823 }
2824
ccc6cda3
JA
2825 already_running = RUNNING (job);
2826
2827 if (foreground == 0 && already_running)
726f6388 2828 {
b80f6443 2829 internal_error (_("%s: job %d already in background"), this_command_name, job + 1);
726f6388 2830 UNBLOCK_CHILD (oset);
95732b49 2831 return (0); /* XPG6/SUSv3 says this is not an error */
726f6388
JA
2832 }
2833
2834 wd = current_working_directory ();
2835
2836 /* You don't know about the state of this job. Do you? */
2837 jobs[job]->flags &= ~J_NOTIFIED;
2838
2839 if (foreground)
2840 {
2841 set_current_job (job);
2842 jobs[job]->flags |= J_FOREGROUND;
2843 }
2844
2845 /* Tell the outside world what we're doing. */
2846 p = jobs[job]->pipe;
2847
ccc6cda3 2848 if (foreground == 0)
95732b49
JA
2849 {
2850 /* POSIX.2 says `bg' doesn't give any indication about current or
2851 previous job. */
2852 if (posixly_correct == 0)
2853 s = (job == js.j_current) ? "+ ": ((job == js.j_previous) ? "- " : " ");
2854 else
2855 s = " ";
2856 printf ("[%d]%s", job + 1, s);
2857 }
726f6388
JA
2858
2859 do
2860 {
95732b49 2861 printf ("%s%s",
726f6388
JA
2862 p->command ? p->command : "",
2863 p->next != jobs[job]->pipe? " | " : "");
2864 p = p->next;
2865 }
2866 while (p != jobs[job]->pipe);
2867
ccc6cda3 2868 if (foreground == 0)
95732b49 2869 printf (" &");
726f6388
JA
2870
2871 if (strcmp (wd, jobs[job]->wd) != 0)
95732b49 2872 printf (" (wd: %s)", polite_directory_format (jobs[job]->wd));
726f6388 2873
95732b49 2874 printf ("\n");
726f6388
JA
2875
2876 /* Run the job. */
ccc6cda3 2877 if (already_running == 0)
d166f048 2878 set_job_running (job);
726f6388
JA
2879
2880 /* Save the tty settings before we start the job in the foreground. */
2881 if (foreground)
2882 {
2883 get_tty_state ();
2884 save_stty = shell_tty_info;
ccc6cda3
JA
2885 /* Give the terminal to this job. */
2886 if (IS_JOBCONTROL (job))
28ef6c31 2887 give_terminal_to (jobs[job]->pgrp, 0);
726f6388
JA
2888 }
2889 else
2890 jobs[job]->flags &= ~J_FOREGROUND;
2891
2892 /* If the job is already running, then don't bother jump-starting it. */
ccc6cda3 2893 if (already_running == 0)
726f6388
JA
2894 {
2895 jobs[job]->flags |= J_NOTIFIED;
2896 killpg (jobs[job]->pgrp, SIGCONT);
2897 }
2898
726f6388
JA
2899 if (foreground)
2900 {
ccc6cda3 2901 pid_t pid;
0628567a 2902 int st;
726f6388 2903
7117c2d2
JA
2904 pid = find_last_pid (job, 0);
2905 UNBLOCK_CHILD (oset);
0628567a 2906 st = wait_for (pid);
726f6388
JA
2907 shell_tty_info = save_stty;
2908 set_tty_state ();
0628567a 2909 return (st);
726f6388
JA
2910 }
2911 else
2912 {
726f6388
JA
2913 reset_current ();
2914 UNBLOCK_CHILD (oset);
2915 return (0);
2916 }
2917}
2918
2919/* Give PID SIGNAL. This determines what job the pid belongs to (if any).
2920 If PID does belong to a job, and the job is stopped, then CONTinue the
2921 job after giving it SIGNAL. Returns -1 on failure. If GROUP is non-null,
2922 then kill the process group associated with PID. */
2923int
2924kill_pid (pid, sig, group)
2925 pid_t pid;
2926 int sig, group;
2927{
2928 register PROCESS *p;
95732b49 2929 int job, result, negative;
726f6388
JA
2930 sigset_t set, oset;
2931
95732b49
JA
2932 if (pid < -1)
2933 {
2934 pid = -pid;
2935 group = negative = 1;
2936 }
2937 else
2938 negative = 0;
2939
ccc6cda3 2940 result = EXECUTION_SUCCESS;
726f6388
JA
2941 if (group)
2942 {
f73dda09 2943 BLOCK_CHILD (set, oset);
7117c2d2 2944 p = find_pipeline (pid, 0, &job);
f73dda09 2945
726f6388
JA
2946 if (job != NO_JOB)
2947 {
2948 jobs[job]->flags &= ~J_NOTIFIED;
2949
2950 /* Kill process in backquotes or one started without job control? */
95732b49
JA
2951
2952 /* If we're passed a pid < -1, just call killpg and see what happens */
2953 if (negative && jobs[job]->pgrp == shell_pgrp)
2954 result = killpg (pid, sig);
2955 /* If we're killing using job control notification, for example,
2956 without job control active, we have to do things ourselves. */
2957 else if (jobs[job]->pgrp == shell_pgrp)
726f6388
JA
2958 {
2959 p = jobs[job]->pipe;
726f6388
JA
2960 do
2961 {
95732b49
JA
2962 if (PALIVE (p) == 0)
2963 continue; /* avoid pid recycling problem */
726f6388 2964 kill (p->pid, sig);
95732b49 2965 if (PEXITED (p) && (sig == SIGTERM || sig == SIGHUP))
726f6388
JA
2966 kill (p->pid, SIGCONT);
2967 p = p->next;
2968 }
95732b49 2969 while (p != jobs[job]->pipe);
726f6388
JA
2970 }
2971 else
2972 {
2973 result = killpg (jobs[job]->pgrp, sig);
ccc6cda3 2974 if (p && STOPPED (job) && (sig == SIGTERM || sig == SIGHUP))
726f6388 2975 killpg (jobs[job]->pgrp, SIGCONT);
d166f048
JA
2976 /* If we're continuing a stopped job via kill rather than bg or
2977 fg, emulate the `bg' behavior. */
2978 if (p && STOPPED (job) && (sig == SIGCONT))
2979 {
2980 set_job_running (job);
2981 jobs[job]->flags &= ~J_FOREGROUND;
2982 jobs[job]->flags |= J_NOTIFIED;
2983 }
726f6388
JA
2984 }
2985 }
2986 else
2987 result = killpg (pid, sig);
f73dda09
JA
2988
2989 UNBLOCK_CHILD (oset);
726f6388
JA
2990 }
2991 else
2992 result = kill (pid, sig);
2993
726f6388
JA
2994 return (result);
2995}
2996
ccc6cda3
JA
2997/* sigchld_handler () flushes at least one of the children that we are
2998 waiting for. It gets run when we have gotten a SIGCHLD signal. */
726f6388 2999static sighandler
ccc6cda3 3000sigchld_handler (sig)
726f6388
JA
3001 int sig;
3002{
bb70624e 3003 int n, oerrno;
ccc6cda3 3004
bb70624e 3005 oerrno = errno;
726f6388
JA
3006 REINSTALL_SIGCHLD_HANDLER;
3007 sigchld++;
ccc6cda3 3008 n = 0;
7117c2d2 3009 if (queue_sigchld == 0)
ccc6cda3 3010 n = waitchld (-1, 0);
bb70624e 3011 errno = oerrno;
ccc6cda3 3012 SIGRETURN (n);
726f6388 3013}
ccc6cda3
JA
3014
3015/* waitchld() reaps dead or stopped children. It's called by wait_for and
bb70624e
JA
3016 sigchld_handler, and runs until there aren't any children terminating any
3017 more.
ccc6cda3 3018 If BLOCK is 1, this is to be a blocking wait for a single child, although
bb70624e
JA
3019 an arriving SIGCHLD could cause the wait to be non-blocking. It returns
3020 the number of children reaped, or -1 if there are no unwaited-for child
3021 processes. */
726f6388 3022static int
ccc6cda3
JA
3023waitchld (wpid, block)
3024 pid_t wpid;
3025 int block;
726f6388
JA
3026{
3027 WAIT status;
3028 PROCESS *child;
3029 pid_t pid;
28ef6c31 3030 int call_set_current, last_stopped_job, job, children_exited, waitpid_flags;
95732b49 3031 static int wcontinued = WCONTINUED; /* run-time fix for glibc problem */
ccc6cda3
JA
3032
3033 call_set_current = children_exited = 0;
3034 last_stopped_job = NO_JOB;
726f6388
JA
3035
3036 do
3037 {
d166f048 3038 /* We don't want to be notified about jobs stopping if job control
28ef6c31 3039 is not active. XXX - was interactive_shell instead of job_control */
d166f048 3040 waitpid_flags = (job_control && subshell_environment == 0)
95732b49 3041 ? (WUNTRACED|wcontinued)
ccc6cda3
JA
3042 : 0;
3043 if (sigchld || block == 0)
3044 waitpid_flags |= WNOHANG;
0628567a 3045 CHECK_TERMSIG;
3185942a 3046
ccc6cda3 3047 pid = WAITPID (-1, &status, waitpid_flags);
f73dda09 3048
95732b49
JA
3049 /* WCONTINUED may be rejected by waitpid as invalid even when defined */
3050 if (wcontinued && pid < 0 && errno == EINVAL)
3051 {
3052 wcontinued = 0;
3053 continue; /* jump back to the test and retry without WCONTINUED */
3054 }
3055
ccc6cda3
JA
3056 /* The check for WNOHANG is to make sure we decrement sigchld only
3057 if it was non-zero before we called waitpid. */
3058 if (sigchld > 0 && (waitpid_flags & WNOHANG))
3059 sigchld--;
bb70624e
JA
3060
3061 /* If waitpid returns -1 with errno == ECHILD, there are no more
3062 unwaited-for child processes of this shell. */
3063 if (pid < 0 && errno == ECHILD)
3064 {
3065 if (children_exited == 0)
3066 return -1;
3067 else
3068 break;
3069 }
ccc6cda3 3070
bb70624e
JA
3071 /* If waitpid returns 0, there are running children. If it returns -1,
3072 the only other error POSIX says it can return is EINTR. */
0628567a 3073 CHECK_TERMSIG;
ccc6cda3
JA
3074 if (pid <= 0)
3075 continue; /* jumps right to the test */
3076
f73dda09
JA
3077 /* children_exited is used to run traps on SIGCHLD. We don't want to
3078 run the trap if a process is just being continued. */
3079 if (WIFCONTINUED(status) == 0)
0628567a
JA
3080 {
3081 children_exited++;
3082 js.c_living--;
3083 }
ccc6cda3
JA
3084
3085 /* Locate our PROCESS for this pid. */
95732b49 3086 child = find_process (pid, 1, &job); /* want living procs only */
ccc6cda3 3087
3185942a 3088#if defined (COPROCESS_SUPPORT)
17345e5a 3089 coproc_pidchk (pid, status);
3185942a
JA
3090#endif
3091
ccc6cda3
JA
3092 /* It is not an error to have a child terminate that we did
3093 not have a record of. This child could have been part of
3094 a pipeline in backquote substitution. Even so, I'm not
3095 sure child is ever non-zero. */
3096 if (child == 0)
3185942a
JA
3097 {
3098 if (WIFEXITED (status) || WIFSIGNALED (status))
3099 js.c_reaped++;
3100 continue;
3101 }
ccc6cda3 3102
f73dda09 3103 /* Remember status, and whether or not the process is running. */
ccc6cda3 3104 child->status = status;
7117c2d2 3105 child->running = WIFCONTINUED(status) ? PS_RUNNING : PS_DONE;
ccc6cda3 3106
95732b49
JA
3107 if (PEXITED (child))
3108 {
3109 js.c_totreaped++;
3110 if (job != NO_JOB)
3111 js.c_reaped++;
3112 }
3113
ccc6cda3 3114 if (job == NO_JOB)
28ef6c31 3115 continue;
726f6388 3116
28ef6c31 3117 call_set_current += set_job_status_and_cleanup (job);
726f6388 3118
28ef6c31
JA
3119 if (STOPPED (job))
3120 last_stopped_job = job;
3121 else if (DEADJOB (job) && last_stopped_job == job)
3122 last_stopped_job = NO_JOB;
726f6388 3123 }
ccc6cda3 3124 while ((sigchld || block == 0) && pid > (pid_t)0);
726f6388
JA
3125
3126 /* If a job was running and became stopped, then set the current
3127 job. Otherwise, don't change a thing. */
3128 if (call_set_current)
bb70624e
JA
3129 {
3130 if (last_stopped_job != NO_JOB)
3131 set_current_job (last_stopped_job);
3132 else
3133 reset_current ();
3134 }
726f6388
JA
3135
3136 /* Call a SIGCHLD trap handler for each child that exits, if one is set. */
bb70624e 3137 if (job_control && signal_is_trapped (SIGCHLD) && children_exited &&
726f6388 3138 trap_list[SIGCHLD] != (char *)IGNORE_SIG)
3185942a
JA
3139 {
3140 if (this_shell_builtin && this_shell_builtin == wait_builtin)
3141 {
3142 interrupt_immediately = 0;
3143 trap_handler (SIGCHLD); /* set pending_traps[SIGCHLD] */
3144 wait_signal_received = SIGCHLD;
3145 longjmp (wait_intr_buf, 1);
3146 }
3147
3148 run_sigchld_trap (children_exited);
3149 }
726f6388
JA
3150
3151 /* We have successfully recorded the useful information about this process
3152 that has just changed state. If we notify asynchronously, and the job
3153 that this process belongs to is no longer running, then notify the user
3154 of that fact now. */
3155 if (asynchronous_notification && interactive)
3156 notify_of_job_status ();
3157
ccc6cda3 3158 return (children_exited);
726f6388
JA
3159}
3160
28ef6c31
JA
3161/* Set the status of JOB and perform any necessary cleanup if the job is
3162 marked as JDEAD.
3163
3164 Currently, the cleanup activity is restricted to handling any SIGINT
3165 received while waiting for a foreground job to finish. */
3166static int
3167set_job_status_and_cleanup (job)
3168 int job;
3169{
3170 PROCESS *child;
3171 int tstatus, job_state, any_stopped, any_tstped, call_set_current;
3172 SigHandler *temp_handler;
3173
3174 child = jobs[job]->pipe;
3175 jobs[job]->flags &= ~J_NOTIFIED;
3176
3177 call_set_current = 0;
3178
3179 /*
3180 * COMPUTE JOB STATUS
3181 */
3182
3183 /* If all children are not running, but any of them is stopped, then
3184 the job is stopped, not dead. */
3185 job_state = any_stopped = any_tstped = 0;
3186 do
3187 {
95732b49
JA
3188 job_state |= PRUNNING (child);
3189#if 0
3190 if (PEXITED (child) && (WIFSTOPPED (child->status)))
3191#else
3192 /* Only checking for WIFSTOPPED now, not for PS_DONE */
3193 if (PSTOPPED (child))
3194#endif
28ef6c31
JA
3195 {
3196 any_stopped = 1;
3197 any_tstped |= interactive && job_control &&
3198 (WSTOPSIG (child->status) == SIGTSTP);
3199 }
3200 child = child->next;
3201 }
3202 while (child != jobs[job]->pipe);
3203
3204 /* If job_state != 0, the job is still running, so don't bother with
f73dda09
JA
3205 setting the process exit status and job state unless we're
3206 transitioning from stopped to running. */
3207 if (job_state != 0 && JOBSTATE(job) != JSTOPPED)
28ef6c31
JA
3208 return 0;
3209
3210 /*
3211 * SET JOB STATUS
3212 */
3213
3214 /* The job is either stopped or dead. Set the state of the job accordingly. */
3215 if (any_stopped)
3216 {
3217 jobs[job]->state = JSTOPPED;
3218 jobs[job]->flags &= ~J_FOREGROUND;
3219 call_set_current++;
3220 /* Suspending a job with SIGTSTP breaks all active loops. */
3221 if (any_tstped && loop_level)
3222 breaking = loop_level;
3223 }
f73dda09
JA
3224 else if (job_state != 0) /* was stopped, now running */
3225 {
3226 jobs[job]->state = JRUNNING;
3227 call_set_current++;
3228 }
28ef6c31
JA
3229 else
3230 {
3231 jobs[job]->state = JDEAD;
95732b49 3232 js.j_ndead++;
28ef6c31 3233
7117c2d2 3234#if 0
28ef6c31
JA
3235 if (IS_FOREGROUND (job))
3236 setjstatus (job);
7117c2d2 3237#endif
28ef6c31
JA
3238
3239 /* If this job has a cleanup function associated with it, call it
3240 with `cleanarg' as the single argument, then set the function
3241 pointer to NULL so it is not inadvertently called twice. The
3242 cleanup function is responsible for deallocating cleanarg. */
3243 if (jobs[job]->j_cleanup)
3244 {
3245 (*jobs[job]->j_cleanup) (jobs[job]->cleanarg);
f73dda09 3246 jobs[job]->j_cleanup = (sh_vptrfunc_t *)NULL;
28ef6c31
JA
3247 }
3248 }
3249
3250 /*
3251 * CLEANUP
3252 *
3253 * Currently, we just do special things if we got a SIGINT while waiting
3254 * for a foreground job to complete
3255 */
3256
95732b49 3257 if (JOBSTATE (job) == JDEAD)
28ef6c31
JA
3258 {
3259 /* If we're running a shell script and we get a SIGINT with a
3260 SIGINT trap handler, but the foreground job handles it and
3261 does not exit due to SIGINT, run the trap handler but do not
3262 otherwise act as if we got the interrupt. */
3263 if (wait_sigint_received && interactive_shell == 0 &&
3264 WIFSIGNALED (child->status) == 0 && IS_FOREGROUND (job) &&
3265 signal_is_trapped (SIGINT))
3266 {
7117c2d2 3267 int old_frozen;
28ef6c31
JA
3268 wait_sigint_received = 0;
3269 last_command_exit_value = process_exit_status (child->status);
3270
7117c2d2 3271 old_frozen = jobs_list_frozen;
28ef6c31
JA
3272 jobs_list_frozen = 1;
3273 tstatus = maybe_call_trap_handler (SIGINT);
7117c2d2 3274 jobs_list_frozen = old_frozen;
28ef6c31
JA
3275 }
3276
3277 /* If the foreground job is killed by SIGINT when job control is not
3278 active, we need to perform some special handling.
3279
3280 The check of wait_sigint_received is a way to determine if the
3281 SIGINT came from the keyboard (in which case the shell has already
3282 seen it, and wait_sigint_received is non-zero, because keyboard
3283 signals are sent to process groups) or via kill(2) to the foreground
3284 process by another process (or itself). If the shell did receive the
3285 SIGINT, it needs to perform normal SIGINT processing. */
3286 else if (wait_sigint_received && (WTERMSIG (child->status) == SIGINT) &&
3287 IS_FOREGROUND (job) && IS_JOBCONTROL (job) == 0)
3288 {
7117c2d2
JA
3289 int old_frozen;
3290
28ef6c31
JA
3291 wait_sigint_received = 0;
3292
3293 /* If SIGINT is trapped, set the exit status so that the trap
3294 handler can see it. */
3295 if (signal_is_trapped (SIGINT))
3296 last_command_exit_value = process_exit_status (child->status);
3297
3298 /* If the signal is trapped, let the trap handler get it no matter
3299 what and simply return if the trap handler returns.
3300 maybe_call_trap_handler() may cause dead jobs to be removed from
3301 the job table because of a call to execute_command. We work
3302 around this by setting JOBS_LIST_FROZEN. */
7117c2d2 3303 old_frozen = jobs_list_frozen;
28ef6c31
JA
3304 jobs_list_frozen = 1;
3305 tstatus = maybe_call_trap_handler (SIGINT);
7117c2d2 3306 jobs_list_frozen = old_frozen;
28ef6c31
JA
3307 if (tstatus == 0 && old_sigint_handler != INVALID_SIGNAL_HANDLER)
3308 {
3309 /* wait_sigint_handler () has already seen SIGINT and
3310 allowed the wait builtin to jump out. We need to
3311 call the original SIGINT handler, if necessary. If
3312 the original handler is SIG_DFL, we need to resend
3313 the signal to ourselves. */
3314
3315 temp_handler = old_sigint_handler;
3316
3317 /* Bogus. If we've reset the signal handler as the result
3318 of a trap caught on SIGINT, then old_sigint_handler
3319 will point to trap_handler, which now knows nothing about
3320 SIGINT (if we reset the sighandler to the default).
3321 In this case, we have to fix things up. What a crock. */
3322 if (temp_handler == trap_handler && signal_is_trapped (SIGINT) == 0)
3323 temp_handler = trap_to_sighandler (SIGINT);
3324 restore_sigint_handler ();
95732b49 3325 if (temp_handler == SIG_DFL)
0628567a 3326 termsig_handler (SIGINT);
95732b49
JA
3327 else if (temp_handler != SIG_IGN)
3328 (*temp_handler) (SIGINT);
28ef6c31
JA
3329 }
3330 }
3331 }
3332
3333 return call_set_current;
3334}
3335
3336/* Build the array of values for the $PIPESTATUS variable from the set of
3337 exit statuses of all processes in the job J. */
3338static void
3339setjstatus (j)
3340 int j;
3341{
3342#if defined (ARRAY_VARS)
3343 register int i;
3344 register PROCESS *p;
3345
3346 for (i = 1, p = jobs[j]->pipe; p->next != jobs[j]->pipe; p = p->next, i++)
3347 ;
3348 i++;
7117c2d2 3349 if (statsize < i)
28ef6c31
JA
3350 {
3351 pstatuses = (int *)xrealloc (pstatuses, i * sizeof (int));
3352 statsize = i;
3353 }
3354 i = 0;
3355 p = jobs[j]->pipe;
3356 do
3357 {
3358 pstatuses[i++] = process_exit_status (p->status);
3359 p = p->next;
3360 }
3361 while (p != jobs[j]->pipe);
3362
3363 pstatuses[i] = -1; /* sentinel */
7117c2d2 3364 set_pipestatus_array (pstatuses, i);
28ef6c31
JA
3365#endif
3366}
3367
3185942a 3368void
28ef6c31
JA
3369run_sigchld_trap (nchild)
3370 int nchild;
3371{
3372 char *trap_command;
3373 int i;
3374
3375 /* Turn off the trap list during the call to parse_and_execute ()
3376 to avoid potentially infinite recursive calls. Preserve the
3377 values of last_command_exit_value, last_made_pid, and the_pipeline
3378 around the execution of the trap commands. */
3379 trap_command = savestring (trap_list[SIGCHLD]);
3380
3381 begin_unwind_frame ("SIGCHLD trap");
3382 unwind_protect_int (last_command_exit_value);
b80f6443 3383 unwind_protect_int (last_command_exit_signal);
f73dda09 3384 unwind_protect_var (last_made_pid);
28ef6c31
JA
3385 unwind_protect_int (interrupt_immediately);
3386 unwind_protect_int (jobs_list_frozen);
3387 unwind_protect_pointer (the_pipeline);
3388 unwind_protect_pointer (subst_assign_varlist);
3389
3390 /* We have to add the commands this way because they will be run
3391 in reverse order of adding. We don't want maybe_set_sigchld_trap ()
3392 to reference freed memory. */
b80f6443
JA
3393 add_unwind_protect (xfree, trap_command);
3394 add_unwind_protect (maybe_set_sigchld_trap, trap_command);
28ef6c31
JA
3395
3396 subst_assign_varlist = (WORD_LIST *)NULL;
3397 the_pipeline = (PROCESS *)NULL;
3398
3185942a 3399 set_impossible_sigchld_trap ();
28ef6c31
JA
3400 jobs_list_frozen = 1;
3401 for (i = 0; i < nchild; i++)
3402 {
3403 interrupt_immediately = 1;
b80f6443 3404 parse_and_execute (savestring (trap_command), "trap", SEVAL_NOHIST|SEVAL_RESETLINE);
28ef6c31
JA
3405 }
3406
3407 run_unwind_frame ("SIGCHLD trap");
3408}
3409
726f6388
JA
3410/* Function to call when you want to notify people of changes
3411 in job status. This prints out all jobs which are pending
3412 notification to stderr, and marks those printed as already
3413 notified, thus making them candidates for cleanup. */
3414static void
3415notify_of_job_status ()
3416{
3417 register int job, termsig;
3418 char *dir;
3419 sigset_t set, oset;
ccc6cda3 3420 WAIT s;
726f6388 3421
95732b49 3422 if (jobs == 0 || js.j_jobslots == 0)
28ef6c31
JA
3423 return;
3424
7117c2d2
JA
3425 if (old_ttou != 0)
3426 {
3427 sigemptyset (&set);
3428 sigaddset (&set, SIGCHLD);
3429 sigaddset (&set, SIGTTOU);
3430 sigemptyset (&oset);
3431 sigprocmask (SIG_BLOCK, &set, &oset);
3432 }
3433 else
3434 queue_sigchld++;
726f6388 3435
95732b49
JA
3436 /* XXX could use js.j_firstj here */
3437 for (job = 0, dir = (char *)NULL; job < js.j_jobslots; job++)
726f6388 3438 {
ccc6cda3 3439 if (jobs[job] && IS_NOTIFIED (job) == 0)
726f6388 3440 {
bb70624e 3441 s = raw_job_exit_status (job);
726f6388
JA
3442 termsig = WTERMSIG (s);
3443
b72432fd
JA
3444 /* POSIX.2 says we have to hang onto the statuses of at most the
3445 last CHILD_MAX background processes if the shell is running a
95732b49
JA
3446 script. If the shell is running a script, either from a file
3447 or standard input, don't print anything unless the job was
3448 killed by a signal. */
b72432fd
JA
3449 if (startup_state == 0 && WIFSIGNALED (s) == 0 &&
3450 ((DEADJOB (job) && IS_FOREGROUND (job) == 0) || STOPPED (job)))
3451 continue;
3452
b80f6443 3453#if 0
726f6388 3454 /* If job control is disabled, don't print the status messages.
ccc6cda3
JA
3455 Mark dead jobs as notified so that they get cleaned up. If
3456 startup_state == 2, we were started to run `-c command', so
b72432fd
JA
3457 don't print anything. */
3458 if ((job_control == 0 && interactive_shell) || startup_state == 2)
b80f6443
JA
3459#else
3460 /* If job control is disabled, don't print the status messages.
3461 Mark dead jobs as notified so that they get cleaned up. If
3462 startup_state == 2 and subshell_environment has the
3463 SUBSHELL_COMSUB bit turned on, we were started to run a command
3464 substitution, so don't print anything. */
3465 if ((job_control == 0 && interactive_shell) ||
3466 (startup_state == 2 && (subshell_environment & SUBSHELL_COMSUB)))
3467#endif
726f6388 3468 {
cce855bc
JA
3469 /* POSIX.2 compatibility: if the shell is not interactive,
3470 hang onto the job corresponding to the last asynchronous
3471 pid until the user has been notified of its status or does
3472 a `wait'. */
7117c2d2 3473 if (DEADJOB (job) && (interactive_shell || (find_last_pid (job, 0) != last_asynchronous_pid)))
726f6388
JA
3474 jobs[job]->flags |= J_NOTIFIED;
3475 continue;
3476 }
3477
ccc6cda3
JA
3478 /* Print info on jobs that are running in the background,
3479 and on foreground jobs that were killed by anything
d166f048 3480 except SIGINT (and possibly SIGPIPE). */
726f6388
JA
3481 switch (JOBSTATE (job))
3482 {
726f6388 3483 case JDEAD:
ccc6cda3 3484 if (interactive_shell == 0 && termsig && WIFSIGNALED (s) &&
cce855bc 3485 termsig != SIGINT &&
cce855bc
JA
3486#if defined (DONT_REPORT_SIGPIPE)
3487 termsig != SIGPIPE &&
3488#endif
ccc6cda3 3489 signal_is_trapped (termsig) == 0)
28ef6c31 3490 {
b80f6443 3491 /* Don't print `0' for a line number. */
3185942a 3492 fprintf (stderr, _("%s: line %d: "), get_name_for_error (), (line_number == 0) ? 1 : line_number);
ccc6cda3
JA
3493 pretty_print_job (job, JLIST_NONINTERACTIVE, stderr);
3494 }
3495 else if (IS_FOREGROUND (job))
726f6388 3496 {
d166f048 3497#if !defined (DONT_REPORT_SIGPIPE)
726f6388 3498 if (termsig && WIFSIGNALED (s) && termsig != SIGINT)
d166f048
JA
3499#else
3500 if (termsig && WIFSIGNALED (s) && termsig != SIGINT && termsig != SIGPIPE)
3501#endif
726f6388 3502 {
b80f6443 3503 fprintf (stderr, "%s", j_strsignal (termsig));
726f6388
JA
3504
3505 if (WIFCORED (s))
3185942a 3506 fprintf (stderr, _(" (core dumped)"));
726f6388
JA
3507
3508 fprintf (stderr, "\n");
3509 }
3510 }
95732b49 3511 else if (job_control) /* XXX job control test added */
726f6388 3512 {
ccc6cda3 3513 if (dir == 0)
726f6388 3514 dir = current_working_directory ();
ccc6cda3 3515 pretty_print_job (job, JLIST_STANDARD, stderr);
726f6388
JA
3516 if (dir && strcmp (dir, jobs[job]->wd) != 0)
3517 fprintf (stderr,
3185942a 3518 _("(wd now: %s)\n"), polite_directory_format (dir));
726f6388
JA
3519 }
3520
3521 jobs[job]->flags |= J_NOTIFIED;
3522 break;
3523
3524 case JSTOPPED:
3525 fprintf (stderr, "\n");
ccc6cda3 3526 if (dir == 0)
726f6388 3527 dir = current_working_directory ();
ccc6cda3 3528 pretty_print_job (job, JLIST_STANDARD, stderr);
726f6388
JA
3529 if (dir && (strcmp (dir, jobs[job]->wd) != 0))
3530 fprintf (stderr,
3185942a 3531 _("(wd now: %s)\n"), polite_directory_format (dir));
726f6388
JA
3532 jobs[job]->flags |= J_NOTIFIED;
3533 break;
3534
3535 case JRUNNING:
3536 case JMIXED:
3537 break;
3538
3539 default:
3540 programming_error ("notify_of_job_status");
3541 }
3542 }
3543 }
7117c2d2
JA
3544 if (old_ttou != 0)
3545 sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3546 else
3547 queue_sigchld--;
726f6388
JA
3548}
3549
726f6388 3550/* Initialize the job control mechanism, and set up the tty stuff. */
ccc6cda3 3551int
d166f048
JA
3552initialize_job_control (force)
3553 int force;
726f6388 3554{
3185942a
JA
3555 pid_t t;
3556 int t_errno;
3557
3558 t_errno = -1;
726f6388
JA
3559 shell_pgrp = getpgid (0);
3560
3561 if (shell_pgrp == -1)
3562 {
3185942a 3563 sys_error (_("initialize_job_control: getpgrp failed"));
726f6388
JA
3564 exit (1);
3565 }
3566
ccc6cda3
JA
3567 /* We can only have job control if we are interactive. */
3568 if (interactive == 0)
726f6388
JA
3569 {
3570 job_control = 0;
3571 original_pgrp = NO_PID;
d166f048 3572 shell_tty = fileno (stderr);
726f6388
JA
3573 }
3574 else
3575 {
3185942a
JA
3576 shell_tty = -1;
3577
3578 /* If forced_interactive is set, we skip the normal check that stderr
3579 is attached to a tty, so we need to check here. If it's not, we
3580 need to see whether we have a controlling tty by opening /dev/tty,
3581 since trying to use job control tty pgrp manipulations on a non-tty
3582 is going to fail. */
3583 if (forced_interactive && isatty (fileno (stderr)) == 0)
3584 shell_tty = open ("/dev/tty", O_RDWR|O_NONBLOCK);
3585
726f6388
JA
3586 /* Get our controlling terminal. If job_control is set, or
3587 interactive is set, then this is an interactive shell no
ccc6cda3 3588 matter where fd 2 is directed. */
3185942a
JA
3589 if (shell_tty == -1)
3590 shell_tty = dup (fileno (stderr)); /* fd 2 */
726f6388 3591
d166f048 3592 shell_tty = move_to_high_fd (shell_tty, 1, -1);
726f6388 3593
726f6388 3594 /* Compensate for a bug in systems that compiled the BSD
ccc6cda3 3595 rlogind with DEBUG defined, like NeXT and Alliant. */
726f6388
JA
3596 if (shell_pgrp == 0)
3597 {
3598 shell_pgrp = getpid ();
3599 setpgid (0, shell_pgrp);
3600 tcsetpgrp (shell_tty, shell_pgrp);
3601 }
726f6388
JA
3602
3603 while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)
3604 {
3605 if (shell_pgrp != terminal_pgrp)
3606 {
7117c2d2 3607 SigHandler *ottin;
ccc6cda3 3608
7117c2d2 3609 ottin = set_signal_handler(SIGTTIN, SIG_DFL);
726f6388 3610 kill (0, SIGTTIN);
7117c2d2 3611 set_signal_handler (SIGTTIN, ottin);
726f6388
JA
3612 continue;
3613 }
3614 break;
3615 }
3616
3185942a
JA
3617 if (terminal_pgrp == -1)
3618 t_errno = errno;
3619
ccc6cda3 3620 /* Make sure that we are using the new line discipline. */
726f6388
JA
3621 if (set_new_line_discipline (shell_tty) < 0)
3622 {
3185942a 3623 sys_error (_("initialize_job_control: line discipline"));
726f6388
JA
3624 job_control = 0;
3625 }
3626 else
3627 {
3628 original_pgrp = shell_pgrp;
3629 shell_pgrp = getpid ();
3630
3631 if ((original_pgrp != shell_pgrp) && (setpgid (0, shell_pgrp) < 0))
3632 {
3185942a 3633 sys_error (_("initialize_job_control: setpgid"));
726f6388
JA
3634 shell_pgrp = original_pgrp;
3635 }
3636
3637 job_control = 1;
ccc6cda3
JA
3638
3639 /* If (and only if) we just set our process group to our pid,
3640 thereby becoming a process group leader, and the terminal
3641 is not in the same process group as our (new) process group,
3642 then set the terminal's process group to our (new) process
3643 group. If that fails, set our process group back to what it
3644 was originally (so we can still read from the terminal) and
3645 turn off job control. */
3646 if (shell_pgrp != original_pgrp && shell_pgrp != terminal_pgrp)
3647 {
28ef6c31 3648 if (give_terminal_to (shell_pgrp, 0) < 0)
ccc6cda3 3649 {
3185942a 3650 t_errno = errno;
28ef6c31
JA
3651 setpgid (0, original_pgrp);
3652 shell_pgrp = original_pgrp;
3653 job_control = 0;
ccc6cda3
JA
3654 }
3655 }
3185942a
JA
3656
3657 if (job_control && ((t = tcgetpgrp (shell_tty)) == -1 || t != shell_pgrp))
3658 {
3659 if (t_errno != -1)
3660 errno = t_errno;
3661 sys_error (_("cannot set terminal process group (%d)"), t);
3662 job_control = 0;
3663 }
726f6388
JA
3664 }
3665 if (job_control == 0)
b80f6443 3666 internal_error (_("no job control in this shell"));
726f6388
JA
3667 }
3668
3669 if (shell_tty != fileno (stderr))
3670 SET_CLOSE_ON_EXEC (shell_tty);
3671
ccc6cda3 3672 set_signal_handler (SIGCHLD, sigchld_handler);
726f6388
JA
3673
3674 change_flag ('m', job_control ? '-' : '+');
3675
3676 if (interactive)
3677 get_tty_state ();
ccc6cda3 3678
95732b49
JA
3679 if (js.c_childmax < 0)
3680 js.c_childmax = getmaxchild ();
3681 if (js.c_childmax < 0)
3682 js.c_childmax = DEFAULT_CHILD_MAX;
3683
726f6388
JA
3684 return job_control;
3685}
3686
28ef6c31
JA
3687#ifdef DEBUG
3688void
3689debug_print_pgrps ()
3690{
f73dda09
JA
3691 itrace("original_pgrp = %ld shell_pgrp = %ld terminal_pgrp = %ld",
3692 (long)original_pgrp, (long)shell_pgrp, (long)terminal_pgrp);
3693 itrace("tcgetpgrp(%d) -> %ld, getpgid(0) -> %ld",
3694 shell_tty, (long)tcgetpgrp (shell_tty), (long)getpgid(0));
28ef6c31
JA
3695}
3696#endif
3697
726f6388
JA
3698/* Set the line discipline to the best this system has to offer.
3699 Return -1 if this is not possible. */
3700static int
3701set_new_line_discipline (tty)
3702 int tty;
3703{
3704#if defined (NEW_TTY_DRIVER)
3705 int ldisc;
3706
3707 if (ioctl (tty, TIOCGETD, &ldisc) < 0)
3708 return (-1);
3709
3710 if (ldisc != NTTYDISC)
3711 {
3712 ldisc = NTTYDISC;
3713
3714 if (ioctl (tty, TIOCSETD, &ldisc) < 0)
3715 return (-1);
3716 }
3717 return (0);
3718#endif /* NEW_TTY_DRIVER */
3719
3720#if defined (TERMIO_TTY_DRIVER)
ccc6cda3 3721# if defined (TERMIO_LDISC) && (NTTYDISC)
726f6388
JA
3722 if (ioctl (tty, TCGETA, &shell_tty_info) < 0)
3723 return (-1);
3724
3725 if (shell_tty_info.c_line != NTTYDISC)
3726 {
3727 shell_tty_info.c_line = NTTYDISC;
3728 if (ioctl (tty, TCSETAW, &shell_tty_info) < 0)
3729 return (-1);
3730 }
ccc6cda3 3731# endif /* TERMIO_LDISC && NTTYDISC */
726f6388
JA
3732 return (0);
3733#endif /* TERMIO_TTY_DRIVER */
3734
3735#if defined (TERMIOS_TTY_DRIVER)
ccc6cda3 3736# if defined (TERMIOS_LDISC) && defined (NTTYDISC)
726f6388
JA
3737 if (tcgetattr (tty, &shell_tty_info) < 0)
3738 return (-1);
3739
3740 if (shell_tty_info.c_line != NTTYDISC)
3741 {
3742 shell_tty_info.c_line = NTTYDISC;
3743 if (tcsetattr (tty, TCSADRAIN, &shell_tty_info) < 0)
3744 return (-1);
3745 }
ccc6cda3 3746# endif /* TERMIOS_LDISC && NTTYDISC */
726f6388
JA
3747 return (0);
3748#endif /* TERMIOS_TTY_DRIVER */
3749
3750#if !defined (NEW_TTY_DRIVER) && !defined (TERMIO_TTY_DRIVER) && !defined (TERMIOS_TTY_DRIVER)
3751 return (-1);
3752#endif
3753}
3754
726f6388
JA
3755/* Setup this shell to handle C-C, etc. */
3756void
3757initialize_job_signals ()
3758{
3759 if (interactive)
3760 {
3761 set_signal_handler (SIGINT, sigint_sighandler);
3762 set_signal_handler (SIGTSTP, SIG_IGN);
3763 set_signal_handler (SIGTTOU, SIG_IGN);
3764 set_signal_handler (SIGTTIN, SIG_IGN);
726f6388
JA
3765 }
3766 else if (job_control)
3767 {
28ef6c31 3768 old_tstp = set_signal_handler (SIGTSTP, sigstop_sighandler);
28ef6c31 3769 old_ttin = set_signal_handler (SIGTTIN, sigstop_sighandler);
7117c2d2 3770 old_ttou = set_signal_handler (SIGTTOU, sigstop_sighandler);
726f6388
JA
3771 }
3772 /* Leave these things alone for non-interactive shells without job
3773 control. */
3774}
3775
3776/* Here we handle CONT signals. */
3777static sighandler
28ef6c31 3778sigcont_sighandler (sig)
726f6388
JA
3779 int sig;
3780{
3781 initialize_job_signals ();
3782 set_signal_handler (SIGCONT, old_cont);
3783 kill (getpid (), SIGCONT);
3784
ccc6cda3 3785 SIGRETURN (0);
726f6388
JA
3786}
3787
3788/* Here we handle stop signals while we are running not as a login shell. */
3789static sighandler
28ef6c31 3790sigstop_sighandler (sig)
726f6388
JA
3791 int sig;
3792{
3793 set_signal_handler (SIGTSTP, old_tstp);
3794 set_signal_handler (SIGTTOU, old_ttou);
3795 set_signal_handler (SIGTTIN, old_ttin);
3796
28ef6c31 3797 old_cont = set_signal_handler (SIGCONT, sigcont_sighandler);
726f6388 3798
28ef6c31 3799 give_terminal_to (shell_pgrp, 0);
726f6388
JA
3800
3801 kill (getpid (), sig);
3802
ccc6cda3 3803 SIGRETURN (0);
726f6388
JA
3804}
3805
3806/* Give the terminal to PGRP. */
ccc6cda3 3807int
28ef6c31 3808give_terminal_to (pgrp, force)
726f6388 3809 pid_t pgrp;
28ef6c31 3810 int force;
726f6388
JA
3811{
3812 sigset_t set, oset;
3185942a 3813 int r, e;
726f6388 3814
ccc6cda3 3815 r = 0;
28ef6c31 3816 if (job_control || force)
726f6388
JA
3817 {
3818 sigemptyset (&set);
3819 sigaddset (&set, SIGTTOU);
3820 sigaddset (&set, SIGTTIN);
3821 sigaddset (&set, SIGTSTP);
3822 sigaddset (&set, SIGCHLD);
3823 sigemptyset (&oset);
3824 sigprocmask (SIG_BLOCK, &set, &oset);
3825
3826 if (tcsetpgrp (shell_tty, pgrp) < 0)
3827 {
3828 /* Maybe we should print an error message? */
ccc6cda3 3829#if 0
f73dda09
JA
3830 sys_error ("tcsetpgrp(%d) failed: pid %ld to pgrp %ld",
3831 shell_tty, (long)getpid(), (long)pgrp);
ccc6cda3 3832#endif
726f6388 3833 r = -1;
3185942a 3834 e = errno;
726f6388
JA
3835 }
3836 else
3837 terminal_pgrp = pgrp;
726f6388
JA
3838 sigprocmask (SIG_SETMASK, &oset, (sigset_t *)NULL);
3839 }
3840
3185942a
JA
3841 if (r == -1)
3842 errno = e;
3843
726f6388
JA
3844 return r;
3845}
3846
3185942a
JA
3847/* Give terminal to NPGRP iff it's currently owned by OPGRP. FLAGS are the
3848 flags to pass to give_terminal_to(). */
3849static int
3850maybe_give_terminal_to (opgrp, npgrp, flags)
3851 pid_t opgrp, npgrp;
3852 int flags;
3853{
3854 int tpgrp;
3855
3856 tpgrp = tcgetpgrp (shell_tty);
3857 if (tpgrp < 0 && errno == ENOTTY)
3858 return -1;
3859 if (tpgrp == npgrp)
3860 {
3861 terminal_pgrp = npgrp;
3862 return 0;
3863 }
3864 else if (tpgrp != opgrp)
3865 {
3866#if defined (DEBUG)
3867 internal_warning ("maybe_give_terminal_to: terminal pgrp == %d shell pgrp = %d new pgrp = %d", tpgrp, opgrp, npgrp);
3868#endif
3869 return -1;
3870 }
3871 else
3872 return (give_terminal_to (npgrp, flags));
3873}
3874
726f6388
JA
3875/* Clear out any jobs in the job array. This is intended to be used by
3876 children of the shell, who should not have any job structures as baggage
3877 when they start executing (forking subshells for parenthesized execution
cce855bc
JA
3878 and functions with pipes are the two that spring to mind). If RUNNING_ONLY
3879 is nonzero, only running jobs are removed from the table. */
d166f048 3880void
cce855bc
JA
3881delete_all_jobs (running_only)
3882 int running_only;
726f6388
JA
3883{
3884 register int i;
3885 sigset_t set, oset;
3886
ccc6cda3
JA
3887 BLOCK_CHILD (set, oset);
3888
95732b49
JA
3889 /* XXX - need to set j_lastj, j_firstj appropriately if running_only != 0. */
3890 if (js.j_jobslots)
726f6388 3891 {
95732b49 3892 js.j_current = js.j_previous = NO_JOB;
726f6388 3893
95732b49
JA
3894 /* XXX could use js.j_firstj here */
3895 for (i = 0; i < js.j_jobslots; i++)
3896 {
3897#if defined (DEBUG)
3898 if (i < js.j_firstj && jobs[i])
3899 itrace("delete_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
0628567a
JA
3900 if (i > js.j_lastj && jobs[i])
3901 itrace("delete_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
95732b49
JA
3902#endif
3903 if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
0628567a 3904 delete_job (i, DEL_WARNSTOPPED);
95732b49 3905 }
cce855bc
JA
3906 if (running_only == 0)
3907 {
3908 free ((char *)jobs);
95732b49
JA
3909 js.j_jobslots = 0;
3910 js.j_firstj = js.j_lastj = js.j_njobs = 0;
cce855bc 3911 }
726f6388 3912 }
ccc6cda3 3913
95732b49
JA
3914 if (running_only == 0)
3915 bgp_clear ();
3916
ccc6cda3 3917 UNBLOCK_CHILD (oset);
726f6388
JA
3918}
3919
d166f048 3920/* Mark all jobs in the job array so that they don't get a SIGHUP when the
cce855bc 3921 shell gets one. If RUNNING_ONLY is nonzero, mark only running jobs. */
d166f048 3922void
cce855bc
JA
3923nohup_all_jobs (running_only)
3924 int running_only;
d166f048
JA
3925{
3926 register int i;
3927 sigset_t set, oset;
3928
3929 BLOCK_CHILD (set, oset);
3930
95732b49 3931 if (js.j_jobslots)
d166f048 3932 {
95732b49
JA
3933 /* XXX could use js.j_firstj here */
3934 for (i = 0; i < js.j_jobslots; i++)
cce855bc 3935 if (jobs[i] && (running_only == 0 || (running_only && RUNNING(i))))
d166f048
JA
3936 nohup_job (i);
3937 }
3938
3939 UNBLOCK_CHILD (oset);
3940}
3941
bb70624e
JA
3942int
3943count_all_jobs ()
3944{
3945 int i, n;
3946 sigset_t set, oset;
3947
95732b49 3948 /* This really counts all non-dead jobs. */
bb70624e 3949 BLOCK_CHILD (set, oset);
95732b49
JA
3950 /* XXX could use js.j_firstj here */
3951 for (i = n = 0; i < js.j_jobslots; i++)
3952 {
3953#if defined (DEBUG)
3954 if (i < js.j_firstj && jobs[i])
3955 itrace("count_all_jobs: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
0628567a
JA
3956 if (i > js.j_lastj && jobs[i])
3957 itrace("count_all_jobs: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
95732b49
JA
3958#endif
3959 if (jobs[i] && DEADJOB(i) == 0)
3960 n++;
3961 }
bb70624e
JA
3962 UNBLOCK_CHILD (oset);
3963 return n;
3964}
3965
3966static void
3967mark_all_jobs_as_dead ()
3968{
3969 register int i;
3970 sigset_t set, oset;
3971
95732b49 3972 if (js.j_jobslots == 0)
7117c2d2 3973 return;
bb70624e 3974
7117c2d2 3975 BLOCK_CHILD (set, oset);
bb70624e 3976
95732b49
JA
3977 /* XXX could use js.j_firstj here */
3978 for (i = 0; i < js.j_jobslots; i++)
7117c2d2 3979 if (jobs[i])
95732b49
JA
3980 {
3981 jobs[i]->state = JDEAD;
3982 js.j_ndead++;
3983 }
7117c2d2
JA
3984
3985 UNBLOCK_CHILD (oset);
bb70624e
JA
3986}
3987
726f6388 3988/* Mark all dead jobs as notified, so delete_job () cleans them out
b72432fd
JA
3989 of the job table properly. POSIX.2 says we need to save the
3990 status of the last CHILD_MAX jobs, so we count the number of dead
3991 jobs and mark only enough as notified to save CHILD_MAX statuses. */
726f6388 3992static void
b72432fd
JA
3993mark_dead_jobs_as_notified (force)
3994 int force;
726f6388 3995{
95732b49 3996 register int i, ndead, ndeadproc;
726f6388
JA
3997 sigset_t set, oset;
3998
95732b49 3999 if (js.j_jobslots == 0)
7117c2d2 4000 return;
b72432fd 4001
7117c2d2 4002 BLOCK_CHILD (set, oset);
b72432fd 4003
7117c2d2
JA
4004 /* If FORCE is non-zero, we don't have to keep CHILD_MAX statuses
4005 around; just run through the array. */
4006 if (force)
4007 {
95732b49
JA
4008 /* XXX could use js.j_firstj here */
4009 for (i = 0; i < js.j_jobslots; i++)
28ef6c31 4010 {
7117c2d2
JA
4011 if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
4012 jobs[i]->flags |= J_NOTIFIED;
28ef6c31 4013 }
7117c2d2
JA
4014 UNBLOCK_CHILD (oset);
4015 return;
4016 }
4017
95732b49
JA
4018 /* Mark enough dead jobs as notified to keep CHILD_MAX processes left in the
4019 array with the corresponding not marked as notified. This is a better
4020 way to avoid pid aliasing and reuse problems than keeping the POSIX-
4021 mandated CHILD_MAX jobs around. delete_job() takes care of keeping the
4022 bgpids list regulated. */
7117c2d2
JA
4023
4024 /* Count the number of dead jobs */
95732b49
JA
4025 /* XXX could use js.j_firstj here */
4026 for (i = ndead = ndeadproc = 0; i < js.j_jobslots; i++)
7117c2d2 4027 {
95732b49
JA
4028#if defined (DEBUG)
4029 if (i < js.j_firstj && jobs[i])
4030 itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
0628567a
JA
4031 if (i > js.j_lastj && jobs[i])
4032 itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
95732b49 4033#endif
7117c2d2 4034 if (jobs[i] && DEADJOB (i))
95732b49
JA
4035 {
4036 ndead++;
4037 ndeadproc += processes_in_job (i);
4038 }
7117c2d2
JA
4039 }
4040
95732b49
JA
4041#ifdef DEBUG
4042 if (ndeadproc != js.c_reaped)
4043 itrace("mark_dead_jobs_as_notified: ndeadproc (%d) != js.c_reaped (%d)", ndeadproc, js.c_reaped);
4044 if (ndead != js.j_ndead)
4045 itrace("mark_dead_jobs_as_notified: ndead (%d) != js.j_ndead (%d)", ndead, js.j_ndead);
4046#endif
4047
4048 if (js.c_childmax < 0)
4049 js.c_childmax = getmaxchild ();
4050 if (js.c_childmax < 0)
4051 js.c_childmax = DEFAULT_CHILD_MAX;
726f6388 4052
95732b49
JA
4053 /* Don't do anything if the number of dead processes is less than CHILD_MAX
4054 and we're not forcing a cleanup. */
4055 if (ndeadproc <= js.c_childmax)
7117c2d2 4056 {
726f6388 4057 UNBLOCK_CHILD (oset);
7117c2d2 4058 return;
726f6388 4059 }
7117c2d2 4060
95732b49
JA
4061#if 0
4062itrace("mark_dead_jobs_as_notified: child_max = %d ndead = %d ndeadproc = %d", js.c_childmax, ndead, ndeadproc);
4063#endif
4064
7117c2d2
JA
4065 /* Mark enough dead jobs as notified that we keep CHILD_MAX jobs in
4066 the list. This isn't exactly right yet; changes need to be made
4067 to stop_pipeline so we don't mark the newer jobs after we've
95732b49
JA
4068 created CHILD_MAX slots in the jobs array. This needs to be
4069 integrated with a way to keep the jobs array from growing without
4070 bound. Maybe we wrap back around to 0 after we reach some max
4071 limit, and there are sufficient job slots free (keep track of total
4072 size of jobs array (js.j_jobslots) and running count of number of jobs
4073 in jobs array. Then keep a job index corresponding to the `oldest job'
4074 and start this loop there, wrapping around as necessary. In effect,
4075 we turn the list into a circular buffer. */
4076 /* XXX could use js.j_firstj here */
4077 for (i = 0; i < js.j_jobslots; i++)
7117c2d2
JA
4078 {
4079 if (jobs[i] && DEADJOB (i) && (interactive_shell || (find_last_pid (i, 0) != last_asynchronous_pid)))
4080 {
95732b49
JA
4081#if defined (DEBUG)
4082 if (i < js.j_firstj && jobs[i])
4083 itrace("mark_dead_jobs_as_notified: job %d non-null before js.j_firstj (%d)", i, js.j_firstj);
0628567a
JA
4084 if (i > js.j_lastj && jobs[i])
4085 itrace("mark_dead_jobs_as_notified: job %d non-null after js.j_lastj (%d)", i, js.j_lastj);
95732b49
JA
4086#endif
4087 /* If marking this job as notified would drop us down below
4088 child_max, don't mark it so we can keep at least child_max
4089 statuses. XXX -- need to check what Posix actually says
4090 about keeping statuses. */
4091 if ((ndeadproc -= processes_in_job (i)) <= js.c_childmax)
7117c2d2 4092 break;
95732b49 4093 jobs[i]->flags |= J_NOTIFIED;
7117c2d2
JA
4094 }
4095 }
4096
4097 UNBLOCK_CHILD (oset);
726f6388
JA
4098}
4099
ccc6cda3
JA
4100/* Here to allow other parts of the shell (like the trap stuff) to
4101 unfreeze the jobs list. */
4102void
4103unfreeze_jobs_list ()
4104{
4105 jobs_list_frozen = 0;
4106}
4107
726f6388
JA
4108/* Allow or disallow job control to take place. Returns the old value
4109 of job_control. */
4110int
4111set_job_control (arg)
4112 int arg;
4113{
4114 int old;
4115
4116 old = job_control;
4117 job_control = arg;
b80f6443
JA
4118
4119 /* If we're turning on job control, reset pipeline_pgrp so make_child will
4120 put new child processes into the right pgrp */
4121 if (job_control != old && job_control)
4122 pipeline_pgrp = 0;
4123
726f6388
JA
4124 return (old);
4125}
4126
4127/* Turn off all traces of job control. This is run by children of the shell
4128 which are going to do shellsy things, like wait (), etc. */
4129void
4130without_job_control ()
4131{
4132 stop_making_children ();
4133 start_pipeline ();
95732b49 4134#if defined (PGRP_PIPE)
3185942a 4135 sh_closepipe (pgrp_pipe);
95732b49 4136#endif
cce855bc 4137 delete_all_jobs (0);
726f6388
JA
4138 set_job_control (0);
4139}
4140
4141/* If this shell is interactive, terminate all stopped jobs and
4142 restore the original terminal process group. This is done
4143 before the `exec' builtin calls shell_execve. */
4144void
4145end_job_control ()
4146{
4147 if (interactive_shell) /* XXX - should it be interactive? */
4148 {
4149 terminate_stopped_jobs ();
4150
4151 if (original_pgrp >= 0)
28ef6c31 4152 give_terminal_to (original_pgrp, 1);
726f6388
JA
4153 }
4154
4155 if (original_pgrp >= 0)
4156 setpgid (0, original_pgrp);
4157}
4158
4159/* Restart job control by closing shell tty and reinitializing. This is
4160 called after an exec fails in an interactive shell and we do not exit. */
4161void
4162restart_job_control ()
4163{
4164 if (shell_tty != -1)
4165 close (shell_tty);
d166f048 4166 initialize_job_control (0);
726f6388
JA
4167}
4168
4169/* Set the handler to run when the shell receives a SIGCHLD signal. */
4170void
4171set_sigchld_handler ()
4172{
ccc6cda3 4173 set_signal_handler (SIGCHLD, sigchld_handler);
726f6388
JA
4174}
4175
4176#if defined (PGRP_PIPE)
4177/* Read from the read end of a pipe. This is how the process group leader
4178 blocks until all of the processes in a pipeline have been made. */
4179static void
4180pipe_read (pp)
4181 int *pp;
4182{
4183 char ch;
4184
4185 if (pp[1] >= 0)
4186 {
4187 close (pp[1]);
4188 pp[1] = -1;
4189 }
4190
4191 if (pp[0] >= 0)
4192 {
4193 while (read (pp[0], &ch, 1) == -1 && errno == EINTR)
bb70624e 4194 ;
726f6388
JA
4195 }
4196}
4197
726f6388 4198/* Functional interface closes our local-to-job-control pipes. */
ccc6cda3 4199void
726f6388
JA
4200close_pgrp_pipe ()
4201{
3185942a 4202 sh_closepipe (pgrp_pipe);
726f6388
JA
4203}
4204
89a92869
CR
4205void
4206save_pgrp_pipe (p, clear)
4207 int *p;
4208 int clear;
4209{
4210 p[0] = pgrp_pipe[0];
4211 p[1] = pgrp_pipe[1];
4212 if (clear)
4213 pgrp_pipe[0] = pgrp_pipe[1] = -1;
4214}
4215
4216void
4217restore_pgrp_pipe (p)
4218 int *p;
4219{
4220 pgrp_pipe[0] = p[0];
4221 pgrp_pipe[1] = p[1];
4222}
4223
726f6388 4224#endif /* PGRP_PIPE */