X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=include%2FHsBase.h;h=74f20f7b0315c7a203184f130f319355ce225420;hb=af7a1e96efe4aa3f10cbd29e9989a7fc695d7ff9;hp=6c68618847c15cab306b3adf8a2e29272f832ddf;hpb=5cab28a3cf5872fc3e2755a5c0a49fad236fdcd8;p=haskell-directory.git diff --git a/include/HsBase.h b/include/HsBase.h index 6c68618..74f20f7 100644 --- a/include/HsBase.h +++ b/include/HsBase.h @@ -1,6 +1,6 @@ /* ----------------------------------------------------------------------------- * - * (c) The University of Glasgow 2001-2002 + * (c) The University of Glasgow 2001-2004 * * Definitions for package `base' which are visible in Haskell land. * @@ -9,7 +9,17 @@ #ifndef __HSBASE_H__ #define __HSBASE_H__ -#include "config.h" +#include "ghcconfig.h" + +#include "HsBaseConfig.h" + +/* ultra-evil... */ +#undef PACKAGE_BUGREPORT +#undef PACKAGE_NAME +#undef PACKAGE_STRING +#undef PACKAGE_TARNAME +#undef PACKAGE_VERSION + #include "HsFFI.h" #include @@ -108,31 +118,34 @@ #include "lockFile.h" #include "dirUtils.h" +#include "runProcess.h" + #if defined(mingw32_TARGET_OS) #include #include #include "timeUtils.h" +#include #endif -/* in system.c */ -HsInt systemCmd(HsAddr cmd); - -/* in rawSystem.c */ -#if defined(mingw32_TARGET_OS) -HsInt rawSystem(HsAddr cmd); -#else -HsInt rawSystem(HsAddr cmd, HsAddr args); +#if HAVE_SYS_SELECT_H +#include #endif /* in inputReady.c */ int inputReady(int fd, int msecs, int isSock); /* in writeError.c */ -void writeErrString__(HsAddr msg_hdr, HsAddr msg, HsInt len); +void writeErrString__(HsAddr msg, HsInt len); /* in Signals.c */ extern HsInt nocldstop; +#if !defined(mingw32_TARGET_OS) +/* in execvpe.c */ +extern int execvpe(char *name, char *const argv[], char **envp); +extern void pPrPr_disableITimers (void); +#endif + /* ----------------------------------------------------------------------------- 64-bit operations, defined in longlong.c -------------------------------------------------------------------------- */ @@ -390,7 +403,7 @@ __hscore_setmode( HsInt fd, HsBool toBin ) return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT); #else return 0; -#endif +#endif } INLINE HsInt @@ -407,6 +420,20 @@ __hscore_PrelHandle_read( HsInt fd, HsAddr ptr, HsInt off, int sz ) } #if defined(mingw32_TARGET_OS) || defined(_MSC_VER) +INLINE HsInt +__hscore_PrelHandle_send( HsInt fd, HsAddr ptr, HsInt off, int sz ) +{ + return send(fd,(char *)ptr + off, sz, 0); +} + +INLINE HsInt +__hscore_PrelHandle_recv( HsInt fd, HsAddr ptr, HsInt off, int sz ) +{ + return recv(fd,(char *)ptr + off, sz, 0); +} +#endif + +#if defined(mingw32_TARGET_OS) || defined(_MSC_VER) INLINE long * __hscore_Time_ghcTimezone( void ) { return &_timezone; } @@ -464,26 +491,20 @@ INLINE mode_t __hscore_S_IWUSR() { return S_IWUSR; } INLINE mode_t __hscore_S_IXUSR() { return S_IXUSR; } #endif -#if !defined(_MSC_VER) INLINE HsAddr __hscore_d_name( struct dirent* d ) -{ -#if !defined(mingw32_TARGET_OS) && !defined(_MSC_VER) +{ +#if defined(STRUCT_DIRENT_FLAT_LAYOUT) return (HsAddr)(&d->d_name); #else return (HsAddr)(d->d_name); #endif } -#endif INLINE HsInt __hscore_end_of_dir( void ) { -#ifndef mingw32_TARGET_OS - return 0; -#else - return ENOENT; -#endif + return READDIR_ERRNO_EOF; } INLINE void @@ -513,7 +534,7 @@ INLINE void __hscore_poke_lflag( struct termios* ts, tcflag_t t ) { ts->c_lflag = t; } INLINE unsigned char* -__hscore_ptr_c_cc( struct termios* ts ) +__hscore_ptr_c_cc( struct termios* ts ) { return (unsigned char*) &ts->c_cc; } INLINE HsInt @@ -659,7 +680,7 @@ INLINE int __hsposix_SIGTTIN() { return SIGTTIN; } INLINE int __hsposix_SIGTTOU() { return SIGTTOU; } INLINE int __hsposix_SIGUSR1() { return SIGUSR1; } INLINE int __hsposix_SIGUSR2() { return SIGUSR2; } -#if HAVE_SIGPOLL +#ifdef SIGPOLL INLINE int __hsposix_SIGPOLL() { return SIGPOLL; } #endif INLINE int __hsposix_SIGPROF() { return SIGPROF; } @@ -673,7 +694,91 @@ INLINE int __hsposix_SIGXFSZ() { return SIGXFSZ; } INLINE int __hsposix_SIG_BLOCK() { return SIG_BLOCK; } INLINE int __hsposix_SIG_UNBLOCK() { return SIG_UNBLOCK; } INLINE int __hsposix_SIG_SETMASK() { return SIG_SETMASK; } + #endif /* mingw32_TARGET_OS */ +// These are wrapped because on some OSs (eg. Linux) they are +// macros which redirect to the 64-bit-off_t versions when large file +// support is enabled. +// +INLINE int __hscore_open(char *file, int how, mode_t mode) { + return (open(file,how,mode)); +} + +INLINE off_t __hscore_lseek(int fd, off_t off, int whence) { + return (lseek(fd,off,whence)); +} + +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_TARGET_OS) +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 int sizeof_fd_set(void) { return sizeof(fd_set); } +extern void hsFD_ZERO(fd_set *fds); +#endif + +// gettimeofday()-related + +#if !defined(mingw32_TARGET_OS) +#define TICK_FREQ 50 + +INLINE HsInt sizeofTimeVal(void) { return sizeof(struct timeval); } + +INLINE HsInt getTicksOfDay(void) +{ + struct timeval tv; + gettimeofday(&tv, (struct timezone *) NULL); + return (tv.tv_sec * TICK_FREQ + + tv.tv_usec * TICK_FREQ / 1000000); +} + +INLINE void setTimevalTicks(struct timeval *p, HsInt ticks) +{ + p->tv_sec = ticks / TICK_FREQ; + p->tv_usec = (ticks % TICK_FREQ) * (1000000 / TICK_FREQ); +} +#endif // !defined(mingw32_TARGET_OS) + +// Directory-related + +#if defined(mingw32_TARGET_OS) + +/* 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 + +/* 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; } + #endif /* __HSBASE_H__ */