1 /* -----------------------------------------------------------------------------
3 * (c) The University of Glasgow 2001-2004
5 * Definitions for package `base' which are visible in Haskell land.
7 * ---------------------------------------------------------------------------*/
12 #include "HsBaseConfig.h"
15 #undef PACKAGE_BUGREPORT
18 #undef PACKAGE_TARNAME
19 #undef PACKAGE_VERSION
21 /* Needed to get the macro version of errno on some OSs (eg. Solaris).
22 We must do this, because these libs are only compiled once, but
23 must work in both single-threaded and multi-threaded programs. */
33 #include <sys/types.h>
49 /* Ultra-ugly: OpenBSD uses broken macros for sigemptyset and sigfillset (missing casts) */
67 #if HAVE_SYS_UTSNAME_H
68 #include <sys/utsname.h>
72 # include <sys/time.h>
75 # if HAVE_SYS_TIMERS_H
77 # include <sys/timers.h>
84 #include <sys/timeb.h>
90 #include <sys/times.h>
92 #if HAVE_WINSOCK_H && defined(__MINGW32__)
102 # include <inttypes.h>
107 #if !defined(__MINGW32__) && !defined(irix_HOST_OS)
108 # if HAVE_SYS_RESOURCE_H
109 # include <sys/resource.h>
113 #if !HAVE_GETRUSAGE && HAVE_SYS_SYSCALL_H
114 # include <sys/syscall.h>
115 # if defined(SYS_GETRUSAGE) /* hpux_HOST_OS */
116 # define getrusage(a, b) syscall(SYS_GETRUSAGE, a, b)
117 # define HAVE_GETRUSAGE 1
123 #include <sys/wait.h>
128 #include "lockFile.h"
129 #include "dirUtils.h"
132 #if defined(__MINGW32__)
133 /* in Win32Utils.c */
134 extern void maperrno (void);
135 extern HsWord64 getUSecOfDay(void);
138 #if defined(__MINGW32__)
145 #if HAVE_SYS_SELECT_H
146 #include <sys/select.h>
149 /* in inputReady.c */
150 extern int fdReady(int fd, int write, int msecs, int isSock);
153 extern HsInt nocldstop;
155 /* -----------------------------------------------------------------------------
156 64-bit operations, defined in longlong.c
157 -------------------------------------------------------------------------- */
159 #ifdef SUPPORT_LONG_LONGS
161 HsBool hs_gtWord64 (HsWord64, HsWord64);
162 HsBool hs_geWord64 (HsWord64, HsWord64);
163 HsBool hs_eqWord64 (HsWord64, HsWord64);
164 HsBool hs_neWord64 (HsWord64, HsWord64);
165 HsBool hs_ltWord64 (HsWord64, HsWord64);
166 HsBool hs_leWord64 (HsWord64, HsWord64);
168 HsBool hs_gtInt64 (HsInt64, HsInt64);
169 HsBool hs_geInt64 (HsInt64, HsInt64);
170 HsBool hs_eqInt64 (HsInt64, HsInt64);
171 HsBool hs_neInt64 (HsInt64, HsInt64);
172 HsBool hs_ltInt64 (HsInt64, HsInt64);
173 HsBool hs_leInt64 (HsInt64, HsInt64);
175 HsWord64 hs_remWord64 (HsWord64, HsWord64);
176 HsWord64 hs_quotWord64 (HsWord64, HsWord64);
178 HsInt64 hs_remInt64 (HsInt64, HsInt64);
179 HsInt64 hs_quotInt64 (HsInt64, HsInt64);
180 HsInt64 hs_negateInt64 (HsInt64);
181 HsInt64 hs_plusInt64 (HsInt64, HsInt64);
182 HsInt64 hs_minusInt64 (HsInt64, HsInt64);
183 HsInt64 hs_timesInt64 (HsInt64, HsInt64);
185 HsWord64 hs_and64 (HsWord64, HsWord64);
186 HsWord64 hs_or64 (HsWord64, HsWord64);
187 HsWord64 hs_xor64 (HsWord64, HsWord64);
188 HsWord64 hs_not64 (HsWord64);
190 HsWord64 hs_uncheckedShiftL64 (HsWord64, HsInt);
191 HsWord64 hs_uncheckedShiftRL64 (HsWord64, HsInt);
192 HsInt64 hs_uncheckedIShiftL64 (HsInt64, HsInt);
193 HsInt64 hs_uncheckedIShiftRA64 (HsInt64, HsInt);
194 HsInt64 hs_uncheckedIShiftRL64 (HsInt64, HsInt);
196 HsInt64 hs_intToInt64 (HsInt);
197 HsInt hs_int64ToInt (HsInt64);
198 HsWord64 hs_int64ToWord64 (HsInt64);
199 HsWord64 hs_wordToWord64 (HsWord);
200 HsWord hs_word64ToWord (HsWord64);
201 HsInt64 hs_word64ToInt64 (HsWord64);
203 HsWord64 hs_integerToWord64 (HsInt sa, StgByteArray /* Really: mp_limb_t* */ da);
204 HsInt64 hs_integerToInt64 (HsInt sa, StgByteArray /* Really: mp_limb_t* */ da);
206 #endif /* SUPPORT_LONG_LONGS */
208 /* -----------------------------------------------------------------------------
211 These functions are given as inlines here for when compiling via C,
212 but we also generate static versions into the cbits library for
213 when compiling to native code.
214 -------------------------------------------------------------------------- */
217 # if defined(_MSC_VER)
218 # define INLINE extern __inline
220 # define INLINE static inline
224 INLINE int __hscore_get_errno(void) { return errno; }
225 INLINE void __hscore_set_errno(int e) { errno = e; }
227 #if !defined(_MSC_VER)
228 INLINE int __hscore_s_isreg(mode_t m) { return S_ISREG(m); }
229 INLINE int __hscore_s_isdir(mode_t m) { return S_ISDIR(m); }
230 INLINE int __hscore_s_isfifo(mode_t m) { return S_ISFIFO(m); }
231 INLINE int __hscore_s_isblk(mode_t m) { return S_ISBLK(m); }
232 INLINE int __hscore_s_ischr(mode_t m) { return S_ISCHR(m); }
234 INLINE int __hscore_s_issock(mode_t m) { return S_ISSOCK(m); }
238 #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_WIN32)
240 __hscore_sigemptyset( sigset_t *set )
241 { return sigemptyset(set); }
244 __hscore_sigfillset( sigset_t *set )
245 { return sigfillset(set); }
248 __hscore_sigaddset( sigset_t * set, int s )
249 { return sigaddset(set,s); }
252 __hscore_sigdelset( sigset_t * set, int s )
253 { return sigdelset(set,s); }
256 __hscore_sigismember( sigset_t * set, int s )
257 { return sigismember(set,s); }
261 __hscore_memcpy_dst_off( char *dst, int dst_off, char *src, size_t sz )
262 { return memcpy(dst+dst_off, src, sz); }
265 __hscore_memcpy_src_off( char *dst, char *src, int src_off, size_t sz )
266 { return memcpy(dst, src+src_off, sz); }
269 __hscore_supportsTextMode()
271 #if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32)
272 return HS_BOOL_FALSE;
293 #if defined(_MSC_VER)
296 return CONST_O_BINARY;
311 __hscore_o_wronly( void )
321 __hscore_o_rdwr( void )
331 __hscore_o_append( void )
341 __hscore_o_creat( void )
351 __hscore_o_excl( void )
361 __hscore_o_trunc( void )
371 __hscore_o_noctty( void )
381 __hscore_o_nonblock( void )
391 __hscore_seek_set( void )
397 __hscore_seek_end( void )
403 __hscore_ftruncate( int fd, off_t where )
405 #if defined(HAVE_FTRUNCATE)
406 return ftruncate(fd,where);
407 #elif defined(HAVE__CHSIZE)
408 return _chsize(fd,where);
410 #error at least ftruncate or _chsize functions are required to build
415 __hscore_setmode( int fd, HsBool toBin )
417 #if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32)
418 return setmode(fd,(toBin == HS_BOOL_TRUE) ? _O_BINARY : _O_TEXT);
424 #if __GLASGOW_HASKELL__
427 __hscore_PrelHandle_write( int fd, void *ptr, HsInt off, int sz )
429 return write(fd,(char *)ptr + off, sz);
433 __hscore_PrelHandle_read( int fd, void *ptr, HsInt off, int sz )
435 return read(fd,(char *)ptr + off, sz);
439 #if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32)
441 __hscore_PrelHandle_send( int fd, void *ptr, HsInt off, int sz )
443 return send(fd,(char *)ptr + off, sz, 0);
447 __hscore_PrelHandle_recv( int fd, void *ptr, HsInt off, int sz )
449 return recv(fd,(char *)ptr + off, sz, 0);
453 #endif /* __GLASGOW_HASKELL__ */
456 __hscore_mkdir( char *pathName, int mode )
458 #if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32)
459 return mkdir(pathName);
461 return mkdir(pathName,mode);
466 __hscore_lstat( const char *fname, struct stat *st )
469 return lstat(fname, st);
471 return stat(fname, st);
476 __hscore_d_name( struct dirent* d )
482 __hscore_end_of_dir( void )
484 return READDIR_ERRNO_EOF;
488 __hscore_free_dirent(struct dirent *dEnt)
496 __hscore_sizeof_stat( void )
498 return sizeof(struct stat);
501 INLINE time_t __hscore_st_mtime ( struct stat* st ) { return st->st_mtime; }
502 INLINE off_t __hscore_st_size ( struct stat* st ) { return st->st_size; }
503 #if !defined(_MSC_VER)
504 INLINE mode_t __hscore_st_mode ( struct stat* st ) { return st->st_mode; }
508 INLINE tcflag_t __hscore_lflag( struct termios* ts ) { return ts->c_lflag; }
511 __hscore_poke_lflag( struct termios* ts, tcflag_t t ) { ts->c_lflag = t; }
513 INLINE unsigned char*
514 __hscore_ptr_c_cc( struct termios* ts )
515 { return (unsigned char*) &ts->c_cc; }
518 __hscore_sizeof_termios( void )
521 return sizeof(struct termios);
528 #if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(_WIN32)
530 __hscore_sizeof_sigset_t( void )
532 return sizeof(sigset_t);
537 __hscore_echo( void )
548 __hscore_tcsanow( void )
559 __hscore_icanon( void )
568 INLINE int __hscore_vmin( void )
577 INLINE int __hscore_vtime( void )
586 INLINE int __hscore_sigttou( void )
595 INLINE int __hscore_sig_block( void )
604 INLINE int __hscore_sig_setmask( void )
614 __hscore_f_getfl( void )
624 __hscore_f_setfl( void )
633 // defined in rts/RtsStartup.c.
634 extern void* __hscore_get_saved_termios(int fd);
635 extern void __hscore_set_saved_termios(int fd, void* ts);
637 INLINE int __hscore_hs_fileno (FILE *f) { return fileno (f); }
639 INLINE int __hscore_open(char *file, int how, mode_t mode) {
641 if ((how & O_WRONLY) || (how & O_RDWR) || (how & O_APPEND))
642 return _sopen(file,how,_SH_DENYRW,mode);
644 return _sopen(file,how,_SH_DENYWR,mode);
646 return open(file,how,mode);
650 // These are wrapped because on some OSs (eg. Linux) they are
651 // macros which redirect to the 64-bit-off_t versions when large file
652 // support is enabled.
654 INLINE off_t __hscore_lseek(int fd, off_t off, int whence) {
655 return (lseek(fd,off,whence));
658 INLINE int __hscore_stat(char *file, struct stat *buf) {
659 return (stat(file,buf));
662 INLINE int __hscore_fstat(int fd, struct stat *buf) {
663 return (fstat(fd,buf));
666 // select-related stuff
668 #if !defined(__MINGW32__)
669 INLINE int hsFD_SETSIZE(void) { return FD_SETSIZE; }
670 INLINE void hsFD_CLR(int fd, fd_set *fds) { FD_CLR(fd, fds); }
671 INLINE int hsFD_ISSET(int fd, fd_set *fds) { return FD_ISSET(fd, fds); }
672 INLINE void hsFD_SET(int fd, fd_set *fds) { FD_SET(fd, fds); }
673 INLINE HsInt sizeof_fd_set(void) { return sizeof(fd_set); }
674 extern void hsFD_ZERO(fd_set *fds);
677 // gettimeofday()-related
679 #if !defined(__MINGW32__)
681 INLINE HsInt sizeofTimeVal(void) { return sizeof(struct timeval); }
683 INLINE HsWord64 getUSecOfDay(void)
686 gettimeofday(&tv, (struct timezone *) NULL);
687 // Don't forget to cast *before* doing the arithmetic, otherwise
688 // the arithmetic happens at the type of tv_sec, which is probably
690 return ((HsWord64)tv.tv_sec * 1000000 + (HsWord64)tv.tv_usec);
693 INLINE void setTimevalTicks(struct timeval *p, HsWord64 usecs)
695 p->tv_sec = usecs / 1000000;
696 p->tv_usec = usecs % 1000000;
698 #endif /* !defined(__MINGW32__) */
700 /* ToDo: write a feature test that doesn't assume 'environ' to
701 * be in scope at link-time. */
702 extern char** environ;
703 INLINE char **__hscore_environ() { return environ; }
705 /* lossless conversions between pointers and integral types */
706 INLINE void * __hscore_from_uintptr(uintptr_t n) { return (void *)n; }
707 INLINE void * __hscore_from_intptr (intptr_t n) { return (void *)n; }
708 INLINE uintptr_t __hscore_to_uintptr (void *p) { return (uintptr_t)p; }
709 INLINE intptr_t __hscore_to_intptr (void *p) { return (intptr_t)p; }
711 #endif /* __HSBASE_H__ */