--- system.c.orig 2003-05-20 15:23:25.000000000 -0700 +++ system.c 2006-06-24 18:48:47.000000000 -0700 @@ -49,6 +49,16 @@ #include "un-namespace.h" #include "libc_private.h" +#if __DARWIN_UNIX03 +#include <pthread.h> + +static pthread_mutex_t __systemfn_mutex = PTHREAD_MUTEX_INITIALIZER; +extern int __unix_conforming; +#ifdef VARIANT_CANCELABLE +extern void _pthread_testcancel(pthread_t thread, int isconforming); +#endif /* VARIANT_CANCELABLE */ +#endif /* __DARWIN_UNIX03 */ + int __system(command) const char *command; @@ -58,9 +68,24 @@ struct sigaction ign, intact, quitact; sigset_t newsigblock, oldsigblock; - if (!command) /* just checking... */ - return(1); +#if __DARWIN_UNIX03 + if (__unix_conforming == 0) + __unix_conforming = 1; +#ifdef VARIANT_CANCELABLE + _pthread_testcancel(pthread_self(), 1); +#endif /* VARIANT_CANCELABLE */ +#endif /* __DARWIN_UNIX03 */ + + if (!command) { /* just checking... */ + if (access(_PATH_BSHELL, F_OK) == -1) /* if no sh or no access */ + return(0); + else + return(1); + } +#if __DARWIN_UNIX03 + pthread_mutex_lock(&__systemfn_mutex); +#endif /* __DARWIN_UNIX03 */ /* * Ignore SIGINT and SIGQUIT, block SIGCHLD. Remember to save * existing signal dispositions. @@ -83,6 +108,9 @@ (void)_sigaction(SIGINT, &intact, NULL); (void)_sigaction(SIGQUIT, &quitact, NULL); (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL); +#if __DARWIN_UNIX03 + pthread_mutex_unlock(&__systemfn_mutex); +#endif /* __DARWIN_UNIX03 */ execl(_PATH_BSHELL, "sh", "-c", command, (char *)NULL); _exit(127); default: /* parent */ @@ -95,6 +123,9 @@ (void)_sigaction(SIGINT, &intact, NULL); (void)_sigaction(SIGQUIT, &quitact, NULL); (void)_sigprocmask(SIG_SETMASK, &oldsigblock, NULL); +#if __DARWIN_UNIX03 + pthread_mutex_unlock(&__systemfn_mutex); +#endif /* __DARWIN_UNIX03 */ return(pid == -1 ? -1 : pstat); }