summaryrefslogtreecommitdiff
path: root/libguile
diff options
context:
space:
mode:
Diffstat (limited to 'libguile')
-rw-r--r--libguile/ChangeLog56
-rw-r--r--libguile/_scm.h4
-rw-r--r--libguile/async.h6
-rw-r--r--libguile/backtrace.c3
-rw-r--r--libguile/filesys.c50
-rw-r--r--libguile/fports.c54
-rw-r--r--libguile/gdb_interface.h22
-rw-r--r--libguile/guile.c15
-rw-r--r--libguile/inet_aton.c4
-rw-r--r--libguile/iselect.h4
-rw-r--r--libguile/net_db.c7
-rw-r--r--libguile/ports.c21
-rw-r--r--libguile/posix.c47
-rw-r--r--libguile/random.c8
-rw-r--r--libguile/scmsigs.c12
-rw-r--r--libguile/socket.c6
-rw-r--r--libguile/stime.c4
17 files changed, 306 insertions, 17 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index cdf0344f2..6ab44667e 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,3 +1,59 @@
+2001-06-26 Martin Grabmueller <mgrabmue@cs.tu-berlin.de>
+
+ * ports.c (scm_output_port_p): Use result of SCM_COERCE_OUTPORT.
+
+ The following set of changes makes compiling Guile under various
+ Windows compilers easier. Compilation under GNU systems should
+ not be affected at all.
+
+ Thanks to Stefan Jahn for all necessary information, patches and
+ testing.
+
+ * posix.c: Conditialize getpwent, getgrent, kill, getppid, getuid,
+ getpgrp, ttyname, primitive-fork and some header inclusion for
+ Windows.
+
+ * random.c: Define M_PI, if not predefined and use __int64 for
+ LONG64 under Windows.
+
+ * scmsigs.c: Emulate some functions (alarm, sleep, kill) under
+ Windows and conditionalize some signal names.
+
+ * socket.c (scm_getsockopt): Added missing comma.
+ Include socket library header under Windows.
+
+ * stime.c (CLKTCK): Add cast to int, to make it compile under
+ Windows.
+
+ * ports.c (truncate): New function, compiled only under Windows.
+
+ * net_db.c: Do not declare errno under Windows.
+
+ * iselect.h, inet_aton.c: Include socket library headers under
+ Windows.
+
+ * guile.c (inner_main): Under Windows, initialize socket library
+ and initialize gdb_interface data structures.
+
+ * gdb_interface.h: Under Windows, gdb_interface cannot be
+ initialized statically. Initialize at runtime instead.
+
+ * fports.c (write_all): ssize_t -> size_t.
+ (fport_print): Conditionalize call to ttyname().
+ (getflags): New function, compiled only under Windows.
+
+ * filesys.c: Conditionalize inclusion of <pwd.h>. Conditionalize
+ primitives chown, link, fcntl.
+ (scm_basename, scm_dirname): Under Windows, handle \ as well as /
+ as path seperator.
+
+ * backtrace.c: Include <io.h> under Windows.
+
+ * async.h (ASYNCH, SCM_ASYNC_H): Rename <foo>H to SCM_<foo>_H.
+
+ * _scm.h: Added preprocessor conditional for __MINGW32__ for errno
+ declaration.
+
2001-06-27 Keisuke Nishida <kxn30@po.cwru.edu>
* eval.c (scm_call_0, scm_call_1, scm_call_2, scm_call_3,
diff --git a/libguile/_scm.h b/libguile/_scm.h
index ec9839d80..d155f9441 100644
--- a/libguile/_scm.h
+++ b/libguile/_scm.h
@@ -111,13 +111,13 @@
# define SCM_SYSCALL(line) line;
#endif /* ndef SCM_SYSCALL */
-#ifndef MSDOS
+#if !defined (MSDOS) && !defined (__MINGW32__)
# ifdef ARM_ULIB
extern volatile int errno;
# else
extern int errno;
# endif /* def ARM_ULIB */
-#endif /* ndef MSDOS */
+#endif /* ndef MSDOS && ndef __MINGW32__*/
diff --git a/libguile/async.h b/libguile/async.h
index b4fa403cb..ca5b7efce 100644
--- a/libguile/async.h
+++ b/libguile/async.h
@@ -1,7 +1,7 @@
/* classes: h_files */
-#ifndef ASYNCH
-#define ASYNCH
+#ifndef SCM_ASYNC_H
+#define SCM_ASYNC_H
/* Copyright (C) 1995, 96, 97, 98, 2000 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
@@ -70,7 +70,7 @@ extern SCM scm_unmask_signals (void);
extern SCM scm_mask_signals (void);
extern void scm_init_async (void);
-#endif /* ASYNCH */
+#endif /* SCM_ASYNC_H */
/*
Local Variables:
diff --git a/libguile/backtrace.c b/libguile/backtrace.c
index 3ab3a29f4..1687ab88e 100644
--- a/libguile/backtrace.c
+++ b/libguile/backtrace.c
@@ -54,6 +54,9 @@
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
#include "libguile/stacks.h"
#include "libguile/srcprop.h"
diff --git a/libguile/filesys.c b/libguile/filesys.c
index 1d4afd341..0593414c3 100644
--- a/libguile/filesys.c
+++ b/libguile/filesys.c
@@ -93,7 +93,9 @@
#include <sys/stat.h>
#include <fcntl.h>
+#ifdef HAVE_PWD_H
#include <pwd.h>
+#endif
#if HAVE_DIRENT_H
@@ -117,6 +119,26 @@
#if defined (S_IFSOCK) && ! defined (S_ISSOCK)
#define S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
#endif
+
+/* The MinGW gcc does not define the S_ISSOCK macro. Any other native Windows
+ compiler like BorlandC or MSVC has none of these macros defined. */
+#ifdef __MINGW32__
+# define S_ISSOCK(mode) (0)
+#endif
+#if defined (__BORLANDC__) || defined (_MSC_VER)
+# define S_ISBLK(mode) (0)
+# define S_ISFIFO(mode) (((mode) & _S_IFMT) == _S_IFIFO)
+# define S_ISCHR(mode) (((mode) & _S_IFMT) == _S_IFCHR)
+# define S_ISDIR(mode) (((mode) & _S_IFMT) == _S_IFDIR)
+# define S_ISREG(mode) (((mode) & _S_IFMT) == _S_IFREG)
+#endif
+
+/* Some more definitions for the native Windows port. */
+#ifdef __MINGW32__
+# define mkdir(path, mode) mkdir (path)
+# define fsync(fd) _commit (fd)
+# define fchmod(fd, mode) (-1)
+#endif /* __MINGW32__ */
@@ -125,6 +147,7 @@
/* {Permissions}
*/
+#ifdef HAVE_CHOWN
SCM_DEFINE (scm_chown, "chown", 3, 0, 0,
(SCM object, SCM owner, SCM group),
"Change the ownership and group of the file referred to by @var{object} to\n"
@@ -167,6 +190,7 @@ SCM_DEFINE (scm_chown, "chown", 3, 0, 0,
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
+#endif /* HAVE_CHOWN */
SCM_DEFINE (scm_chmod, "chmod", 2, 0, 0,
@@ -561,6 +585,7 @@ SCM_DEFINE (scm_stat, "stat", 1, 0, 0,
/* {Modifying Directories}
*/
+#ifdef HAVE_LINK
SCM_DEFINE (scm_link, "link", 2, 0, 0,
(SCM oldpath, SCM newpath),
"Creates a new name @var{newpath} in the file system for the\n"
@@ -582,6 +607,7 @@ SCM_DEFINE (scm_link, "link", 2, 0, 0,
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
+#endif /* HAVE_LINK */
@@ -1145,6 +1171,7 @@ SCM_DEFINE (scm_select, "select", 3, 2, 0,
+#ifdef HAVE_FCNTL
SCM_DEFINE (scm_fcntl, "fcntl", 2, 1, 0,
(SCM object, SCM cmd, SCM value),
"Apply @var{command} to the specified file descriptor or the underlying\n"
@@ -1199,6 +1226,7 @@ SCM_DEFINE (scm_fcntl, "fcntl", 2, 1, 0,
return SCM_MAKINUM (rv);
}
#undef FUNC_NAME
+#endif /* HAVE_FCNTL */
SCM_DEFINE (scm_fsync, "fsync", 1, 0, 0,
(SCM object),
@@ -1368,12 +1396,22 @@ SCM_DEFINE (scm_dirname, "dirname", 1, 0, 0,
len = SCM_STRING_LENGTH (filename);
i = len - 1;
+#ifdef __MINGW32__
+ while (i >= 0 && (s[i] == '/' || s[i] == '\\')) --i;
+ while (i >= 0 && (s[i] != '/' || s[i] != '\\')) --i;
+ while (i >= 0 && (s[i] == '/' || s[i] == '\\')) --i;
+#else
while (i >= 0 && s[i] == '/') --i;
while (i >= 0 && s[i] != '/') --i;
while (i >= 0 && s[i] == '/') --i;
+#endif /* ndef __MINGW32__ */
if (i < 0)
{
+#ifdef __MINGW32__
+ if (len > 0 && (s[0] == '/' || s[0] == '\\'))
+#else
if (len > 0 && s[0] == '/')
+#endif /* ndef __MINGW32__ */
return scm_substring (filename, SCM_INUM0, SCM_MAKINUM (1));
else
return scm_dot_string;
@@ -1407,15 +1445,27 @@ SCM_DEFINE (scm_basename, "basename", 1, 1, 0,
j = SCM_STRING_LENGTH (suffix) - 1;
}
i = len - 1;
+#ifdef __MINGW32__
+ while (i >= 0 && (f[i] == '/' || f[i] == '\\')) --i;
+#else
while (i >= 0 && f[i] == '/') --i;
+#endif /* ndef __MINGW32__ */
end = i;
while (i >= 0 && j >= 0 && f[i] == s[j]) --i, --j;
if (j == -1)
end = i;
+#ifdef __MINGW32__
+ while (i >= 0 && (f[i] != '/' || f[i] != '\\')) --i;
+#else
while (i >= 0 && f[i] != '/') --i;
+#endif /* ndef __MINGW32__ */
if (i == end)
{
+#ifdef __MINGW32__
+ if (len > 0 && (f[0] == '/' || f[i] == '\\'))
+#else
if (len > 0 && f[0] == '/')
+#endif /* ndef __MINGW32__ */
return scm_substring (filename, SCM_INUM0, SCM_MAKINUM (1));
else
return scm_dot_string;
diff --git a/libguile/fports.c b/libguile/fports.c
index 42d8bd843..bc90db6bf 100644
--- a/libguile/fports.c
+++ b/libguile/fports.c
@@ -68,6 +68,12 @@ size_t fwrite ();
#include <errno.h>
#include "libguile/iselect.h"
+/* Some defines for Windows. */
+#ifdef __MINGW32__
+# include <sys/stat.h>
+# include <winsock2.h>
+# define ftruncate(fd, size) chsize (fd, size)
+#endif /* __MINGW32__ */
scm_t_bits scm_tc16_fport;
@@ -349,6 +355,46 @@ SCM_DEFINE (scm_open_file, "open-file", 2, 0, 0,
#undef FUNC_NAME
+#ifdef __MINGW32__
+/*
+ * Try getting the appropiate file flags for a given file descriptor
+ * under Windows. This incorporates some fancy operations because Windows
+ * differentiates between file, pipe and socket descriptors.
+ */
+#ifndef O_ACCMODE
+# define O_ACCMODE 0x0003
+#endif
+
+static int getflags (int fdes)
+{
+ int flags = 0;
+ struct stat buf;
+ int error, optlen = sizeof (int);
+
+ /* Is this a socket ? */
+ if (getsockopt (fdes, SOL_SOCKET, SO_ERROR, (void *) &error, &optlen) >= 0)
+ flags = O_RDWR;
+ /* Maybe a regular file ? */
+ else if (fstat (fdes, &buf) < 0)
+ flags = -1;
+ else
+ {
+ /* Or an anonymous pipe handle ? */
+ if (buf.st_mode & 0x1000 /* _O_SHORT_LIVED */)
+ flags = O_RDWR;
+ /* stdin ? */
+ else if (fdes == 0 && isatty (fdes))
+ flags = O_RDONLY;
+ /* stdout / stderr ? */
+ else if ((fdes == 1 || fdes == 2) && isatty (fdes))
+ flags = O_WRONLY;
+ else
+ flags = buf.st_mode;
+ }
+ return flags;
+}
+#endif /* __MINGW32__ */
+
/* Building Guile ports from a file descriptor. */
/* Build a Scheme port from an open file descriptor `fdes'.
@@ -366,7 +412,11 @@ scm_fdes_to_port (int fdes, char *mode, SCM name)
int flags;
/* test that fdes is valid. */
+#ifdef __MINGW32__
+ flags = getflags (fdes);
+#else
flags = fcntl (fdes, F_GETFL, 0);
+#endif
if (flags == -1)
SCM_SYSERROR;
flags &= O_ACCMODE;
@@ -456,9 +506,11 @@ fport_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED)
scm_putc (' ', port);
fdes = (SCM_FSTREAM (exp))->fdes;
+#ifdef HAVE_TTYNAME
if (isatty (fdes))
scm_puts (ttyname (fdes), port);
else
+#endif /* HAVE_TTYNAME */
scm_intprint (fdes, 10, port);
}
else
@@ -595,7 +647,7 @@ static void write_all (SCM port, const void *data, size_t remaining)
while (remaining > 0)
{
- ssize_t done;
+ size_t done;
SCM_SYSCALL (done = write (fdes, data, remaining));
diff --git a/libguile/gdb_interface.h b/libguile/gdb_interface.h
index ec1bbe43d..fc44bc815 100644
--- a/libguile/gdb_interface.h
+++ b/libguile/gdb_interface.h
@@ -58,6 +58,7 @@ Mikael Djurfeldt, SANS/NADA KTH, 10044 STOCKHOLM, SWEDEN */
interface in your main program. This is necessary if the interface
is defined in a library, such as Guile. */
+#ifndef __MINGW32__
#define GDB_INTERFACE \
void *gdb_interface[] = { \
&gdb_options, \
@@ -71,6 +72,27 @@ void *gdb_interface[] = { \
(void *) gdb_print, \
(void *) gdb_binding \
}
+#else /* __MINGW32__ */
+/* Because the following functions are imported from a DLL (some kind of
+ shared library) these are NO static initializers. That is why you need to
+ define them and assign the functions and data items at run time. */
+#define GDB_INTERFACE \
+void *gdb_interface[] = \
+ { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
+#define GDB_INTERFACE_INIT \
+ do { \
+ gdb_interface[0] = &gdb_options; \
+ gdb_interface[1] = &gdb_language; \
+ gdb_interface[2] = &gdb_result; \
+ gdb_interface[3] = &gdb_output; \
+ gdb_interface[4] = &gdb_output_length; \
+ gdb_interface[5] = (void *) gdb_maybe_valid_type_p; \
+ gdb_interface[6] = (void *) gdb_read; \
+ gdb_interface[7] = (void *) gdb_eval; \
+ gdb_interface[8] = (void *) gdb_print; \
+ gdb_interface[9] = (void *) gdb_binding; \
+ } while (0);
+#endif /* __MINGW32__ */
/* GDB_OPTIONS is a set of flags informing gdb what features are present
in the interface. Currently only one option is supported: */
diff --git a/libguile/guile.c b/libguile/guile.c
index 21be17871..d25a70d07 100644
--- a/libguile/guile.c
+++ b/libguile/guile.c
@@ -55,6 +55,10 @@
#include <libltdl/ltdl.h>
#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+
/* Debugger interface (don't change the order of the following lines) */
#define GDB_TYPE SCM
#include <libguile/gdb_interface.h>
@@ -63,8 +67,19 @@ GDB_INTERFACE;
static void
inner_main (void *closure SCM_UNUSED, int argc, char **argv)
{
+#ifdef __MINGW32__
+ /* This is necessary to startup the Winsock API under Win32. */
+ WSADATA WSAData;
+ WSAStartup (0x0202, &WSAData);
+ GDB_INTERFACE_INIT;
+#endif /* __MINGW32__ */
+
/* module initializations would go here */
scm_shell (argc, argv);
+
+#ifdef __MINGW32__
+ WSACleanup ();
+#endif /* __MINGW32__ */
}
int
diff --git a/libguile/inet_aton.c b/libguile/inet_aton.c
index 54c76507b..ec00b5a0d 100644
--- a/libguile/inet_aton.c
+++ b/libguile/inet_aton.c
@@ -40,9 +40,13 @@ static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93";
#include <ctype.h>
+#ifdef __MINGW32__
+#include <winsock2.h>
+#else
#include <sys/param.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#endif
#if 0
diff --git a/libguile/iselect.h b/libguile/iselect.h
index eb87927c0..fdaedcc61 100644
--- a/libguile/iselect.h
+++ b/libguile/iselect.h
@@ -67,6 +67,10 @@
#include <sys/select.h>
#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+
#ifdef FD_SET
#define SELECT_TYPE fd_set
diff --git a/libguile/net_db.c b/libguile/net_db.c
index 66e327a85..974ba888c 100644
--- a/libguile/net_db.c
+++ b/libguile/net_db.c
@@ -66,12 +66,17 @@
#endif
#include <sys/types.h>
+
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#endif
-#ifndef HAVE_H_ERRNO
+#if !defined (HAVE_H_ERRNO) && !defined (__MINGW32__)
/* h_errno not found in netdb.h, maybe this will help. */
extern int h_errno;
#endif
diff --git a/libguile/ports.c b/libguile/ports.c
index 0dddda802..68951a416 100644
--- a/libguile/ports.c
+++ b/libguile/ports.c
@@ -77,6 +77,11 @@
#include <sys/ioctl.h>
#endif
+#ifdef __MINGW32__
+#include <fcntl.h>
+#define ftruncate(fd, size) chsize (fd, size)
+#endif
+
/* The port kind table --- a dynamically resized array of port types. */
@@ -802,7 +807,7 @@ SCM_DEFINE (scm_output_port_p, "output-port?", 1, 0, 0,
"@code{port?}.")
#define FUNC_NAME s_scm_output_port_p
{
- SCM_COERCE_OUTPORT (x);
+ x = SCM_COERCE_OUTPORT (x);
return SCM_BOOL (SCM_OUTPUT_PORT_P (x));
}
#undef FUNC_NAME
@@ -1325,6 +1330,20 @@ SCM_DEFINE (scm_seek, "seek", 3, 0, 0,
}
#undef FUNC_NAME
+#ifdef __MINGW32__
+/* Define this function since it is not supported under Windows. */
+static int truncate (char *file, int length)
+{
+ int ret = -1, fdes;
+ if ((fdes = open (file, O_BINARY | O_WRONLY)) != -1)
+ {
+ ret = chsize (fdes, length);
+ close (fdes);
+ }
+ return ret;
+}
+#endif /* __MINGW32__ */
+
SCM_DEFINE (scm_truncate_file, "truncate-file", 1, 1, 0,
(SCM object, SCM length),
"Truncates the object referred to by @var{object} to at most\n"
diff --git a/libguile/posix.c b/libguile/posix.c
index 83e8bac10..7379c3780 100644
--- a/libguile/posix.c
+++ b/libguile/posix.c
@@ -91,7 +91,20 @@ extern char *ttyname();
#include <sys/stat.h>
#include <fcntl.h>
+#ifdef HAVE_PWD_H
#include <pwd.h>
+#endif
+#ifdef HAVE_IO_H
+#include <io.h>
+#endif
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#endif
+
+#ifdef __MINGW32__
+/* Some defines for Windows here. */
+# define pipe(fd) _pipe (fd, 256, O_BINARY)
+#endif /* __MINGW32__ */
#if HAVE_SYS_WAIT_H
# include <sys/wait.h>
@@ -107,8 +120,12 @@ extern char *ttyname();
extern char ** environ;
+#ifdef HAVE_GRP_H
#include <grp.h>
+#endif
+#ifdef HAVE_SYS_UTSNAME_H
#include <sys/utsname.h>
+#endif
#if HAVE_DIRENT_H
# include <dirent.h>
@@ -247,7 +264,7 @@ SCM_DEFINE (scm_getgroups, "getgroups", 0, 0, 0,
#undef FUNC_NAME
#endif
-
+#ifdef HAVE_GETPWENT
SCM_DEFINE (scm_getpwuid, "getpw", 0, 1, 0,
(SCM user),
"Look up an entry in the user database. @var{obj} can be an integer,\n"
@@ -298,6 +315,7 @@ SCM_DEFINE (scm_getpwuid, "getpw", 0, 1, 0,
return result;
}
#undef FUNC_NAME
+#endif /* HAVE_GETPWENT */
#ifdef HAVE_SETPWENT
@@ -318,7 +336,7 @@ SCM_DEFINE (scm_setpwent, "setpw", 0, 1, 0,
#endif
-
+#ifdef HAVE_GETGRENT
/* Combines getgrgid and getgrnam. */
SCM_DEFINE (scm_getgrgid, "getgr", 0, 1, 0,
(SCM name),
@@ -375,7 +393,7 @@ SCM_DEFINE (scm_setgrent, "setgr", 0, 1, 0,
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
-
+#endif /* HAVE_GETGRENT */
SCM_DEFINE (scm_kill, "kill", 2, 0, 0,
@@ -407,8 +425,13 @@ SCM_DEFINE (scm_kill, "kill", 2, 0, 0,
SCM_VALIDATE_INUM (1,pid);
SCM_VALIDATE_INUM (2,sig);
/* Signal values are interned in scm_init_posix(). */
+#ifdef HAVE_KILL
if (kill ((int) SCM_INUM (pid), (int) SCM_INUM (sig)) != 0)
- SCM_SYSERROR;
+#else
+ if ((int) SCM_INUM (pid) == getpid ())
+ if (raise ((int) SCM_INUM (sig)) != 0)
+#endif
+ SCM_SYSERROR;
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
@@ -472,6 +495,7 @@ SCM_DEFINE (scm_waitpid, "waitpid", 1, 1, 0,
#undef FUNC_NAME
#endif /* HAVE_WAITPID */
+#ifndef __MINGW32__
SCM_DEFINE (scm_status_exit_val, "status:exit-val", 1, 0, 0,
(SCM status),
"Return the exit status value, as would be set if a process\n"
@@ -528,7 +552,9 @@ SCM_DEFINE (scm_status_stop_sig, "status:stop-sig", 1, 0, 0,
return SCM_BOOL_F;
}
#undef FUNC_NAME
+#endif /* __MINGW32__ */
+#ifdef HAVE_GETPPID
SCM_DEFINE (scm_getppid, "getppid", 0, 0, 0,
(),
"Return an integer representing the process ID of the parent\n"
@@ -538,9 +564,10 @@ SCM_DEFINE (scm_getppid, "getppid", 0, 0, 0,
return SCM_MAKINUM (0L + getppid ());
}
#undef FUNC_NAME
+#endif /* HAVE_GETPPID */
-
+#ifndef __MINGW32__
SCM_DEFINE (scm_getuid, "getuid", 0, 0, 0,
(),
"Return an integer representing the current real user ID.")
@@ -549,6 +576,7 @@ SCM_DEFINE (scm_getuid, "getuid", 0, 0, 0,
return SCM_MAKINUM (0L + getuid ());
}
#undef FUNC_NAME
+#endif /* __MINGW32__ */
@@ -580,7 +608,6 @@ SCM_DEFINE (scm_geteuid, "geteuid", 0, 0, 0,
#undef FUNC_NAME
-
SCM_DEFINE (scm_getegid, "getegid", 0, 0, 0,
(),
"Return an integer representing the current effective group ID.\n"
@@ -675,6 +702,8 @@ SCM_DEFINE (scm_setegid, "setegid", 1, 0, 0,
#undef FUNC_NAME
#endif
+
+#ifdef HAVE_GETPGRP
SCM_DEFINE (scm_getpgrp, "getpgrp", 0, 0, 0,
(),
"Return an integer representing the current process group ID.\n"
@@ -686,6 +715,8 @@ SCM_DEFINE (scm_getpgrp, "getpgrp", 0, 0, 0,
return SCM_MAKINUM (fn (0));
}
#undef FUNC_NAME
+#endif /* HAVE_GETPGRP */
+
#ifdef HAVE_SETPGID
SCM_DEFINE (scm_setpgid, "setpgid", 2, 0, 0,
@@ -724,6 +755,7 @@ SCM_DEFINE (scm_setsid, "setsid", 0, 0, 0,
#undef FUNC_NAME
#endif /* HAVE_SETSID */
+#ifdef HAVE_TTYNAME
SCM_DEFINE (scm_ttyname, "ttyname", 1, 0, 0,
(SCM port),
"Return a string with the name of the serial terminal device\n"
@@ -745,6 +777,7 @@ SCM_DEFINE (scm_ttyname, "ttyname", 1, 0, 0,
return (scm_makfrom0str (ans));
}
#undef FUNC_NAME
+#endif /* HAVE_TTYNAME */
#ifdef HAVE_CTERMID
SCM_DEFINE (scm_ctermid, "ctermid", 0, 0, 0,
@@ -947,6 +980,7 @@ SCM_DEFINE (scm_execle, "execle", 2, 0, 1,
}
#undef FUNC_NAME
+#ifdef HAVE_FORK
SCM_DEFINE (scm_fork, "primitive-fork", 0, 0, 0,
(),
"Creates a new \"child\" process by duplicating the current \"parent\" process.\n"
@@ -963,6 +997,7 @@ SCM_DEFINE (scm_fork, "primitive-fork", 0, 0, 0,
return SCM_MAKINUM (0L+pid);
}
#undef FUNC_NAME
+#endif /* HAVE_FORK */
#ifdef HAVE_UNAME
SCM_DEFINE (scm_uname, "uname", 0, 0, 0,
diff --git a/libguile/random.c b/libguile/random.c
index a55d68c31..f367332e5 100644
--- a/libguile/random.c
+++ b/libguile/random.c
@@ -91,6 +91,10 @@ scm_t_rng scm_the_rng;
#define A 2131995753UL
+#ifndef M_PI
+#define M_PI 3.14159265359
+#endif
+
#if SIZEOF_LONG > 4
#if SIZEOF_INT > 4
#define LONG32 unsigned short
@@ -100,8 +104,12 @@ scm_t_rng scm_the_rng;
#define LONG64 unsigned long
#else
#define LONG32 unsigned long
+#ifdef __MINGW32__
+#define LONG64 unsigned __int64
+#else
#define LONG64 unsigned long long
#endif
+#endif
#if SIZEOF_LONG > 4 || defined (HAVE_LONG_LONGS)
diff --git a/libguile/scmsigs.c b/libguile/scmsigs.c
index bdbf525e7..ea75a7216 100644
--- a/libguile/scmsigs.c
+++ b/libguile/scmsigs.c
@@ -74,6 +74,14 @@ int usleep ();
#endif
+#ifdef __MINGW32__
+#include <windows.h>
+#define alarm(sec) (0)
+/* This weird comma expression is because Sleep is void under Windows. */
+#define sleep(sec) (Sleep ((sec) * 1000), 0)
+#define kill(pid, sig) raise (sig)
+#endif
+
/* SIGRETTYPE is the type that signal handlers return. See <signal.h> */
@@ -298,12 +306,16 @@ SCM_DEFINE (scm_sigaction, "sigaction", 1, 2, 0,
case SIGFPE:
case SIGILL:
case SIGSEGV:
+#ifdef SIGBUS
case SIGBUS:
+#endif
case SIGABRT:
#if defined(SIGIOT) && (SIGIOT != SIGABRT)
case SIGIOT:
#endif
+#ifdef SIGTRAP
case SIGTRAP:
+#endif
#ifdef SIGEMT
case SIGEMT:
#endif
diff --git a/libguile/socket.c b/libguile/socket.c
index 1eacf9fe8..82d03fbc4 100644
--- a/libguile/socket.c
+++ b/libguile/socket.c
@@ -63,6 +63,9 @@
#include <unistd.h>
#endif
#include <sys/types.h>
+#ifdef HAVE_WINSOCK2_H
+#include <winsock2.h>
+#else
#include <sys/socket.h>
#ifdef HAVE_UNIX_DOMAIN_SOCKETS
#include <sys/un.h>
@@ -70,6 +73,7 @@
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
+#endif
#if defined (HAVE_UNIX_DOMAIN_SOCKETS) && !defined (SUN_LEN)
#define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) 0)->sun_path) \
@@ -523,7 +527,7 @@ SCM_DEFINE (scm_getsockopt, "getsockopt", 3, 0, 0,
return scm_cons (scm_long2num (ling->l_onoff),
scm_long2num (ling->l_linger));
#else
- return scm_cons (scm_long2num (*(int *) optval)
+ return scm_cons (scm_long2num (*(int *) optval),
SCM_MAKINUM (0));
#endif
}
diff --git a/libguile/stime.c b/libguile/stime.c
index 5db51a547..fae4beeb8 100644
--- a/libguile/stime.c
+++ b/libguile/stime.c
@@ -99,10 +99,10 @@ extern char *strptime ();
/* This should be figured out by autoconf. */
#if ! defined(CLKTCK) && defined(CLK_TCK)
-# define CLKTCK CLK_TCK
+# define CLKTCK ((int) CLK_TCK)
#endif
#if ! defined(CLKTCK) && defined(CLOCKS_PER_SEC)
-# define CLKTCK CLOCKS_PER_SEC
+# define CLKTCK ((int) CLOCKS_PER_SEC)
#endif
#if ! defined(CLKTCK)
# define CLKTCK 60