diff options
author | partain <unknown> | 1996-07-25 21:33:42 +0000 |
---|---|---|
committer | partain <unknown> | 1996-07-25 21:33:42 +0000 |
commit | 5eb1c77c795f92ed0f4c8023847e9d4be1a4fd0d (patch) | |
tree | adb07110e00f00b2b2ef6365e16d5f58b260ce3c /ghc/lib/cbits/system.lc | |
parent | f7ecf7234c224489be8a5e63fced903b655d92ee (diff) | |
download | haskell-5eb1c77c795f92ed0f4c8023847e9d4be1a4fd0d.tar.gz |
[project @ 1996-07-25 20:43:49 by partain]
Bulk of final changes for 2.01
Diffstat (limited to 'ghc/lib/cbits/system.lc')
-rw-r--r-- | ghc/lib/cbits/system.lc | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/ghc/lib/cbits/system.lc b/ghc/lib/cbits/system.lc new file mode 100644 index 0000000000..013f111ba6 --- /dev/null +++ b/ghc/lib/cbits/system.lc @@ -0,0 +1,65 @@ +% +% (c) The GRASP/AQUA Project, Glasgow University, 1995 +% +\subsection[system.lc]{system Runtime Support} + +\begin{code} + +#include "rtsdefs.h" +#include "stgio.h" + +#ifdef HAVE_SYS_WAIT_H +#include <sys/wait.h> +#endif + +#ifdef HAVE_VFORK_H +#include <vfork.h> +#endif + +#ifdef HAVE_VFORK +#define fork vfork +#endif + +StgInt +systemCmd(cmd) +StgByteArray cmd; +{ + int pid; + int wstat; + + switch(pid = fork()) { + case -1: + if (errno != EINTR) { + cvtErrno(); + stdErrno(); + return -1; + } + case 0: + /* the child */ + execl("/bin/sh", "sh", "-c", cmd, NULL); + _exit(127); + } + + while (waitpid(pid, &wstat, 0) < 0) { + if (errno != EINTR) { + cvtErrno(); + stdErrno(); + return -1; + } + } + + if (WIFEXITED(wstat)) + return WEXITSTATUS(wstat); + else if (WIFSIGNALED(wstat)) { + ghc_errtype = ERR_INTERRUPTED; + ghc_errstr = "system command interrupted"; + } + else { + /* This should never happen */ + ghc_errtype = ERR_OTHERERROR; + ghc_errstr = "internal error (process neither exited nor signalled)"; + } + return -1; +} + +\end{code} |