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