Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/bash/src/builtins/suspend.def |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||
---|---|---|---|---|---|---|---|---|
1 | This file is suspend.def, from which is created suspend.c. | - | ||||||
2 | It implements the builtin "suspend" in Bash. | - | ||||||
3 | - | |||||||
4 | Copyright (C) 1987-2015 Free Software Foundation, Inc. | - | ||||||
5 | - | |||||||
6 | This file is part of GNU Bash, the Bourne Again SHell. | - | ||||||
7 | - | |||||||
8 | Bash is free software: you can redistribute it and/or modify | - | ||||||
9 | it under the terms of the GNU General Public License as published by | - | ||||||
10 | the Free Software Foundation, either version 3 of the License, or | - | ||||||
11 | (at your option) any later version. | - | ||||||
12 | - | |||||||
13 | Bash is distributed in the hope that it will be useful, | - | ||||||
14 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||
16 | GNU General Public License for more details. | - | ||||||
17 | - | |||||||
18 | You should have received a copy of the GNU General Public License | - | ||||||
19 | along with Bash. If not, see <http://www.gnu.org/licenses/>. | - | ||||||
20 | - | |||||||
21 | $PRODUCES suspend.c | - | ||||||
22 | - | |||||||
23 | $BUILTIN suspend | - | ||||||
24 | $DEPENDS_ON JOB_CONTROL | - | ||||||
25 | $FUNCTION suspend_builtin | - | ||||||
26 | $SHORT_DOC suspend [-f] | - | ||||||
27 | Suspend shell execution. | - | ||||||
28 | - | |||||||
29 | Suspend the execution of this shell until it receives a SIGCONT signal. | - | ||||||
30 | Unless forced, login shells cannot be suspended. | - | ||||||
31 | - | |||||||
32 | Options: | - | ||||||
33 | -f force the suspend, even if the shell is a login shell | - | ||||||
34 | - | |||||||
35 | Exit Status: | - | ||||||
36 | Returns success unless job control is not enabled or an error occurs. | - | ||||||
37 | $END | - | ||||||
38 | - | |||||||
39 | #include <config.h> | - | ||||||
40 | - | |||||||
41 | #if defined (JOB_CONTROL) | - | ||||||
42 | #if defined (HAVE_UNISTD_H) | - | ||||||
43 | # ifdef _MINIX | - | ||||||
44 | # include <sys/types.h> | - | ||||||
45 | # endif | - | ||||||
46 | # include <unistd.h> | - | ||||||
47 | #endif | - | ||||||
48 | - | |||||||
49 | #include "../bashtypes.h" | - | ||||||
50 | #include <signal.h> | - | ||||||
51 | #include "../bashintl.h" | - | ||||||
52 | #include "../shell.h" | - | ||||||
53 | #include "../jobs.h" | - | ||||||
54 | #include "common.h" | - | ||||||
55 | #include "bashgetopt.h" | - | ||||||
56 | - | |||||||
57 | static sighandler suspend_continue __P((int)); | - | ||||||
58 | - | |||||||
59 | static SigHandler *old_cont; | - | ||||||
60 | #if 0 | - | ||||||
61 | static SigHandler *old_stop; | - | ||||||
62 | #endif | - | ||||||
63 | - | |||||||
64 | /* Continue handler. */ | - | ||||||
65 | static sighandler | - | ||||||
66 | suspend_continue (sig) | - | ||||||
67 | int sig; | - | ||||||
68 | { | - | ||||||
69 | set_signal_handler (SIGCONT, old_cont); | - | ||||||
70 | #if 0 | - | ||||||
71 | set_signal_handler (SIGSTOP, old_stop); | - | ||||||
72 | #endif | - | ||||||
73 | SIGRETURN (0); never executed: return; | 0 | ||||||
74 | } | - | ||||||
75 | - | |||||||
76 | /* Suspending the shell. If -f is the arg, then do the suspend | - | ||||||
77 | no matter what. Otherwise, complain if a login shell. */ | - | ||||||
78 | int | - | ||||||
79 | suspend_builtin (list) | - | ||||||
80 | WORD_LIST *list; | - | ||||||
81 | { | - | ||||||
82 | int opt, force; | - | ||||||
83 | - | |||||||
84 | reset_internal_getopt (); | - | ||||||
85 | force = 0; | - | ||||||
86 | while ((opt = internal_getopt (list, "f")) != -1)
| 0 | ||||||
87 | switch (opt) | - | ||||||
88 | { | - | ||||||
89 | case 'f': never executed: case 'f': | 0 | ||||||
90 | force++; | - | ||||||
91 | break; never executed: break; | 0 | ||||||
92 | CASE_HELPOPT; never executed: return (258); never executed: case -99: | 0 | ||||||
93 | default: never executed: default: | 0 | ||||||
94 | builtin_usage (); | - | ||||||
95 | return (EX_USAGE); never executed: return (258); | 0 | ||||||
96 | } | - | ||||||
97 | - | |||||||
98 | list = loptend; | - | ||||||
99 | - | |||||||
100 | if (job_control == 0)
| 0 | ||||||
101 | { | - | ||||||
102 | sh_nojobs (_("cannot suspend")); | - | ||||||
103 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||
104 | } | - | ||||||
105 | - | |||||||
106 | if (force == 0)
| 0 | ||||||
107 | { | - | ||||||
108 | no_args (list); | - | ||||||
109 | - | |||||||
110 | if (login_shell)
| 0 | ||||||
111 | { | - | ||||||
112 | builtin_error (_("cannot suspend a login shell")); | - | ||||||
113 | return (EXECUTION_FAILURE); never executed: return (1); | 0 | ||||||
114 | } | - | ||||||
115 | } never executed: end of block | 0 | ||||||
116 | - | |||||||
117 | /* XXX - should we put ourselves back into the original pgrp now? If so, | - | ||||||
118 | call end_job_control() here and do the right thing in suspend_continue | - | ||||||
119 | (that is, call restart_job_control()). */ | - | ||||||
120 | old_cont = (SigHandler *)set_signal_handler (SIGCONT, suspend_continue); | - | ||||||
121 | #if 0 | - | ||||||
122 | old_stop = (SigHandler *)set_signal_handler (SIGSTOP, SIG_DFL); | - | ||||||
123 | #endif | - | ||||||
124 | killpg (shell_pgrp, SIGSTOP); | - | ||||||
125 | return (EXECUTION_SUCCESS); never executed: return (0); | 0 | ||||||
126 | } | - | ||||||
127 | - | |||||||
128 | #endif /* JOB_CONTROL */ | - | ||||||
Source code | Switch to Preprocessed file |