1 /* -----------------------------------------------------------------------------
3 * (c) The University of Glasgow 2001-2004
5 * Definitions for package `base' which are visible in Haskell land.
7 * ---------------------------------------------------------------------------*/
13 # include "Nhc98BaseConfig.h"
15 #include "HsBaseConfig.h"
19 #undef PACKAGE_BUGREPORT
22 #undef PACKAGE_TARNAME
23 #undef PACKAGE_VERSION
25 /* Needed to get the macro version of errno on some OSs (eg. Solaris).
26 We must do this, because these libs are only compiled once, but
27 must work in both single-threaded and multi-threaded programs. */
37 #include <sys/types.h>
53 /* Ultra-ugly: OpenBSD uses broken macros for sigemptyset and sigfillset (missing casts) */
68 #if HAVE_SYS_UTSNAME_H
69 #include <sys/utsname.h>
73 # include <sys/time.h>
76 # if HAVE_SYS_TIMERS_H
78 # include <sys/timers.h>
85 #include <sys/timeb.h>
91 #include <sys/times.h>
93 #if HAVE_WINSOCK_H && defined(__MINGW32__)
103 # include <inttypes.h>
108 #if !defined(__MINGW32__) && !defined(irix_HOST_OS)
109 # if HAVE_SYS_RESOURCE_H
110 # include <sys/resource.h>
114 #if !HAVE_GETRUSAGE && HAVE_SYS_SYSCALL_H
115 # include <sys/syscall.h>
116 # if defined(SYS_GETRUSAGE) /* hpux_HOST_OS */
117 # define getrusage(a, b) syscall(SYS_GETRUSAGE, a, b)
118 # define HAVE_GETRUSAGE 1
124 #include <sys/wait.h>
131 #if defined(__MINGW32__)
132 /* in Win32Utils.c */
133 extern void maperrno (void);
134 extern HsWord64 getUSecOfDay(void);
137 #if defined(__MINGW32__)
144 #if HAVE_SYS_SELECT_H
145 #include <sys/select.h>
148 /* in inputReady.c */
149 extern int fdReady(int fd, int write, int msecs, int isSock);
152 extern HsInt nocldstop;
154 /* -----------------------------------------------------------------------------
155 64-bit operations, defined in longlong.c
156 -------------------------------------------------------------------------- */
158 #ifdef SUPPORT_LONG_LONGS
160 HsBool hs_gtWord64 (HsWord64, HsWord64);
161 HsBool hs_geWord64 (HsWord64, HsWord64);
162 HsBool hs_eqWord64 (HsWord64, HsWord64);
163 HsBool hs_neWord64 (HsWord64, HsWord64);
164 HsBool hs_ltWord64 (HsWord64, HsWord64);
165 HsBool hs_leWord64 (HsWord64, HsWord64);
167 HsBool hs_gtInt64 (HsInt64, HsInt64);
168 HsBool hs_geInt64 (HsInt64, HsInt64);
169 HsBool hs_eqInt64 (HsInt64, HsInt64);
170 HsBool hs_neInt64 (HsInt64, HsInt64);
171 HsBool hs_ltInt64 (HsInt64, HsInt64);
172 HsBool hs_leInt64 (HsInt64, HsInt64);
174 HsWord64 hs_remWord64 (HsWord64, HsWord64);
175 HsWord64 hs_quotWord64 (HsWord64, HsWord64);
177 HsInt64 hs_remInt64 (HsInt64, HsInt64);
178 HsInt64 hs_quotInt64 (HsInt64, HsInt64);
179 HsInt64 hs_negateInt64 (HsInt64);
180 HsInt64 hs_plusInt64 (HsInt64, HsInt64);
181 HsInt64 hs_minusInt64 (HsInt64, HsInt64);
182 HsInt64 hs_timesInt64 (HsInt64, HsInt64);
184 HsWord64 hs_and64 (HsWord64, HsWord64);
185 HsWord64 hs_or64 (HsWord64, HsWord64);
186 HsWord64 hs_xor64 (HsWord64, HsWord64);
187 HsWord64 hs_not64 (HsWord64);
189 HsWord64 hs_uncheckedShiftL64 (HsWord64, HsInt);
190 HsWord64 hs_uncheckedShiftRL64 (HsWord64, HsInt);
191 HsInt64 hs_uncheckedIShiftL64 (HsInt64, HsInt);
192 HsInt64 hs_uncheckedIShiftRA64 (HsInt64, HsInt);
193 HsInt64 hs_uncheckedIShiftRL64 (HsInt64, HsInt);
195 HsInt64 hs_intToInt64 (HsInt);
196 HsInt hs_int64ToInt (HsInt64);
197 HsWord64 hs_int64ToWord64 (HsInt64);
198 HsWord64 hs_wordToWord64 (HsWord);
199 HsWord hs_word64ToWord (HsWord64);
200 HsInt64 hs_word64ToInt64 (HsWord64);
202 #endif /* SUPPORT_LONG_LONGS */
204 /* -----------------------------------------------------------------------------
207 These functions are given as inlines here for when compiling via C,
208 but we also generate static versions into the cbits library for
209 when compiling to native code.
210 -------------------------------------------------------------------------- */
213 # if defined(_MSC_VER)
214 # define INLINE extern __inline
216 # define INLINE static inline
220 INLINE int __hscore_get_errno(void) { return errno; }
221 INLINE void __hscore_set_errno(int e) { errno = e; }
223 #if !defined(_MSC_VER)
224 INLINE int __hscore_s_isreg(mode_t m) { return S_ISREG(m); }
225 INLINE int __hscore_s_isdir(mode_t m) { return S_ISDIR(m); }
226 INLINE int __hscore_s_isfifo(mode_t m) { return S_ISFIFO(m); }
227 INLINE int __hscore_s_isblk(mode_t m) { return S_ISBLK(m); }
228 INLINE int __hscore_s_ischr(mode_t m) { return S_ISCHR(m); }
229 #if !defined(mingw32_HOST_OS) && !defined(__MINGW32__)
230 INLINE int __hscore_s_issock(mode_t m) { return S_ISSOCK(m); }
234 #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_WIN32)
236 __hscore_sigemptyset( sigset_t *set )
237 { return sigemptyset(set); }
240 __hscore_sigfillset( sigset_t *set )
241 { return sigfillset(set); }
244 __hscore_sigaddset( sigset_t * set, int s )
245 { return sigaddset(set,s); }
248 __hscore_sigdelset( sigset_t * set, int s )
249 { return sigdelset(set,s); }
252 __hscore_sigismember( sigset_t * set, int s )
253 { return sigismember(set,s); }
256 // This is used by dph:Data.Array.Parallel.Arr.BUArr, and shouldn't be
258 __hscore_memcpy_dst_off( char *dst, int dst_off, char *src, size_t sz )
259 { return memcpy(dst+dst_off, src, sz); }
262 __hscore_memcpy_src_off( char *dst, char *src, int src_off, size_t sz )
263 { return memcpy(dst, src+src_off, sz); }
280 #if defined(_MSC_VER)
283 return CONST_O_BINARY;
298 __hscore_o_wronly( void )
308 __hscore_o_rdwr( void )
318 __hscore_o_append( void )
328 __hscore_o_creat( void )
338 __hscore_o_excl( void )
348 __hscore_o_trunc( void )
358 __hscore_o_noctty( void )
368 __hscore_o_nonblock( void )
378 __hscore_seek_set( void )
384 __hscore_seek_end( void )
390 __hscore_ftruncate( int fd, off_t where )
392 #if defined(HAVE_FTRUNCATE)
393 return ftruncate(fd,where);
394 #elif defined(HAVE__CHSIZE)
395 return _chsize(fd,where);
397 // ToDo: we should use _chsize_s() on Windows which allows a 64-bit
398 // offset, but it doesn't seem to be available from mingw at this time
400 #error at least ftruncate or _chsize functions are required to build
405 __hscore_setmode( int fd, HsBool toBin )
407 #if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32)
408 return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT);
414 #if __GLASGOW_HASKELL__
416 #endif /* __GLASGOW_HASKELL__ */
418 #if defined(__MINGW32__)
419 // We want the versions of stat/fstat/lseek that use 64-bit offsets,
420 // and you have to ask for those explicitly. Unfortunately there
421 // doesn't seem to be a 64-bit version of truncate/ftruncate, so while
422 // hFileSize and hSeek will work with large files, hSetFileSize will not.
423 typedef struct _stati64 struct_stat;
424 typedef off64_t stsize_t;
426 typedef struct stat struct_stat;
427 typedef off_t stsize_t;
431 __hscore_sizeof_stat( void )
433 return sizeof(struct_stat);
436 INLINE time_t __hscore_st_mtime ( struct_stat* st ) { return st->st_mtime; }
437 INLINE stsize_t __hscore_st_size ( struct_stat* st ) { return st->st_size; }
438 #if !defined(_MSC_VER)
439 INLINE mode_t __hscore_st_mode ( struct_stat* st ) { return st->st_mode; }
440 INLINE dev_t __hscore_st_dev ( struct_stat* st ) { return st->st_dev; }
441 INLINE ino_t __hscore_st_ino ( struct_stat* st ) { return st->st_ino; }
444 #if defined(__MINGW32__)
445 INLINE int __hscore_stat(wchar_t *file, struct_stat *buf) {
446 return _wstati64(file,buf);
449 INLINE int __hscore_fstat(int fd, struct_stat *buf) {
450 return _fstati64(fd,buf);
452 INLINE int __hscore_lstat(wchar_t *fname, struct_stat *buf )
454 return _wstati64(fname,buf);
457 INLINE int __hscore_stat(char *file, struct_stat *buf) {
458 return stat(file,buf);
461 INLINE int __hscore_fstat(int fd, struct_stat *buf) {
462 return fstat(fd,buf);
465 INLINE int __hscore_lstat( const char *fname, struct stat *buf )
468 return lstat(fname, buf);
470 return stat(fname, buf);
476 INLINE tcflag_t __hscore_lflag( struct termios* ts ) { return ts->c_lflag; }
479 __hscore_poke_lflag( struct termios* ts, tcflag_t t ) { ts->c_lflag = t; }
481 INLINE unsigned char*
482 __hscore_ptr_c_cc( struct termios* ts )
483 { return (unsigned char*) &ts->c_cc; }
486 __hscore_sizeof_termios( void )
489 return sizeof(struct termios);
496 #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_WIN32)
498 __hscore_sizeof_sigset_t( void )
500 return sizeof(sigset_t);
505 __hscore_echo( void )
516 __hscore_tcsanow( void )
527 __hscore_icanon( void )
536 INLINE int __hscore_vmin( void )
545 INLINE int __hscore_vtime( void )
554 INLINE int __hscore_sigttou( void )
563 INLINE int __hscore_sig_block( void )
572 INLINE int __hscore_sig_setmask( void )
582 INLINE size_t __hscore_sizeof_siginfo_t (void)
584 return sizeof(siginfo_t);
589 __hscore_f_getfl( void )
599 __hscore_f_setfl( void )
609 __hscore_f_setfd( void )
619 __hscore_fd_cloexec( void )
628 // defined in rts/RtsStartup.c.
629 extern void* __hscore_get_saved_termios(int fd);
630 extern void __hscore_set_saved_termios(int fd, void* ts);
632 INLINE int __hscore_hs_fileno (FILE *f) { return fileno (f); }
635 INLINE int __hscore_open(wchar_t *file, int how, mode_t mode) {
636 if ((how & O_WRONLY) || (how & O_RDWR) || (how & O_APPEND))
637 return _wsopen(file,how | _O_NOINHERIT,_SH_DENYRW,mode);
638 // _O_NOINHERIT: see #2650
640 return _wsopen(file,how | _O_NOINHERIT,_SH_DENYWR,mode);
641 // _O_NOINHERIT: see #2650
644 INLINE int __hscore_open(char *file, int how, mode_t mode) {
645 return open(file,how,mode);
649 // These are wrapped because on some OSs (eg. Linux) they are
650 // macros which redirect to the 64-bit-off_t versions when large file
651 // support is enabled.
653 #if defined(__MINGW32__)
654 INLINE off64_t __hscore_lseek(int fd, off64_t off, int whence) {
655 return (_lseeki64(fd,off,whence));
658 INLINE off_t __hscore_lseek(int fd, off_t off, int whence) {
659 return (lseek(fd,off,whence));
663 // select-related stuff
665 #if !defined(__MINGW32__)
666 INLINE int hsFD_SETSIZE(void) { return FD_SETSIZE; }
667 INLINE int hsFD_ISSET(int fd, fd_set *fds) { return FD_ISSET(fd, fds); }
668 INLINE void hsFD_SET(int fd, fd_set *fds) { FD_SET(fd, fds); }
669 INLINE HsInt sizeof_fd_set(void) { return sizeof(fd_set); }
670 extern void hsFD_ZERO(fd_set *fds);
673 // gettimeofday()-related
675 #if !defined(__MINGW32__)
677 INLINE HsInt sizeofTimeVal(void) { return sizeof(struct timeval); }
679 INLINE HsWord64 getUSecOfDay(void)
682 gettimeofday(&tv, (struct timezone *) NULL);
683 // Don't forget to cast *before* doing the arithmetic, otherwise
684 // the arithmetic happens at the type of tv_sec, which is probably
686 return ((HsWord64)tv.tv_sec * 1000000 + (HsWord64)tv.tv_usec);
689 INLINE void setTimevalTicks(struct timeval *p, HsWord64 usecs)
691 p->tv_sec = usecs / 1000000;
692 p->tv_usec = usecs % 1000000;
694 #endif /* !defined(__MINGW32__) */
696 /* ToDo: write a feature test that doesn't assume 'environ' to
697 * be in scope at link-time. */
698 extern char** environ;
699 INLINE char **__hscore_environ() { return environ; }
701 /* lossless conversions between pointers and integral types */
702 INLINE void * __hscore_from_uintptr(uintptr_t n) { return (void *)n; }
703 INLINE void * __hscore_from_intptr (intptr_t n) { return (void *)n; }
704 INLINE uintptr_t __hscore_to_uintptr (void *p) { return (uintptr_t)p; }
705 INLINE intptr_t __hscore_to_intptr (void *p) { return (intptr_t)p; }
707 void errorBelch2(const char*s, char *t);
708 void debugBelch2(const char*s, char *t);
710 #if !defined(mingw32_HOST_OS) && !defined(__MINGW32__)
712 INLINE int fcntl_read(int fd, int cmd) {
713 return fcntl(fd, cmd);
715 INLINE int fcntl_write(int fd, int cmd, long arg) {
716 return fcntl(fd, cmd, arg);
718 INLINE int fcntl_lock(int fd, int cmd, struct flock *lock) {
719 return fcntl(fd, cmd, lock);
724 #endif /* __HSBASE_H__ */