OpenCoverage

jobs.c

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

Generated by Squish Coco 4.1.2