aboutsummaryrefslogtreecommitdiffhomepage
path: root/cbits
diff options
context:
space:
mode:
authorGravatar Ian Lynagh <igloo@earth.li>2009-02-11 18:29:06 +0000
committerGravatar Ian Lynagh <igloo@earth.li>2009-02-11 18:29:06 +0000
commitcfd7c9a5bdcc7f7c414b408d19c8a39a2917eec8 (patch)
tree82f403994bd5733d1e0d501fa35ec1d3ad33f768 /cbits
parent414744644cb19d2233a9c49ee1a6bc707a9da765 (diff)
Don't put inline'd functions in HsUnix.h; fixes trac #2969
If they are included into a C file which also has certain symbols defined, then the behaviour of the HsUnix.h functions can change (e.g. lstat can become the 32bit, rather than 64bit, version).
Diffstat (limited to 'cbits')
-rw-r--r--cbits/HsUnix.c109
1 files changed, 106 insertions, 3 deletions
diff --git a/cbits/HsUnix.c b/cbits/HsUnix.c
index 5b62798..c56b804 100644
--- a/cbits/HsUnix.c
+++ b/cbits/HsUnix.c
@@ -1,5 +1,4 @@
/* -----------------------------------------------------------------------------
- * $Id: HsUnix.c,v 1.1 2002/09/12 16:38:22 simonmar Exp $
*
* (c) The University of Glasgow 2002
*
@@ -7,7 +6,111 @@
*
* ---------------------------------------------------------------------------*/
-// Out-of-line versions of all the inline functions from HsUnix.h
-#define INLINE /* nothing */
#include "HsUnix.h"
+int __hsunix_wifexited (int stat) { return WIFEXITED(stat); }
+int __hsunix_wexitstatus (int stat) { return WEXITSTATUS(stat); }
+int __hsunix_wifsignaled (int stat) { return WIFSIGNALED(stat); }
+int __hsunix_wtermsig (int stat) { return WTERMSIG(stat); }
+int __hsunix_wifstopped (int stat) { return WIFSTOPPED(stat); }
+int __hsunix_wstopsig (int stat) { return WSTOPSIG(stat); }
+
+#ifdef HAVE_RTLDNEXT
+void *__hsunix_rtldNext (void) {return RTLD_NEXT;}
+#endif
+
+#ifdef HAVE_RTLDDEFAULT
+void *__hsunix_rtldDefault (void) {return RTLD_DEFAULT;}
+#endif
+
+#ifdef SIGINFO
+int __hsunix_SIGINFO() { return SIGINFO; }
+#endif
+#ifdef SIGWINCH
+int __hsunix_SIGWINCH() { return SIGWINCH; }
+#endif
+
+// lstat is a macro on some platforms, so we need a wrapper:
+int __hsunix_lstat(const char *path, struct stat *buf)
+{
+ return lstat(path,buf);
+}
+
+// mknod is a macro on some platforms, so we need a wrapper:
+int __hsunix_mknod(const char *pathname, mode_t mode, dev_t dev)
+{
+ return mknod(pathname,mode,dev);
+}
+
+#ifdef HAVE_PTSNAME
+// I cannot figure out how to make the definitions of the following
+// functions visible in <stdlib.h> on Linux. But these definitions
+// follow the POSIX specs, and everything links and runs.
+
+char *__hsunix_ptsname(int fd)
+{
+ extern char *ptsname(int);
+ return ptsname(fd);
+}
+
+int __hsunix_grantpt(int fd)
+{
+ extern int grantpt(int);
+ return grantpt(fd);
+}
+
+int __hsunix_unlockpt(int fd)
+{
+ extern int unlockpt(int);
+ return unlockpt(fd);
+}
+#endif
+
+// push a SVR4 STREAMS module; do nothing if STREAMS not available
+int __hsunix_push_module(int fd, const char *module)
+{
+#if defined(I_PUSH) && !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC)
+ return ioctl(fd, I_PUSH, module);
+#else
+ return 0;
+#endif
+}
+
+#if !defined(__MINGW32__)
+int __hscore_mkstemp(char *filetemplate) {
+ return (mkstemp(filetemplate));
+}
+#endif
+
+#if !defined(__MINGW32__) && !defined(irix_HOST_OS)
+int __hscore_getrlimit(int resource, struct rlimit *rlim) {
+ return (getrlimit(resource, rlim));
+}
+
+int __hscore_setrlimit(int resource, struct rlimit *rlim) {
+ return (setrlimit(resource, rlim));
+}
+#endif
+
+int __hsunix_unsetenv(const char *name)
+{
+#ifdef UNSETENV_RETURNS_VOID
+ unsetenv(name);
+ return 0;
+#else
+ return unsetenv(name);
+#endif
+}
+
+/* A size that will contain many path names, but not necessarily all
+ * (PATH_MAX is not defined on systems with unlimited path length,
+ * e.g. the Hurd).
+ */
+HsInt __hsunix_long_path_size() {
+#ifdef PATH_MAX
+ return PATH_MAX;
+#else
+ return 4096;
+#endif
+}
+