66 * modification, are permitted provided that the following conditions
77 * are met:
88 * 1. Redistributions of source code must retain the above copyright
9- * notice, this list of conditions and the following disclaimer.
9+ * notice, this list of conditions and the following disclaimer.
1010 * 2. Redistributions in binary form must reproduce the above copyright
11- * notice, this list of conditions and the following disclaimer in the
12- * documentation and/or other materials provided with the distribution.
11+ * notice, this list of conditions and the following disclaimer in the
12+ * documentation and/or other materials provided with the distribution.
1313 * 3. All advertising materials mentioning features or use of this software
14- * must display the following acknowledgement:
14+ * must display the following acknowledgement:
1515 *This product includes software developed by the University of
1616 *California, Berkeley and its contributors.
1717 * 4. Neither the name of the University nor the names of its contributors
18- * may be used to endorse or promote products derived from this software
19- * without specific prior written permission.
18+ * may be used to endorse or promote products derived from this software
19+ * without specific prior written permission.
2020 *
2121 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2222 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2323 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24- * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2525 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2626 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2727 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3535
3636#if defined(LIBC_SCCS )&& !defined(lint )
3737static char sccsid []= "@(#)system.c8.1 (Berkeley) 6/4/93" ;
38- #endif /* LIBC_SCCS and not lint */
38+ #endif /* LIBC_SCCS and not lint */
3939
4040#include <sys/types.h>
4141#include <sys/wait.h>
@@ -46,51 +46,57 @@ static char sccsid[] = "@(#)system.c8.1 (Berkeley) 6/4/93";
4646#include <paths.h>
4747#include <errno.h>
4848
49- int system (const char * command );
49+ int system (const char * command );
5050
5151int
5252system (const char * command )
5353{
54- pid_t pid ;
55- int pstat ;
56- struct sigaction ign ,intact ,quitact ;
57- sigset_t newsigblock ,oldsigblock ;
54+ pid_t pid ;
55+ int pstat ;
56+ struct sigaction ign ,
57+ intact ,
58+ quitact ;
59+ sigset_t newsigblock ,
60+ oldsigblock ;
5861
59- if (!command )/* just checking... */
60- return (1 );
62+ if (!command )/* just checking... */
63+ return (1 );
6164
6265/*
63- * Ignore SIGINT and SIGQUIT, block SIGCHLD. Remember to save
64- *existing signal dispositions.
66+ * Ignore SIGINT and SIGQUIT, block SIGCHLD. Remember to save existing
67+ * signal dispositions.
6568 */
6669ign .sa_handler = SIG_IGN ;
67- (void )sigemptyset (& ign .sa_mask );
70+ (void )sigemptyset (& ign .sa_mask );
6871ign .sa_flags = 0 ;
69- (void )sigaction (SIGINT ,& ign ,& intact );
70- (void )sigaction (SIGQUIT ,& ign ,& quitact );
71- (void )sigemptyset (& newsigblock );
72- (void )sigaddset (& newsigblock ,SIGCHLD );
73- (void )sigprocmask (SIG_BLOCK ,& newsigblock ,& oldsigblock );
74- switch (pid = fork ()) {
75- case -1 :/* error */
76- break ;
77- case 0 :/* child */
78- /*
79- * Restore original signal dispositions and exec the command.
80- */
81- (void )sigaction (SIGINT ,& intact ,NULL );
82- (void )sigaction (SIGQUIT ,& quitact ,NULL );
83- (void )sigprocmask (SIG_SETMASK ,& oldsigblock ,NULL );
84- execl (_PATH_BSHELL ,"sh" ,"-c" ,command , (char * )NULL );
85- _exit (127 );
86- default :/* parent */
87- do {
88- pid = wait4 (pid ,& pstat ,0 , (struct rusage * )0 );
89- }while (pid == -1 && errno == EINTR );
90- break ;
72+ (void )sigaction (SIGINT ,& ign ,& intact );
73+ (void )sigaction (SIGQUIT ,& ign ,& quitact );
74+ (void )sigemptyset (& newsigblock );
75+ (void )sigaddset (& newsigblock ,SIGCHLD );
76+ (void )sigprocmask (SIG_BLOCK ,& newsigblock ,& oldsigblock );
77+ switch (pid = fork ())
78+ {
79+ case -1 :/* error */
80+ break ;
81+ case 0 :/* child */
82+
83+ /*
84+ * Restore original signal dispositions and exec the command.
85+ */
86+ (void )sigaction (SIGINT ,& intact ,NULL );
87+ (void )sigaction (SIGQUIT ,& quitact ,NULL );
88+ (void )sigprocmask (SIG_SETMASK ,& oldsigblock ,NULL );
89+ execl (_PATH_BSHELL ,"sh" ,"-c" ,command , (char * )NULL );
90+ _exit (127 );
91+ default :/* parent */
92+ do
93+ {
94+ pid = wait4 (pid ,& pstat ,0 , (struct rusage * )0 );
95+ }while (pid == -1 && errno == EINTR );
96+ break ;
9197}
92- (void )sigaction (SIGINT ,& intact ,NULL );
93- (void )sigaction (SIGQUIT ,& quitact ,NULL );
94- (void )sigprocmask (SIG_SETMASK ,& oldsigblock ,NULL );
95- return (pid == -1 ?-1 :pstat );
98+ (void )sigaction (SIGINT ,& intact ,NULL );
99+ (void )sigaction (SIGQUIT ,& quitact ,NULL );
100+ (void )sigprocmask (SIG_SETMASK ,& oldsigblock ,NULL );
101+ return (pid == -1 ?-1 :pstat );
96102}