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