from the ANSI standard
[unix-history] / usr / src / lib / libc / stdlib / system.c
CommitLineData
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 19static 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
28system(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}