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