+INLINE int __hscore_stat(char *file, struct stat *buf) {
+ return (stat(file,buf));
+}
+
+INLINE int __hscore_fstat(int fd, struct stat *buf) {
+ return (fstat(fd,buf));
+}
+
+// select-related stuff
+
+#if !defined(__MINGW32__)
+INLINE int hsFD_SETSIZE(void) { return FD_SETSIZE; }
+INLINE void hsFD_CLR(int fd, fd_set *fds) { FD_CLR(fd, fds); }
+INLINE int hsFD_ISSET(int fd, fd_set *fds) { return FD_ISSET(fd, fds); }
+INLINE void hsFD_SET(int fd, fd_set *fds) { FD_SET(fd, fds); }
+INLINE HsInt sizeof_fd_set(void) { return sizeof(fd_set); }
+extern void hsFD_ZERO(fd_set *fds);
+#endif
+
+// gettimeofday()-related
+
+#if !defined(__MINGW32__)
+
+INLINE HsInt sizeofTimeVal(void) { return sizeof(struct timeval); }
+
+INLINE HsWord64 getUSecOfDay(void)
+{
+ struct timeval tv;
+ gettimeofday(&tv, (struct timezone *) NULL);
+ // Don't forget to cast *before* doing the arithmetic, otherwise
+ // the arithmetic happens at the type of tv_sec, which is probably
+ // only 'int'.
+ return ((HsWord64)tv.tv_sec * 1000000 + (HsWord64)tv.tv_usec);
+}
+
+INLINE void setTimevalTicks(struct timeval *p, HsWord64 usecs)
+{
+ p->tv_sec = usecs / 1000000;
+ p->tv_usec = usecs % 1000000;
+}
+#endif /* !defined(__MINGW32__) */
+
+// Directory-related
+
+#if defined(__MINGW32__)
+
+/* Make sure we've got the reqd CSIDL_ constants in scope;
+ * w32api header files are lagging a bit in defining the full set.
+ */
+#if !defined(CSIDL_APPDATA)
+#define CSIDL_APPDATA 0x001a
+#endif
+#if !defined(CSIDL_PERSONAL)
+#define CSIDL_PERSONAL 0x0005
+#endif
+#if !defined(CSIDL_PROFILE)
+#define CSIDL_PROFILE 0x0028
+#endif
+#if !defined(CSIDL_WINDOWS)
+#define CSIDL_WINDOWS 0x0024
+#endif
+
+INLINE int __hscore_CSIDL_PROFILE() { return CSIDL_PROFILE; }
+INLINE int __hscore_CSIDL_APPDATA() { return CSIDL_APPDATA; }
+INLINE int __hscore_CSIDL_WINDOWS() { return CSIDL_WINDOWS; }
+INLINE int __hscore_CSIDL_PERSONAL() { return CSIDL_PERSONAL; }
+#endif
+
+#if defined(__MINGW32__)
+INLINE unsigned int __hscore_get_osver(void) { return _osver; }
+#endif
+
+/* ToDo: write a feature test that doesn't assume 'environ' to
+ * be in scope at link-time. */
+extern char** environ;
+INLINE char **__hscore_environ() { return environ; }
+
+/* lossless conversions between pointers and integral types */
+INLINE void * __hscore_from_uintptr(uintptr_t n) { return (void *)n; }
+INLINE void * __hscore_from_intptr (intptr_t n) { return (void *)n; }
+INLINE uintptr_t __hscore_to_uintptr (void *p) { return (uintptr_t)p; }
+INLINE intptr_t __hscore_to_intptr (void *p) { return (intptr_t)p; }
+