2 * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
4 * $Id: system.c,v 1.8 2000/03/28 14:29:13 simonmar Exp $
6 * system Runtime Support
9 /* The itimer stuff in this module is non-posix */
10 #define NON_POSIX_SOURCE
19 #if TIME_WITH_SYS_TIME
20 # include <sys/time.h>
24 # include <sys/time.h>
30 #ifndef mingw32_TARGET_OS
31 # ifdef HAVE_SYS_WAIT_H
32 # include <sys/wait.h>
45 systemCmd(StgByteArray cmd)
47 #if defined(mingw32_TARGET_OS)
48 if (system(cmd) < 0) {
56 #if defined(cygwin32_TARGET_OS)
57 /* The implementation of std. fork() has its problems
58 under cygwin32-b18, so we fall back on using libc's
59 system() instead. (It in turn has problems, as it
60 does not wait until the sub shell has finished before
61 returning. Using sleep() works around that.)
63 if (system(cmd) < 0) {
74 switch(pid = fork()) {
84 /* Reset the itimers in the child, so it doesn't get plagued
85 * by SIGVTALRM interrupts.
87 struct timeval tv_null = { 0, 0 };
89 itv.it_interval = tv_null;
90 itv.it_value = tv_null;
91 setitimer(ITIMER_REAL, &itv, NULL);
92 setitimer(ITIMER_VIRTUAL, &itv, NULL);
93 setitimer(ITIMER_PROF, &itv, NULL);
97 execl("/bin/sh", "sh", "-c", cmd, NULL);
102 while (waitpid(pid, &wstat, 0) < 0) {
103 if (errno != EINTR) {
110 if (WIFEXITED(wstat))
111 return WEXITSTATUS(wstat);
112 else if (WIFSIGNALED(wstat)) {
113 ghc_errtype = ERR_INTERRUPTED;
114 ghc_errstr = "system command interrupted";
117 /* This should never happen */
118 ghc_errtype = ERR_OTHERERROR;
119 ghc_errstr = "internal error (process neither exited nor signalled)";