OpenCoverage

jobs.def

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/builtins/jobs.def
Source codeSwitch to Preprocessed file
LineSourceCount
1This file is jobs.def, from which is created jobs.c.-
2It implements the builtins "jobs" and "disown" in Bash.-
3-
4Copyright (C) 1987-2015 Free Software Foundation, Inc.-
5-
6This file is part of GNU Bash, the Bourne Again SHell.-
7-
8Bash is free software: you can redistribute it and/or modify-
9it under the terms of the GNU General Public License as published by-
10the Free Software Foundation, either version 3 of the License, or-
11(at your option) any later version.-
12-
13Bash is distributed in the hope that it will be useful,-
14but WITHOUT ANY WARRANTY; without even the implied warranty of-
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
16GNU General Public License for more details.-
17-
18You should have received a copy of the GNU General Public License-
19along with Bash. If not, see <http://www.gnu.org/licenses/>.-
20-
21$PRODUCES jobs.c-
22-
23$BUILTIN jobs-
24$FUNCTION jobs_builtin-
25$DEPENDS_ON JOB_CONTROL-
26$SHORT_DOC jobs [-lnprs] [jobspec ...] or jobs -x command [args]-
27Display status of jobs.-
28-
29Lists the active jobs. JOBSPEC restricts output to that job.-
30Without options, the status of all active jobs is displayed.-
31-
32Options:-
33 -l lists process IDs in addition to the normal information-
34 -n lists only processes that have changed status since the last-
35 notification-
36 -p lists process IDs only-
37 -r restrict output to running jobs-
38 -s restrict output to stopped jobs-
39-
40If -x is supplied, COMMAND is run after all job specifications that-
41appear in ARGS have been replaced with the process ID of that job's-
42process group leader.-
43-
44Exit Status:-
45Returns success unless an invalid option is given or an error occurs.-
46If -x is used, returns the exit status of COMMAND.-
47$END-
48-
49#include <config.h>-
50-
51#if defined (JOB_CONTROL)-
52#include "../bashtypes.h"-
53#include <signal.h>-
54#if defined (HAVE_UNISTD_H)-
55# include <unistd.h>-
56#endif-
57-
58#include "../bashansi.h"-
59#include "../bashintl.h"-
60-
61#include "../shell.h"-
62#include "../jobs.h"-
63#include "../execute_cmd.h"-
64#include "bashgetopt.h"-
65#include "common.h"-
66-
67#define JSTATE_ANY 0x0-
68#define JSTATE_RUNNING 0x1-
69#define JSTATE_STOPPED 0x2-
70-
71static int execute_list_with_replacements __P((WORD_LIST *));-
72-
73/* The `jobs' command. Prints outs a list of active jobs. If the-
74 argument `-l' is given, then the process id's are printed also.-
75 If the argument `-p' is given, print the process group leader's-
76 pid only. If `-n' is given, only processes that have changed-
77 status since the last notification are printed. If -x is given,-
78 replace all job specs with the pid of the appropriate process-
79 group leader and execute the command. The -r and -s options mean-
80 to print info about running and stopped jobs only, respectively. */-
81int-
82jobs_builtin (list)-
83 WORD_LIST *list;-
84{-
85 int form, execute, state, opt, any_failed, job;-
86 sigset_t set, oset;-
87-
88 execute = any_failed = 0;-
89 form = JLIST_STANDARD;-
90 state = JSTATE_ANY;-
91-
92 reset_internal_getopt ();-
93 while ((opt = internal_getopt (list, "lpnxrs")) != -1)
(opt = interna...pnxrs")) != -1Description
TRUEevaluated 9 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 19 times by 1 test
Evaluated by:
  • Self test
9-19
94 {-
95 switch (opt)-
96 {-
97 case 'l':
never executed: case 'l':
0
98 form = JLIST_LONG;-
99 break;
never executed: break;
0
100 case 'p':
executed 2 times by 1 test: case 'p':
Executed by:
  • Self test
2
101 form = JLIST_PID_ONLY;-
102 break;
executed 2 times by 1 test: break;
Executed by:
  • Self test
2
103 case 'n':
never executed: case 'n':
0
104 form = JLIST_CHANGED_ONLY;-
105 break;
never executed: break;
0
106 case 'x':
never executed: case 'x':
0
107 if (form != JLIST_STANDARD)
form != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
108 {-
109 builtin_error (_("no other options allowed with `-x'"));-
110 return (EXECUTION_FAILURE);
never executed: return (1);
0
111 }-
112 execute++;-
113 break;
never executed: break;
0
114 case 'r':
executed 4 times by 1 test: case 'r':
Executed by:
  • Self test
4
115 state = JSTATE_RUNNING;-
116 break;
executed 4 times by 1 test: break;
Executed by:
  • Self test
4
117 case 's':
executed 3 times by 1 test: case 's':
Executed by:
  • Self test
3
118 state = JSTATE_STOPPED;-
119 break;
executed 3 times by 1 test: break;
Executed by:
  • Self test
3
120-
121 CASE_HELPOPT;
never executed: return (258);
never executed: case -99:
0
122 default:
never executed: default:
0
123 builtin_usage ();-
124 return (EX_USAGE);
never executed: return (258);
0
125 }-
126 }-
127-
128 list = loptend;-
129-
130 if (execute)
executeDescription
TRUEnever evaluated
FALSEevaluated 19 times by 1 test
Evaluated by:
  • Self test
0-19
131 return (execute_list_with_replacements (list));
never executed: return (execute_list_with_replacements (list));
0
132-
133 if (!list)
!listDescription
TRUEevaluated 14 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5-14
134 {-
135 switch (state)-
136 {-
137 case JSTATE_ANY:
executed 7 times by 1 test: case 0x0:
Executed by:
  • Self test
7
138 list_all_jobs (form);-
139 break;
executed 7 times by 1 test: break;
Executed by:
  • Self test
7
140 case JSTATE_RUNNING:
executed 4 times by 1 test: case 0x1:
Executed by:
  • Self test
4
141 list_running_jobs (form);-
142 break;
executed 4 times by 1 test: break;
Executed by:
  • Self test
4
143 case JSTATE_STOPPED:
executed 3 times by 1 test: case 0x2:
Executed by:
  • Self test
3
144 list_stopped_jobs (form);-
145 break;
executed 3 times by 1 test: break;
Executed by:
  • Self test
3
146 }-
147 return (EXECUTION_SUCCESS);
executed 14 times by 1 test: return (0);
Executed by:
  • Self test
14
148 }-
149-
150 while (list)
listDescription
TRUEevaluated 5 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
5
151 {-
152 BLOCK_CHILD (set, oset);-
153 job = get_job_spec (list);-
154-
155 if ((job == NO_JOB) || jobs == 0 || get_job_by_jid (job) == 0)
(job == -1)Description
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
jobs == 0Description
TRUEnever evaluated
FALSEevaluated 5 times by 1 test
Evaluated by:
  • Self test
(jobs[(job)]) == 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 4 times by 1 test
Evaluated by:
  • Self test
0-5
156 {-
157 sh_badjob (list->word->word);-
158 any_failed++;-
159 }
executed 1 time by 1 test: end of block
Executed by:
  • Self test
1
160 else if (job != DUP_JOB)
job != -2Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-4
161 list_one_job ((JOB *)NULL, form, 0, job);
executed 4 times by 1 test: list_one_job ((JOB *) ((void *)0) , form, 0, job);
Executed by:
  • Self test
4
162-
163 UNBLOCK_CHILD (oset);-
164 list = list->next;-
165 }
executed 5 times by 1 test: end of block
Executed by:
  • Self test
5
166 return (any_failed ? EXECUTION_FAILURE : EXECUTION_SUCCESS);
executed 5 times by 1 test: return (any_failed ? 1 : 0);
Executed by:
  • Self test
5
167}-
168-
169static int-
170execute_list_with_replacements (list)-
171 WORD_LIST *list;-
172{-
173 register WORD_LIST *l;-
174 int job, result;-
175 COMMAND *command;-
176 JOB *j;-
177-
178 /* First do the replacement of job specifications with pids. */-
179 for (l = list; l; l = l->next)
lDescription
TRUEnever evaluated
FALSEnever evaluated
0
180 {-
181 if (l->word->word[0] == '%') /* we have a winner */
l->word->word[0] == '%'Description
TRUEnever evaluated
FALSEnever evaluated
0
182 {-
183 job = get_job_spec (l);-
184-
185 /* A bad job spec is not really a job spec! Pass it through. */-
186 if (INVALID_JOB (job))
(job) < 0Description
TRUEnever evaluated
FALSEnever evaluated
(job) >= js.j_jobslotsDescription
TRUEnever evaluated
FALSEnever evaluated
(jobs[(job)]) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
187 continue;
never executed: continue;
0
188-
189 j = get_job_by_jid (job);-
190 free (l->word->word);-
191 l->word->word = itos (j->pgrp);-
192 }
never executed: end of block
0
193 }
never executed: end of block
0
194-
195 /* Next make a new simple command and execute it. */-
196 begin_unwind_frame ("jobs_builtin");-
197-
198 command = make_bare_simple_command ();-
199 command->value.Simple->words = copy_word_list (list);-
200 command->value.Simple->redirects = (REDIRECT *)NULL;-
201 command->flags |= CMD_INHIBIT_EXPANSION;-
202 command->value.Simple->flags |= CMD_INHIBIT_EXPANSION;-
203-
204 add_unwind_protect (dispose_command, command);-
205 result = execute_command (command);-
206 dispose_command (command);-
207-
208 discard_unwind_frame ("jobs_builtin");-
209 return (result);
never executed: return (result);
0
210}-
211#endif /* JOB_CONTROL */-
212-
213$BUILTIN disown-
214$FUNCTION disown_builtin-
215$DEPENDS_ON JOB_CONTROL-
216$SHORT_DOC disown [-h] [-ar] [jobspec ... | pid ...]-
217Remove jobs from current shell.-
218-
219Removes each JOBSPEC argument from the table of active jobs. Without-
220any JOBSPECs, the shell uses its notion of the current job.-
221-
222Options:-
223 -a remove all jobs if JOBSPEC is not supplied-
224 -h mark each JOBSPEC so that SIGHUP is not sent to the job if the-
225 shell receives a SIGHUP-
226 -r remove only running jobs-
227-
228Exit Status:-
229Returns success unless an invalid option or JOBSPEC is given.-
230$END-
231-
232#if defined (JOB_CONTROL)-
233int-
234disown_builtin (list)-
235 WORD_LIST *list;-
236{-
237 int opt, job, retval, nohup_only, running_jobs, all_jobs;-
238 sigset_t set, oset;-
239 intmax_t pid_value;-
240-
241 nohup_only = running_jobs = all_jobs = 0;-
242 reset_internal_getopt ();-
243 while ((opt = internal_getopt (list, "ahr")) != -1)
(opt = interna... "ahr")) != -1Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
4-8
244 {-
245 switch (opt)-
246 {-
247 case 'a':
never executed: case 'a':
0
248 all_jobs = 1;-
249 break;
never executed: break;
0
250 case 'h':
executed 1 time by 1 test: case 'h':
Executed by:
  • Self test
1
251 nohup_only = 1;-
252 break;
executed 1 time by 1 test: break;
Executed by:
  • Self test
1
253 case 'r':
never executed: case 'r':
0
254 running_jobs = 1;-
255 break;
never executed: break;
0
256 CASE_HELPOPT;
never executed: return (258);
never executed: case -99:
0
257 default:
executed 3 times by 1 test: default:
Executed by:
  • Self test
3
258 builtin_usage ();-
259 return (EX_USAGE);
executed 3 times by 1 test: return (258);
Executed by:
  • Self test
3
260 }-
261 }-
262 list = loptend;-
263 retval = EXECUTION_SUCCESS;-
264-
265 /* `disown -a' or `disown -r' */-
266 if (list == 0 && (all_jobs || running_jobs))
list == 0Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
all_jobsDescription
TRUEnever evaluated
FALSEnever evaluated
running_jobsDescription
TRUEnever evaluated
FALSEnever evaluated
0-8
267 {-
268 if (nohup_only)
nohup_onlyDescription
TRUEnever evaluated
FALSEnever evaluated
0
269 nohup_all_jobs (running_jobs);
never executed: nohup_all_jobs (running_jobs);
0
270 else-
271 delete_all_jobs (running_jobs);
never executed: delete_all_jobs (running_jobs);
0
272 return (EXECUTION_SUCCESS);
never executed: return (0);
0
273 }-
274-
275 do-
276 {-
277 BLOCK_CHILD (set, oset);-
278 job = (list && legal_number (list->word->word, &pid_value) && pid_value == (pid_t) pid_value)
listDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
legal_number (...d, &pid_value)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
pid_value == (pid_t) pid_valueDescription
TRUEnever evaluated
FALSEnever evaluated
0-8
279 ? get_job_by_pid ((pid_t) pid_value, 0)-
280 : get_job_spec (list);-
281-
282 if (job == NO_JOB || jobs == 0 || INVALID_JOB (job))
job == -1Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
jobs == 0Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
(job) < 0Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
(job) >= js.j_jobslotsDescription
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
(jobs[(job)]) == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-8
283 {-
284 sh_badjob (list ? list->word->word : _("current"));-
285 retval = EXECUTION_FAILURE;-
286 }
executed 6 times by 1 test: end of block
Executed by:
  • Self test
6
287 else if (nohup_only)
nohup_onlyDescription
TRUEevaluated 1 time by 1 test
Evaluated by:
  • Self test
FALSEevaluated 1 time by 1 test
Evaluated by:
  • Self test
1
288 nohup_job (job);
executed 1 time by 1 test: nohup_job (job);
Executed by:
  • Self test
1
289 else-
290 delete_job (job, 1);
executed 1 time by 1 test: delete_job (job, 1);
Executed by:
  • Self test
1
291 UNBLOCK_CHILD (oset);-
292-
293 if (list)
listDescription
TRUEevaluated 8 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-8
294 list = list->next;
executed 8 times by 1 test: list = list->next;
Executed by:
  • Self test
8
295 }
executed 8 times by 1 test: end of block
Executed by:
  • Self test
8
296 while (list);
listDescription
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
0-8
297-
298 return (retval);
executed 8 times by 1 test: return (retval);
Executed by:
  • Self test
8
299}-
300#endif /* JOB_CONTROL */-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2