2 * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
4 * $Id: system.c,v 1.10 2001/02/19 16:18:38 rrt 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>
35 #include <windows.h> /* for Sleep */
48 systemCmd(StgByteArray cmd)
50 #if defined(mingw32_TARGET_OS)
51 /* There's no fork() under Windows, so we fall back on using libc's
52 system() instead. (It in turn has problems, as it does not wait
53 until the sub shell has finished before returning. Using Sleep()
54 works around that.) */
55 if (system(cmd) < 0) {
66 switch(pid = fork()) {
76 /* Reset the itimers in the child, so it doesn't get plagued
77 * by SIGVTALRM interrupts.
79 struct timeval tv_null = { 0, 0 };
81 itv.it_interval = tv_null;
82 itv.it_value = tv_null;
83 setitimer(ITIMER_REAL, &itv, NULL);
84 setitimer(ITIMER_VIRTUAL, &itv, NULL);
85 setitimer(ITIMER_PROF, &itv, NULL);
89 execl("/bin/sh", "sh", "-c", cmd, NULL);
94 while (waitpid(pid, &wstat, 0) < 0) {
102 if (WIFEXITED(wstat))
103 return WEXITSTATUS(wstat);
104 else if (WIFSIGNALED(wstat)) {
105 ghc_errtype = ERR_INTERRUPTED;
106 ghc_errstr = "system command interrupted";
109 /* This should never happen */
110 ghc_errtype = ERR_OTHERERROR;
111 ghc_errstr = "internal error (process neither exited nor signalled)";