OpenCoverage

sig.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/sig.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* sig.c - interface for shell signal handlers and signal initialization. */-
2-
3/* Copyright (C) 1994-2015 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
7 Bash is free software: you can redistribute it and/or modify-
8 it under the terms of the GNU General Public License as published by-
9 the Free Software Foundation, either version 3 of the License, or-
10 (at your option) any later version.-
11-
12 Bash is distributed in the hope that it will be useful,-
13 but WITHOUT ANY WARRANTY; without even the implied warranty of-
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
15 GNU General Public License for more details.-
16-
17 You should have received a copy of the GNU General Public License-
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.-
19*/-
20-
21#include "config.h"-
22-
23#include "bashtypes.h"-
24-
25#if defined (HAVE_UNISTD_H)-
26# ifdef _MINIX-
27# include <sys/types.h>-
28# endif-
29# include <unistd.h>-
30#endif-
31-
32#include <stdio.h>-
33#include <signal.h>-
34-
35#include "bashintl.h"-
36-
37#include "shell.h"-
38#include "execute_cmd.h"-
39#if defined (JOB_CONTROL)-
40#include "jobs.h"-
41#endif /* JOB_CONTROL */-
42#include "siglist.h"-
43#include "sig.h"-
44#include "trap.h"-
45-
46#include "builtins/common.h"-
47#include "builtins/builtext.h"-
48-
49#if defined (READLINE)-
50# include "bashline.h"-
51# include <readline/readline.h>-
52#endif-
53-
54#if defined (HISTORY)-
55# include "bashhist.h"-
56#endif-
57-
58extern void initialize_siglist ();-
59-
60#if !defined (JOB_CONTROL)-
61extern void initialize_job_signals __P((void));-
62#endif-
63-
64/* Non-zero after SIGINT. */-
65volatile sig_atomic_t interrupt_state = 0;-
66-
67/* Non-zero after SIGWINCH */-
68volatile sig_atomic_t sigwinch_received = 0;-
69-
70/* Non-zero after SIGTERM */-
71volatile sig_atomic_t sigterm_received = 0;-
72-
73/* Set to the value of any terminating signal received. */-
74volatile sig_atomic_t terminating_signal = 0;-
75-
76/* The environment at the top-level R-E loop. We use this in-
77 the case of error return. */-
78procenv_t top_level;-
79-
80#if defined (JOB_CONTROL) || defined (HAVE_POSIX_SIGNALS)-
81/* The signal masks that this shell runs with. */-
82sigset_t top_level_mask;-
83#endif /* JOB_CONTROL */-
84-
85/* When non-zero, we throw_to_top_level (). */-
86int interrupt_immediately = 0;-
87-
88/* When non-zero, we call the terminating signal handler immediately. */-
89int terminate_immediately = 0;-
90-
91#if defined (SIGWINCH)-
92static SigHandler *old_winch = (SigHandler *)SIG_DFL;-
93#endif-
94-
95static void initialize_shell_signals __P((void));-
96-
97void-
98initialize_signals (reinit)-
99 int reinit;-
100{-
101 initialize_shell_signals ();-
102 initialize_job_signals ();-
103#if !defined (HAVE_SYS_SIGLIST) && !defined (HAVE_UNDER_SYS_SIGLIST) && !defined (HAVE_STRSIGNAL)-
104 if (reinit == 0)-
105 initialize_siglist ();-
106#endif /* !HAVE_SYS_SIGLIST && !HAVE_UNDER_SYS_SIGLIST && !HAVE_STRSIGNAL */-
107}
executed 5448 times by 1 test: end of block
Executed by:
  • Self test
5448
108-
109/* A structure describing a signal that terminates the shell if not-
110 caught. The orig_handler member is present so children can reset-
111 these signals back to their original handlers. */-
112struct termsig {-
113 int signum;-
114 SigHandler *orig_handler;-
115 int orig_flags;-
116};-
117-
118#define NULL_HANDLER (SigHandler *)SIG_DFL-
119-
120/* The list of signals that would terminate the shell if not caught.-
121 We catch them, but just so that we can write the history file,-
122 and so forth. */-
123static struct termsig terminating_signals[] = {-
124#ifdef SIGHUP-
125{ SIGHUP, NULL_HANDLER, 0 },-
126#endif-
127-
128#ifdef SIGINT-
129{ SIGINT, NULL_HANDLER, 0 },-
130#endif-
131-
132#ifdef SIGILL-
133{ SIGILL, NULL_HANDLER, 0 },-
134#endif-
135-
136#ifdef SIGTRAP-
137{ SIGTRAP, NULL_HANDLER, 0 },-
138#endif-
139-
140#ifdef SIGIOT-
141{ SIGIOT, NULL_HANDLER, 0 },-
142#endif-
143-
144#ifdef SIGDANGER-
145{ SIGDANGER, NULL_HANDLER, 0 },-
146#endif-
147-
148#ifdef SIGEMT-
149{ SIGEMT, NULL_HANDLER, 0 },-
150#endif-
151-
152#ifdef SIGFPE-
153{ SIGFPE, NULL_HANDLER, 0 },-
154#endif-
155-
156#ifdef SIGBUS-
157{ SIGBUS, NULL_HANDLER, 0 },-
158#endif-
159-
160#ifdef SIGSEGV-
161{ SIGSEGV, NULL_HANDLER, 0 },-
162#endif-
163-
164#ifdef SIGSYS-
165{ SIGSYS, NULL_HANDLER, 0 },-
166#endif-
167-
168#ifdef SIGPIPE-
169{ SIGPIPE, NULL_HANDLER, 0 },-
170#endif-
171-
172#ifdef SIGALRM-
173{ SIGALRM, NULL_HANDLER, 0 },-
174#endif-
175-
176#ifdef SIGTERM-
177{ SIGTERM, NULL_HANDLER, 0 },-
178#endif-
179-
180#ifdef SIGXCPU-
181{ SIGXCPU, NULL_HANDLER, 0 },-
182#endif-
183-
184#ifdef SIGXFSZ-
185{ SIGXFSZ, NULL_HANDLER, 0 },-
186#endif-
187-
188#ifdef SIGVTALRM-
189{ SIGVTALRM, NULL_HANDLER, 0 },-
190#endif-
191-
192#if 0-
193#ifdef SIGPROF-
194{ SIGPROF, NULL_HANDLER, 0 },-
195#endif-
196#endif-
197-
198#ifdef SIGLOST-
199{ SIGLOST, NULL_HANDLER, 0 },-
200#endif-
201-
202#ifdef SIGUSR1-
203{ SIGUSR1, NULL_HANDLER, 0 },-
204#endif-
205-
206#ifdef SIGUSR2-
207{ SIGUSR2, NULL_HANDLER, 0 },-
208#endif-
209};-
210-
211#define TERMSIGS_LENGTH (sizeof (terminating_signals) / sizeof (struct termsig))-
212-
213#define XSIG(x) (terminating_signals[x].signum)-
214#define XHANDLER(x) (terminating_signals[x].orig_handler)-
215#define XSAFLAGS(x) (terminating_signals[x].orig_flags)-
216-
217static int termsigs_initialized = 0;-
218-
219/* Initialize signals that will terminate the shell to do some-
220 unwind protection. For non-interactive shells, we only call-
221 this when a trap is defined for EXIT (0) or when trap is run-
222 to display signal dispositions. */-
223void-
224initialize_terminating_signals ()-
225{-
226 register int i;-
227#if defined (HAVE_POSIX_SIGNALS)-
228 struct sigaction act, oact;-
229#endif-
230-
231 if (termsigs_initialized)
termsigs_initializedDescription
TRUEevaluated 39 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 81 times by 1 test
Evaluated by:
  • Self test
39-81
232 return;
executed 39 times by 1 test: return;
Executed by:
  • Self test
39
233-
234 /* The following code is to avoid an expensive call to-
235 set_signal_handler () for each terminating_signals. Fortunately,-
236 this is possible in Posix. Unfortunately, we have to call signal ()-
237 on non-Posix systems for each signal in terminating_signals. */-
238#if defined (HAVE_POSIX_SIGNALS)-
239 act.sa_handler = termsig_sighandler;-
240 act.sa_flags = 0;-
241 sigemptyset (&act.sa_mask);-
242 sigemptyset (&oact.sa_mask);-
243 for (i = 0; i < TERMSIGS_LENGTH; i++)
i < (sizeof (t...ruct termsig))Description
TRUEevaluated 1377 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 81 times by 1 test
Evaluated by:
  • Self test
81-1377
244 sigaddset (&act.sa_mask, XSIG (i));
executed 1377 times by 1 test: sigaddset (&act.sa_mask, (terminating_signals[i].signum));
Executed by:
  • Self test
1377
245 for (i = 0; i < TERMSIGS_LENGTH; i++)
i < (sizeof (t...ruct termsig))Description
TRUEevaluated 1377 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 81 times by 1 test
Evaluated by:
  • Self test
81-1377
246 {-
247 /* If we've already trapped it, don't do anything. */-
248 if (signal_is_trapped (XSIG (i)))
signal_is_trap...ls[i].signum))Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1369 times by 1 test
Evaluated by:
  • Self test
8-1369
249 continue;
executed 8 times by 1 test: continue;
Executed by:
  • Self test
8
250-
251 sigaction (XSIG (i), &act, &oact);-
252 XHANDLER(i) = oact.sa_handler;-
253 XSAFLAGS(i) = oact.sa_flags;-
254 /* Don't do anything with signals that are ignored at shell entry-
255 if the shell is not interactive. */-
256 /* XXX - should we do this for interactive shells, too? */-
257 if (interactive_shell == 0 && XHANDLER (i) == SIG_IGN)
interactive_shell == 0Description
TRUEevaluated 1335 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 34 times by 1 test
Evaluated by:
  • Self test
(terminating_s...ghandler_t) 1)Description
TRUEevaluated 81 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1254 times by 1 test
Evaluated by:
  • Self test
34-1335
258 {-
259 sigaction (XSIG (i), &oact, &act);-
260 set_signal_hard_ignored (XSIG (i));-
261 }
executed 81 times by 1 test: end of block
Executed by:
  • Self test
81
262#if defined (SIGPROF) && !defined (_MINIX)-
263 if (XSIG (i) == SIGPROF && XHANDLER (i) != SIG_DFL && XHANDLER (i) != SIG_IGN)
(terminating_s....signum) == 27Description
TRUEnever evaluated
FALSEevaluated 1369 times by 1 test
Evaluated by:
  • Self test
(terminating_s...ghandler_t) 0)Description
TRUEnever evaluated
FALSEnever evaluated
(terminating_s...ghandler_t) 1)Description
TRUEnever evaluated
FALSEnever evaluated
0-1369
264 sigaction (XSIG (i), &oact, (struct sigaction *)NULL);
never executed: sigaction ((terminating_signals[i].signum), &oact, (struct sigaction *) ((void *)0) );
0
265#endif /* SIGPROF && !_MINIX */-
266 }
executed 1369 times by 1 test: end of block
Executed by:
  • Self test
1369
267-
268#else /* !HAVE_POSIX_SIGNALS */-
269-
270 for (i = 0; i < TERMSIGS_LENGTH; i++)-
271 {-
272 /* If we've already trapped it, don't do anything. */-
273 if (signal_is_trapped (XSIG (i)))-
274 continue;-
275-
276 XHANDLER(i) = signal (XSIG (i), termsig_sighandler);-
277 XSAFLAGS(i) = 0;-
278 /* Don't do anything with signals that are ignored at shell entry-
279 if the shell is not interactive. */-
280 /* XXX - should we do this for interactive shells, too? */-
281 if (interactive_shell == 0 && XHANDLER (i) == SIG_IGN)-
282 {-
283 signal (XSIG (i), SIG_IGN);-
284 set_signal_hard_ignored (XSIG (i));-
285 }-
286#ifdef SIGPROF-
287 if (XSIG (i) == SIGPROF && XHANDLER (i) != SIG_DFL && XHANDLER (i) != SIG_IGN)-
288 signal (XSIG (i), XHANDLER (i));-
289#endif-
290 }-
291-
292#endif /* !HAVE_POSIX_SIGNALS */-
293-
294 termsigs_initialized = 1;-
295}
executed 81 times by 1 test: end of block
Executed by:
  • Self test
81
296-
297static void-
298initialize_shell_signals ()-
299{-
300 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
301 initialize_terminating_signals ();
executed 2 times by 1 test: initialize_terminating_signals ();
Executed by:
  • Self test
2
302-
303#if defined (JOB_CONTROL) || defined (HAVE_POSIX_SIGNALS)-
304 /* All shells use the signal mask they inherit, and pass it along-
305 to child processes. Children will never block SIGCHLD, though. */-
306 sigemptyset (&top_level_mask);-
307 sigprocmask (SIG_BLOCK, (sigset_t *)NULL, &top_level_mask);-
308# if defined (SIGCHLD)-
309 sigdelset (&top_level_mask, SIGCHLD);-
310# endif-
311#endif /* JOB_CONTROL || HAVE_POSIX_SIGNALS */-
312-
313 /* And, some signals that are specifically ignored by the shell. */-
314 set_signal_handler (SIGQUIT, SIG_IGN);-
315-
316 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
317 {-
318 set_signal_handler (SIGINT, sigint_sighandler);-
319 get_original_signal (SIGTERM);-
320 if (signal_is_hard_ignored (SIGTERM) == 0)
signal_is_hard...ed ( 15 ) == 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-2
321 set_signal_handler (SIGTERM, sigterm_sighandler);
executed 2 times by 1 test: set_signal_handler ( 15 , sigterm_sighandler);
Executed by:
  • Self test
2
322 set_sigwinch_handler ();-
323 }
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
324}
executed 5448 times by 1 test: end of block
Executed by:
  • Self test
5448
325-
326void-
327reset_terminating_signals ()-
328{-
329 register int i;-
330#if defined (HAVE_POSIX_SIGNALS)-
331 struct sigaction act;-
332#endif-
333-
334 if (termsigs_initialized == 0)
termsigs_initialized == 0Description
TRUEevaluated 2531 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 26 times by 1 test
Evaluated by:
  • Self test
26-2531
335 return;
executed 2531 times by 1 test: return;
Executed by:
  • Self test
2531
336-
337#if defined (HAVE_POSIX_SIGNALS)-
338 act.sa_flags = 0;-
339 sigemptyset (&act.sa_mask);-
340 for (i = 0; i < TERMSIGS_LENGTH; i++)
i < (sizeof (t...ruct termsig))Description
TRUEevaluated 442 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 26 times by 1 test
Evaluated by:
  • Self test
26-442
341 {-
342 /* Skip a signal if it's trapped or handled specially, because the-
343 trap code will restore the correct value. */-
344 if (signal_is_trapped (XSIG (i)) || signal_is_special (XSIG (i)))
signal_is_trap...ls[i].signum))Description
TRUEevaluated 29 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 413 times by 1 test
Evaluated by:
  • Self test
signal_is_spec...ls[i].signum))Description
TRUEevaluated 19 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 394 times by 1 test
Evaluated by:
  • Self test
19-413
345 continue;
executed 48 times by 1 test: continue;
Executed by:
  • Self test
48
346-
347 act.sa_handler = XHANDLER (i);-
348 act.sa_flags = XSAFLAGS (i);-
349 sigaction (XSIG (i), &act, (struct sigaction *) NULL);-
350 }
executed 394 times by 1 test: end of block
Executed by:
  • Self test
394
351#else /* !HAVE_POSIX_SIGNALS */-
352 for (i = 0; i < TERMSIGS_LENGTH; i++)-
353 {-
354 if (signal_is_trapped (XSIG (i)) || signal_is_special (XSIG (i)))-
355 continue;-
356-
357 signal (XSIG (i), XHANDLER (i));-
358 }-
359#endif /* !HAVE_POSIX_SIGNALS */-
360-
361 termsigs_initialized = 0;-
362}
executed 26 times by 1 test: end of block
Executed by:
  • Self test
26
363#undef XSIG-
364#undef XHANDLER-
365-
366/* Run some of the cleanups that should be performed when we run-
367 jump_to_top_level from a builtin command context. XXX - might want to-
368 also call reset_parser here. */-
369void-
370top_level_cleanup ()-
371{-
372 /* Clean up string parser environment. */-
373 while (parse_and_execute_level)
parse_and_execute_levelDescription
TRUEnever evaluated
FALSEevaluated 388 times by 1 test
Evaluated by:
  • Self test
0-388
374 parse_and_execute_cleanup ();
never executed: parse_and_execute_cleanup ();
0
375-
376#if defined (PROCESS_SUBSTITUTION)-
377 unlink_fifo_list ();-
378#endif /* PROCESS_SUBSTITUTION */-
379-
380 run_unwind_protects ();-
381 loop_level = continuing = breaking = funcnest = 0;-
382 executing_list = comsub_ignore_return = return_catch_flag = wait_intr_flag = 0;-
383}
executed 388 times by 1 test: end of block
Executed by:
  • Self test
388
384-
385/* What to do when we've been interrupted, and it is safe to handle it. */-
386void-
387throw_to_top_level ()-
388{-
389 int print_newline = 0;-
390-
391 if (interrupt_state)
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
392 {-
393 if (last_command_exit_value < 128)
last_command_exit_value < 128Description
TRUEnever evaluated
FALSEnever evaluated
0
394 last_command_exit_value = 128 + SIGINT;
never executed: last_command_exit_value = 128 + 2 ;
0
395 print_newline = 1;-
396 DELINTERRUPT;-
397 }
never executed: end of block
0
398-
399 if (interrupt_state)
interrupt_stateDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
400 return;
never executed: return;
0
401-
402 last_command_exit_signal = (last_command_exit_value > 128) ?
(last_command_...t_value > 128)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
403 (last_command_exit_value - 128) : 0;-
404 last_command_exit_value |= 128;-
405-
406 /* Run any traps set on SIGINT, mostly for interactive shells */-
407 if (signal_is_trapped (SIGINT))
signal_is_trapped ( 2 )Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
408 run_interrupt_trap (1);
never executed: run_interrupt_trap (1);
0
409-
410 /* Clean up string parser environment. */-
411 while (parse_and_execute_level)
parse_and_execute_levelDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
412 parse_and_execute_cleanup ();
never executed: parse_and_execute_cleanup ();
0
413-
414 if (running_trap > 0)
running_trap > 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
415 run_trap_cleanup (running_trap - 1);
never executed: run_trap_cleanup (running_trap - 1);
0
416-
417#if defined (JOB_CONTROL)-
418 give_terminal_to (shell_pgrp, 0);-
419#endif /* JOB_CONTROL */-
420-
421#if defined (JOB_CONTROL) || defined (HAVE_POSIX_SIGNALS)-
422 /* This needs to stay because jobs.c:make_child() uses it without resetting-
423 the signal mask. */-
424 sigprocmask (SIG_SETMASK, &top_level_mask, (sigset_t *)NULL);-
425#endif-
426-
427 reset_parser ();-
428-
429#if defined (READLINE)-
430 if (interactive)
interactiveDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
0-1
431 bashline_reset ();
never executed: bashline_reset ();
0
432#endif /* READLINE */-
433-
434#if defined (PROCESS_SUBSTITUTION)-
435 unlink_fifo_list ();-
436#endif /* PROCESS_SUBSTITUTION */-
437-
438 run_unwind_protects ();-
439 loop_level = continuing = breaking = funcnest = 0;-
440 executing_list = comsub_ignore_return = return_catch_flag = wait_intr_flag = 0;-
441-
442 if (interactive && print_newline)
interactiveDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
print_newlineDescription
TRUEnever evaluated
FALSEnever evaluated
0-1
443 {-
444 fflush (stdout);-
445 fprintf (stderr, "\n");-
446 fflush (stderr);-
447 }
never executed: end of block
0
448-
449 /* An interrupted `wait' command in a script does not exit the script. */-
450 if (interactive || (interactive_shell && !shell_initialized) ||
interactiveDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
interactive_shellDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
!shell_initializedDescription
TRUEnever evaluated
FALSEnever evaluated
0-1
451 (print_newline && signal_is_trapped (SIGINT)))
print_newlineDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
signal_is_trapped ( 2 )Description
TRUEnever evaluated
FALSEnever evaluated
0-1
452 jump_to_top_level (DISCARD);
never executed: jump_to_top_level (2);
0
453 else-
454 jump_to_top_level (EXITPROG);
executed 1 time by 1 test: jump_to_top_level (3);
Executed by:
  • Self test
1
455}-
456-
457/* This is just here to isolate the longjmp calls. */-
458void-
459jump_to_top_level (value)-
460 int value;-
461{-
462 sh_longjmp (top_level, value);-
463}
never executed: end of block
0
464-
465sighandler-
466termsig_sighandler (sig)-
467 int sig;-
468{-
469 /* If we get called twice with the same signal before handling it,-
470 terminate right away. */-
471 if (-
472#ifdef SIGHUP-
473 sig != SIGHUP &&
sig != 1Description
TRUEnever evaluated
FALSEnever evaluated
0
474#endif-
475#ifdef SIGINT-
476 sig != SIGINT &&
sig != 2Description
TRUEnever evaluated
FALSEnever evaluated
0
477#endif-
478#ifdef SIGDANGER-
479 sig != SIGDANGER &&-
480#endif-
481#ifdef SIGPIPE-
482 sig != SIGPIPE &&
sig != 13Description
TRUEnever evaluated
FALSEnever evaluated
0
483#endif-
484#ifdef SIGALRM-
485 sig != SIGALRM &&
sig != 14Description
TRUEnever evaluated
FALSEnever evaluated
0
486#endif-
487#ifdef SIGTERM-
488 sig != SIGTERM &&
sig != 15Description
TRUEnever evaluated
FALSEnever evaluated
0
489#endif-
490#ifdef SIGXCPU-
491 sig != SIGXCPU &&
sig != 24Description
TRUEnever evaluated
FALSEnever evaluated
0
492#endif-
493#ifdef SIGXFSZ-
494 sig != SIGXFSZ &&
sig != 25Description
TRUEnever evaluated
FALSEnever evaluated
0
495#endif-
496#ifdef SIGVTALRM-
497 sig != SIGVTALRM &&
sig != 26Description
TRUEnever evaluated
FALSEnever evaluated
0
498#endif-
499#ifdef SIGLOST-
500 sig != SIGLOST &&-
501#endif-
502#ifdef SIGUSR1-
503 sig != SIGUSR1 &&
sig != 10Description
TRUEnever evaluated
FALSEnever evaluated
0
504#endif-
505#ifdef SIGUSR2-
506 sig != SIGUSR2 &&
sig != 12Description
TRUEnever evaluated
FALSEnever evaluated
0
507#endif-
508 sig == terminating_signal)
sig == terminating_signalDescription
TRUEnever evaluated
FALSEnever evaluated
0
509 terminate_immediately = 1;
never executed: terminate_immediately = 1;
0
510-
511 terminating_signal = sig;-
512-
513 /* XXX - should this also trigger when interrupt_immediately is set? */-
514 if (terminate_immediately)
terminate_immediatelyDescription
TRUEnever evaluated
FALSEnever evaluated
0
515 {-
516#if defined (HISTORY)-
517 /* XXX - will inhibit history file being written */-
518# if defined (READLINE)-
519 if (interactive_shell == 0 || interactive == 0 || (sig != SIGHUP && sig != SIGTERM) || no_line_editing || (RL_ISSTATE (RL_STATE_READCMD) == 0))
interactive_shell == 0Description
TRUEnever evaluated
FALSEnever evaluated
interactive == 0Description
TRUEnever evaluated
FALSEnever evaluated
sig != 1Description
TRUEnever evaluated
FALSEnever evaluated
sig != 15Description
TRUEnever evaluated
FALSEnever evaluated
no_line_editingDescription
TRUEnever evaluated
FALSEnever evaluated
((rl_readline_...000008)) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
520# endif-
521 history_lines_this_session = 0;
never executed: history_lines_this_session = 0;
0
522#endif-
523 terminate_immediately = 0;-
524 termsig_handler (sig);-
525 }
never executed: end of block
0
526-
527#if defined (READLINE)-
528 /* Set the event hook so readline will call it after the signal handlers-
529 finish executing, so if this interrupted character input we can get-
530 quick response. If readline is active or has modified the terminal we-
531 need to set this no matter what the signal is, though the check for-
532 RL_STATE_TERMPREPPED is possibly redundant. */-
533 if (RL_ISSTATE (RL_STATE_SIGHANDLER) || RL_ISSTATE (RL_STATE_TERMPREPPED))
(rl_readline_s...& (0x0008000))Description
TRUEnever evaluated
FALSEnever evaluated
(rl_readline_s...& (0x0000004))Description
TRUEnever evaluated
FALSEnever evaluated
0
534 bashline_set_event_hook ();
never executed: bashline_set_event_hook ();
0
535#endif-
536-
537 SIGRETURN (0);
never executed: return;
0
538}-
539-
540void-
541termsig_handler (sig)-
542 int sig;-
543{-
544 static int handling_termsig = 0;-
545-
546 /* Simple semaphore to keep this function from being executed multiple-
547 times. Since we no longer are running as a signal handler, we don't-
548 block multiple occurrences of the terminating signals while running. */-
549 if (handling_termsig)
handling_termsigDescription
TRUEnever evaluated
FALSEnever evaluated
0
550 return;
never executed: return;
0
551 handling_termsig = 1;-
552 terminating_signal = 0; /* keep macro from re-testing true. */-
553-
554 /* I don't believe this condition ever tests true. */-
555 if (sig == SIGINT && signal_is_trapped (SIGINT))
sig == 2Description
TRUEnever evaluated
FALSEnever evaluated
signal_is_trapped ( 2 )Description
TRUEnever evaluated
FALSEnever evaluated
0
556 run_interrupt_trap (0);
never executed: run_interrupt_trap (0);
0
557-
558#if defined (HISTORY)-
559 /* If we don't do something like this, the history will not be saved when-
560 an interactive shell is running in a terminal window that gets closed-
561 with the `close' button. We can't test for RL_STATE_READCMD because-
562 readline no longer handles SIGTERM synchronously. */-
563 if (interactive_shell && interactive && (sig == SIGHUP || sig == SIGTERM) && remember_on_history)
interactive_shellDescription
TRUEnever evaluated
FALSEnever evaluated
interactiveDescription
TRUEnever evaluated
FALSEnever evaluated
sig == 1Description
TRUEnever evaluated
FALSEnever evaluated
sig == 15Description
TRUEnever evaluated
FALSEnever evaluated
remember_on_historyDescription
TRUEnever evaluated
FALSEnever evaluated
0
564 maybe_save_shell_history ();
never executed: maybe_save_shell_history ();
0
565#endif /* HISTORY */-
566-
567 if (this_shell_builtin == read_builtin)
this_shell_bui...= read_builtinDescription
TRUEnever evaluated
FALSEnever evaluated
0
568 read_tty_cleanup ();
never executed: read_tty_cleanup ();
0
569-
570#if defined (JOB_CONTROL)-
571 if (sig == SIGHUP && (interactive || (subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB))))
sig == 1Description
TRUEnever evaluated
FALSEnever evaluated
interactiveDescription
TRUEnever evaluated
FALSEnever evaluated
(subshell_envi...& (0x04|0x20))Description
TRUEnever evaluated
FALSEnever evaluated
0
572 hangup_all_jobs ();
never executed: hangup_all_jobs ();
0
573 if ((subshell_environment & (SUBSHELL_COMSUB|SUBSHELL_PROCSUB)) == 0)
(subshell_envi...04|0x20)) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
574 end_job_control ();
never executed: end_job_control ();
0
575#endif /* JOB_CONTROL */-
576-
577#if defined (PROCESS_SUBSTITUTION)-
578 unlink_fifo_list ();-
579#endif /* PROCESS_SUBSTITUTION */-
580-
581 /* Reset execution context */-
582 loop_level = continuing = breaking = funcnest = 0;-
583 executing_list = comsub_ignore_return = return_catch_flag = wait_intr_flag = 0;-
584-
585 run_exit_trap (); /* XXX - run exit trap possibly in signal context? */-
586 set_signal_handler (sig, SIG_DFL);-
587 kill (getpid (), sig);-
588-
589 exit (1); /* just in case the kill fails? */
never executed: exit (1);
0
590}-
591-
592/* What we really do when SIGINT occurs. */-
593sighandler-
594sigint_sighandler (sig)-
595 int sig;-
596{-
597#if defined (MUST_REINSTALL_SIGHANDLERS)-
598 signal (sig, sigint_sighandler);-
599#endif-
600-
601 /* interrupt_state needs to be set for the stack of interrupts to work-
602 right. Should it be set unconditionally? */-
603 if (interrupt_state == 0)
interrupt_state == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
604 ADDINTERRUPT;
never executed: interrupt_state++;
0
605-
606 /* We will get here in interactive shells with job control active; allow-
607 an interactive wait to be interrupted. wait_intr_flag is only set during-
608 the execution of the wait builtin and when wait_intr_buf is valid. */-
609 if (wait_intr_flag)
wait_intr_flagDescription
TRUEnever evaluated
FALSEnever evaluated
0
610 {-
611 last_command_exit_value = 128 + sig;-
612 wait_signal_received = sig;-
613 SIGRETURN (0);
never executed: return;
0
614 }-
615 -
616 if (interrupt_immediately)
interrupt_immediatelyDescription
TRUEnever evaluated
FALSEnever evaluated
0
617 {-
618 interrupt_immediately = 0;-
619 last_command_exit_value = 128 + sig;-
620 throw_to_top_level ();-
621 }
never executed: end of block
0
622#if defined (READLINE)-
623 /* Set the event hook so readline will call it after the signal handlers-
624 finish executing, so if this interrupted character input we can get-
625 quick response. */-
626 else if (RL_ISSTATE (RL_STATE_SIGHANDLER))
(rl_readline_s...& (0x0008000))Description
TRUEnever evaluated
FALSEnever evaluated
0
627 bashline_set_event_hook ();
never executed: bashline_set_event_hook ();
0
628#endif-
629-
630 SIGRETURN (0);
never executed: return;
0
631}-
632-
633#if defined (SIGWINCH)-
634sighandler-
635sigwinch_sighandler (sig)-
636 int sig;-
637{-
638#if defined (MUST_REINSTALL_SIGHANDLERS)-
639 set_signal_handler (SIGWINCH, sigwinch_sighandler);-
640#endif /* MUST_REINSTALL_SIGHANDLERS */-
641 sigwinch_received = 1;-
642 SIGRETURN (0);
never executed: return;
0
643}-
644#endif /* SIGWINCH */-
645-
646void-
647set_sigwinch_handler ()-
648{-
649#if defined (SIGWINCH)-
650 old_winch = set_signal_handler (SIGWINCH, sigwinch_sighandler);-
651#endif-
652}
executed 2 times by 1 test: end of block
Executed by:
  • Self test
2
653-
654void-
655unset_sigwinch_handler ()-
656{-
657#if defined (SIGWINCH)-
658 set_signal_handler (SIGWINCH, old_winch);-
659#endif-
660}
never executed: end of block
0
661-
662sighandler-
663sigterm_sighandler (sig)-
664 int sig;-
665{-
666 sigterm_received = 1; /* XXX - counter? */-
667 SIGRETURN (0);
never executed: return;
0
668}-
669-
670/* Signal functions used by the rest of the code. */-
671#if !defined (HAVE_POSIX_SIGNALS)-
672-
673/* Perform OPERATION on NEWSET, perhaps leaving information in OLDSET. */-
674sigprocmask (operation, newset, oldset)-
675 int operation, *newset, *oldset;-
676{-
677 int old, new;-
678-
679 if (newset)-
680 new = *newset;-
681 else-
682 new = 0;-
683-
684 switch (operation)-
685 {-
686 case SIG_BLOCK:-
687 old = sigblock (new);-
688 break;-
689-
690 case SIG_SETMASK:-
691 old = sigsetmask (new);-
692 break;-
693-
694 default:-
695 internal_error (_("sigprocmask: %d: invalid operation"), operation);-
696 }-
697-
698 if (oldset)-
699 *oldset = old;-
700}-
701-
702#else-
703-
704#if !defined (SA_INTERRUPT)-
705# define SA_INTERRUPT 0-
706#endif-
707-
708#if !defined (SA_RESTART)-
709# define SA_RESTART 0-
710#endif-
711-
712SigHandler *-
713set_signal_handler (sig, handler)-
714 int sig;-
715 SigHandler *handler;-
716{-
717 struct sigaction act, oact;-
718-
719 act.sa_handler = handler;-
720 act.sa_flags = 0;-
721-
722 /* XXX - bash-4.2 */-
723 /* We don't want a child death to interrupt interruptible system calls, even-
724 if we take the time to reap children */-
725#if defined (SIGCHLD)-
726 if (sig == SIGCHLD)
sig == 17Description
TRUEevaluated 3960800 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 6696639 times by 1 test
Evaluated by:
  • Self test
3960800-6696639
727 act.sa_flags |= SA_RESTART; /* XXX */
executed 3960800 times by 1 test: act.sa_flags |= 0x10000000 ;
Executed by:
  • Self test
3960800
728#endif-
729 /* XXX - bash-5.0 */-
730 /* Let's see if we can keep SIGWINCH from interrupting interruptible system-
731 calls, like open(2)/read(2)/write(2) */-
732#if defined (SIGWINCH)-
733 if (sig == SIGWINCH)
sig == 28Description
TRUEevaluated 24 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10657415 times by 1 test
Evaluated by:
  • Self test
24-10657415
734 act.sa_flags |= SA_RESTART; /* XXX */
executed 24 times by 1 test: act.sa_flags |= 0x10000000 ;
Executed by:
  • Self test
24
735#endif-
736 /* If we're installing a SIGTERM handler for interactive shells, we want-
737 it to be as close to SIG_IGN as possible. */-
738 if (sig == SIGTERM && handler == sigterm_sighandler)
sig == 15Description
TRUEevaluated 67 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 10657372 times by 1 test
Evaluated by:
  • Self test
handler == sigterm_sighandlerDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 65 times by 1 test
Evaluated by:
  • Self test
2-10657372
739 act.sa_flags |= SA_RESTART; /* XXX */
executed 2 times by 1 test: act.sa_flags |= 0x10000000 ;
Executed by:
  • Self test
2
740-
741 sigemptyset (&act.sa_mask);-
742 sigemptyset (&oact.sa_mask);-
743 if (sigaction (sig, &act, &oact) == 0)
sigaction (sig...t, &oact) == 0Description
TRUEevaluated 10657351 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 88 times by 1 test
Evaluated by:
  • Self test
88-10657351
744 return (oact.sa_handler);
executed 10657351 times by 1 test: return (oact. __sigaction_handler.sa_handler );
Executed by:
  • Self test
10657351
745 else-
746 return (SIG_DFL);
executed 88 times by 1 test: return ( ((__sighandler_t) 0) );
Executed by:
  • Self test
88
747}-
748#endif /* HAVE_POSIX_SIGNALS */-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2