diff options
-rw-r--r-- | System/Posix/Directory.hsc | 2 | ||||
-rw-r--r-- | System/Posix/Process.hsc | 2 | ||||
-rw-r--r-- | System/Posix/Time.hsc | 2 | ||||
-rw-r--r-- | System/Posix/Unistd.hsc | 2 | ||||
-rw-r--r-- | System/Posix/User.hsc | 6 | ||||
-rw-r--r-- | cbits/HsUnix.c | 52 | ||||
-rw-r--r-- | include/HsUnix.h | 31 |
7 files changed, 90 insertions, 7 deletions
diff --git a/System/Posix/Directory.hsc b/System/Posix/Directory.hsc index 35fe291..3f676ce 100644 --- a/System/Posix/Directory.hsc +++ b/System/Posix/Directory.hsc @@ -61,7 +61,7 @@ openDirStream name = dirp <- throwErrnoPathIfNull "openDirStream" name $ c_opendir s return (DirStream dirp) -foreign import ccall unsafe "opendir" +foreign import ccall unsafe "__hsunix_opendir" c_opendir :: CString -> IO (Ptr CDir) -- | @readDirStream dp@ calls @readdir@ to obtain the diff --git a/System/Posix/Process.hsc b/System/Posix/Process.hsc index 147b508..cf60844 100644 --- a/System/Posix/Process.hsc +++ b/System/Posix/Process.hsc @@ -173,7 +173,7 @@ getProcessTimes = do type CTms = () -foreign import ccall unsafe "times" +foreign import ccall unsafe "__hsunix_times" c_times :: Ptr CTms -> IO CClock -- ----------------------------------------------------------------------------- diff --git a/System/Posix/Time.hsc b/System/Posix/Time.hsc index 0fbce38..1d2e107 100644 --- a/System/Posix/Time.hsc +++ b/System/Posix/Time.hsc @@ -33,5 +33,5 @@ import Foreign.C epochTime :: IO EpochTime epochTime = throwErrnoIfMinus1 "epochTime" (c_time nullPtr) -foreign import ccall unsafe "time" +foreign import ccall unsafe "__hsunix_time" c_time :: Ptr CTime -> IO CTime diff --git a/System/Posix/Unistd.hsc b/System/Posix/Unistd.hsc index f0cac21..4aefd60 100644 --- a/System/Posix/Unistd.hsc +++ b/System/Posix/Unistd.hsc @@ -158,7 +158,7 @@ nanosleep nsecs = do data CTimeSpec -foreign import ccall safe "nanosleep" +foreign import ccall safe "__hsunix_nanosleep" c_nanosleep :: Ptr CTimeSpec -> Ptr CTimeSpec -> IO CInt #endif diff --git a/System/Posix/User.hsc b/System/Posix/User.hsc index 47a7a72..88150a0 100644 --- a/System/Posix/User.hsc +++ b/System/Posix/User.hsc @@ -292,7 +292,7 @@ getUserEntryForID uid = do peekElemOff pppw 0 unpackUserEntry ppw -foreign import ccall unsafe "getpwuid_r" +foreign import ccall unsafe "__hsunix_getpwuid_r" c_getpwuid_r :: CUid -> Ptr CPasswd -> CString -> CSize -> Ptr (Ptr CPasswd) -> IO CInt #elif HAVE_GETPWUID @@ -328,7 +328,7 @@ getUserEntryForName name = do (Just name) unpackUserEntry ppw -foreign import ccall unsafe "getpwnam_r" +foreign import ccall unsafe "__hsunix_getpwnam_r" c_getpwnam_r :: CString -> Ptr CPasswd -> CString -> CSize -> Ptr (Ptr CPasswd) -> IO CInt #elif HAVE_GETPWNAM @@ -359,7 +359,7 @@ getAllUserEntries = else do thisentry <- unpackUserEntry ppw worker (thisentry : accum) -foreign import ccall unsafe "getpwent" +foreign import ccall unsafe "__hsunix_getpwent" c_getpwent :: IO (Ptr CPasswd) foreign import ccall unsafe "setpwent" c_setpwent :: IO () diff --git a/cbits/HsUnix.c b/cbits/HsUnix.c index c56b804..037eb59 100644 --- a/cbits/HsUnix.c +++ b/cbits/HsUnix.c @@ -42,6 +42,58 @@ int __hsunix_mknod(const char *pathname, mode_t mode, dev_t dev) return mknod(pathname,mode,dev); } +#ifdef HAVE_GETPWENT +// getpwent is a macro on some platforms, so we need a wrapper: +struct passwd *__hsunix_getpwent(void) +{ + return getpwent(); +} +#endif + +#if HAVE_GETPWNAM_R +// getpwnam_r is a macro on some platforms, so we need a wrapper: +int __hsunix_getpwnam_r(const char *name, struct passwd *pw, char *buffer, + size_t buflen, struct passwd **result) +{ + return getpwnam_r(name, pw, buffer, buflen, result); +} +#endif + +#ifdef HAVE_GETPWUID_R +// getpwuid_r is a macro on some platforms, so we need a wrapper: +int __hsunix_getpwuid_r(uid_t uid, struct passwd *pw, char *buffer, + size_t buflen, struct passwd **result) +{ + return getpwuid_r(uid, pw, buffer, buflen, result); +} +#endif + +#ifdef HAVE_NANOSLEEP +// nanosleep is a macro on some platforms, so we need a wrapper: +int __hsunix_nanosleep(const struct timespec *rqtp, struct timespec *rmtp) +{ + return nanosleep(rqtp, rmtp); +} +#endif + +// opendir is a macro on some platforms, so we need a wrapper: +DIR *__hsunix_opendir(const char *filename) +{ + return opendir(filename); +} + +// time is a macro on some platforms, so we need a wrapper: +time_t __hsunix_time(time_t *tloc) +{ + return time(tloc); +} + +// times is a macro on some platforms, so we need a wrapper: +clock_t __hsunix_times(struct tms *tp) +{ + return times(tp); +} + #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 diff --git a/include/HsUnix.h b/include/HsUnix.h index d460698..cb8d466 100644 --- a/include/HsUnix.h +++ b/include/HsUnix.h @@ -127,6 +127,37 @@ int __hsunix_lstat(const char *path, struct stat *buf); // lstat is a macro on some platforms, so we need a wrapper: int __hsunix_mknod(const char *pathname, mode_t mode, dev_t dev); +#ifdef HAVE_GETPWENT +// getpwent is a macro on some platforms, so we need a wrapper: +struct passwd *__hsunix_getpwent(void); +#endif + +#if HAVE_GETPWNAM_R +// getpwnam_r is a macro on some platforms, so we need a wrapper: +int __hsunix_getpwnam_r(const char *, struct passwd *, char *, size_t, + struct passwd **); +#endif + +#ifdef HAVE_GETPWUID_R +// getpwuid_r is a macro on some platforms, so we need a wrapper: +int __hsunix_getpwuid_r(uid_t, struct passwd *, char *, size_t, + struct passwd **); +#endif + +#ifdef HAVE_NANOSLEEP +// nanosleep is a macro on some platforms, so we need a wrapper: +int __hsunix_nanosleep(const struct timespec *, struct timespec *); +#endif + +// opendir is a macro on some platforms, so we need a wrapper: +DIR *__hsunix_opendir(const char *); + +// time is a macro on some platforms, so we need a wrapper: +time_t __hsunix_time(time_t *); + +// times is a macro on some platforms, so we need a wrapper: +clock_t __hsunix_times(struct tms *); + #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 |