Commit | Line | Data |
---|---|---|
98295de1 KB |
1 | /* |
2 | * Copyright (c) 1988 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms are permitted | |
6 | * provided that the above copyright notice and this paragraph are | |
7 | * duplicated in all such forms and that any documentation, | |
8 | * advertising materials, and other materials related to such | |
9 | * distribution and use acknowledge that the software was developed | |
10 | * by the University of California, Berkeley. The name of the | |
11 | * University may not be used to endorse or promote products derived | |
12 | * from this software without specific prior written permission. | |
13 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR | |
14 | * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED | |
15 | * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. | |
16 | */ | |
17 | ||
2ce81398 | 18 | #if defined(LIBC_SCCS) && !defined(lint) |
f357e0f1 | 19 | static char sccsid[] = "@(#)system.c 5.7 (Berkeley) %G%"; |
98295de1 | 20 | #endif /* LIBC_SCCS and not lint */ |
b8f253e8 | 21 | |
4d506f35 | 22 | #include <sys/types.h> |
98295de1 KB |
23 | #include <sys/wait.h> |
24 | #include <sys/signal.h> | |
f357e0f1 | 25 | #include <stddef.h> |
a2f3a875 | 26 | #include <paths.h> |
a59df51f | 27 | |
98295de1 KB |
28 | system(command) |
29 | char *command; | |
a59df51f | 30 | { |
4d506f35 KB |
31 | union wait pstat; |
32 | pid_t pid, waitpid(); | |
a2f3a875 KB |
33 | int omask; |
34 | sig_t intsave, quitsave; | |
a59df51f | 35 | |
f357e0f1 KB |
36 | if (!command) /* just checking... */ |
37 | return(1); | |
38 | ||
db505a5a | 39 | omask = sigblock(sigmask(SIGCHLD)); |
98295de1 KB |
40 | switch(pid = vfork()) { |
41 | case -1: /* error */ | |
db505a5a | 42 | (void)sigsetmask(omask); |
4d506f35 KB |
43 | pstat.w_status = 0; |
44 | pstat.w_retcode = 127; | |
45 | return(pstat.w_status); | |
98295de1 | 46 | case 0: /* child */ |
db505a5a | 47 | (void)sigsetmask(omask); |
a2f3a875 | 48 | execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL); |
a59df51f BJ |
49 | _exit(127); |
50 | } | |
a2f3a875 KB |
51 | intsave = signal(SIGINT, SIG_IGN); |
52 | quitsave = signal(SIGQUIT, SIG_IGN); | |
4d506f35 KB |
53 | pid = waitpid(pid, &pstat, 0); |
54 | (void)sigsetmask(omask); | |
a2f3a875 KB |
55 | (void)signal(SIGINT, intsave); |
56 | (void)signal(SIGQUIT, quitsave); | |
4d506f35 | 57 | return(pid == -1 ? -1 : pstat.w_status); |
a59df51f | 58 | } |