source: vendor/bash/3.1-p17/jobs.c@ 3792

Last change on this file since 3792 was 3275, checked in by bird, 18 years ago

Backed out Brendan's patches.

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