summaryrefslogtreecommitdiff
path: root/libguile/simpos.c
diff options
context:
space:
mode:
authorGary Houston <ghouston@arglist.com>1997-12-07 07:02:17 +0000
committerGary Houston <ghouston@arglist.com>1997-12-07 07:02:17 +0000
commit341eaef04b87c0c1d60dd26a22dff7ad4f67784b (patch)
treed6bac89d4de484e34cee820e56e3187ab3625f50 /libguile/simpos.c
parent8122b543c1af9c7459cf80e6d052cddcd7e0576f (diff)
downloadguile-341eaef04b87c0c1d60dd26a22dff7ad4f67784b.tar.gz
* README: using Automake 1.2d
* configure.in: AC_CHECK_FUNCS: add "system". * simpos.c (scm_system): always define: use sysmissing if not available. Check for HAVE_SYSTEM instead of _Windows (does Windows lack system or does it have an unusable one?). Check for error conditions -1 and 127. Use SCM_DEFER_INTS. Let the argument be optional: if not supplied, call system(NULL). * ports.c (scm_close_port): relax the type check from OPPORTP to PORTP; closing a closed port is allowed.
Diffstat (limited to 'libguile/simpos.c')
-rw-r--r--libguile/simpos.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/libguile/simpos.c b/libguile/simpos.c
index d9e8b9049..93a641ba6 100644
--- a/libguile/simpos.c
+++ b/libguile/simpos.c
@@ -57,24 +57,38 @@
extern int system();
-#ifndef _Windows
-SCM_PROC(s_system, "system", 1, 0, 0, scm_system);
+SCM_PROC(s_system, "system", 0, 1, 0, scm_system);
SCM
scm_system(cmd)
SCM cmd;
{
+ int rv;
+
+ if (SCM_UNBNDP (cmd))
+ {
+#ifdef HAVE_SYSTEM
+ rv = system (NULL);
+#else
+ rv = 0;
+#endif
+ return rv ? SCM_BOOL_T : SCM_BOOL_F;
+ }
SCM_ASSERT(SCM_NIMP(cmd) && SCM_ROSTRINGP(cmd), cmd, SCM_ARG1, s_system);
+#ifdef HAVE_SYSTEM
+ SCM_DEFER_INTS;
+ errno = 0;
if (SCM_ROSTRINGP (cmd))
cmd = scm_makfromstr (SCM_ROCHARS (cmd), SCM_ROLENGTH (cmd), 0);
-# ifdef AZTEC_C
- cmd = SCM_MAKINUM(Execute(SCM_ROCHARS(cmd), 0, 0));
-# else
- cmd = SCM_MAKINUM(0L+system(SCM_ROCHARS(cmd)));
-# endif
- return cmd;
-}
+ rv = system(SCM_ROCHARS(cmd));
+ if (rv == -1 || (rv == 127 && errno != 0))
+ scm_syserror (s_system);
+ SCM_ALLOW_INTS;
+ return SCM_MAKINUM (rv);
+#else
+ scm_sysmissing (s_system);
#endif
+}
extern char *getenv();
SCM_PROC (s_getenv, "getenv", 1, 0, 0, scm_getenv);