unix 2.4.2.0 → 2.5.0.0
raw patch · 18 files changed
+287/−108 lines, 18 filesdep ~basePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base
API changes (from Hackage documentation)
- System.Posix.IO: stdError :: Fd
- System.Posix.IO: stdInput :: Fd
- System.Posix.IO: stdOutput :: Fd
+ System.Posix.Error: throwErrnoPathIfMinus1Retry_ :: Num a => String -> FilePath -> IO a -> IO ()
+ System.Posix.IO: stdInput, stdError, stdOutput :: Fd
+ System.Posix.Process: createProcessGroupFor :: ProcessID -> IO ProcessGroupID
+ System.Posix.Process: getProcessGroupIDOf :: ProcessID -> IO ProcessGroupID
+ System.Posix.Process: setProcessGroupIDOf :: ProcessID -> ProcessGroupID -> IO ()
- System.Posix.DynamicLinker: dlopen :: String -> [RTLDFlags] -> IO DL
+ System.Posix.DynamicLinker: dlopen :: FilePath -> [RTLDFlags] -> IO DL
Files
- System/Posix/Directory.hsc +26/−10
- System/Posix/DynamicLinker.hsc +10/−4
- System/Posix/DynamicLinker/Module.hsc +8/−1
- System/Posix/Env.hsc +34/−8
- System/Posix/Error.hs +6/−1
- System/Posix/Files.hsc +44/−24
- System/Posix/IO.hsc +17/−12
- System/Posix/Process.hsc +88/−19
- System/Posix/Process/Internals.hs +2/−2
- System/Posix/Signals.hsc +2/−2
- System/Posix/Temp.hsc +19/−4
- System/Posix/User.hsc +13/−13
- configure +1/−1
- configure.ac +1/−1
- include/HsUnix.h +3/−1
- include/HsUnixConfig.h +3/−0
- include/HsUnixConfig.h.in +3/−0
- unix.cabal +7/−5
System/Posix/Directory.hsc view
@@ -39,14 +39,30 @@ import System.Posix.Types import Foreign import Foreign.C+#if __GLASGOW_HASKELL__ > 700+import System.Posix.Internals (withFilePath, peekFilePath)+#elif __GLASGOW_HASKELL__ > 611+import System.Posix.Internals (withFilePath) +peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString+#else+withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString++peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString+#endif+ -- | @createDirectory dir mode@ calls @mkdir@ to -- create a new directory, @dir@, with permissions based on -- @mode@. createDirectory :: FilePath -> FileMode -> IO () createDirectory name mode =- withCString name $ \s -> - throwErrnoPathIfMinus1_ "createDirectory" name (c_mkdir s mode) + withFilePath name $ \s -> + throwErrnoPathIfMinus1Retry_ "createDirectory" name (c_mkdir s mode) + -- POSIX doesn't allow mkdir() to return EINTR, but it does on+ -- OS X (#5184), so we need the Retry variant here. foreign import ccall unsafe "mkdir" c_mkdir :: CString -> CMode -> IO CInt@@ -57,8 +73,8 @@ -- directory stream for @dir@. openDirStream :: FilePath -> IO DirStream openDirStream name =- withCString name $ \s -> do- dirp <- throwErrnoPathIfNull "openDirStream" name $ c_opendir s+ withFilePath name $ \s -> do+ dirp <- throwErrnoPathIfNullRetry "openDirStream" name $ c_opendir s return (DirStream dirp) foreign import ccall unsafe "__hsunix_opendir"@@ -80,7 +96,7 @@ if (dEnt == nullPtr) then return [] else do- entry <- (d_name dEnt >>= peekCString)+ entry <- (d_name dEnt >>= peekFilePath) c_freeDirEnt dEnt return entry else do errno <- getErrno@@ -115,7 +131,7 @@ -- the directory stream @dp@. closeDirStream :: DirStream -> IO () closeDirStream (DirStream dirp) = do- throwErrnoIfMinus1_ "closeDirStream" (c_closedir dirp)+ throwErrnoIfMinus1Retry_ "closeDirStream" (c_closedir dirp) foreign import ccall unsafe "closedir" c_closedir :: Ptr CDir -> IO CInt@@ -152,7 +168,7 @@ where go p bytes = do p' <- c_getcwd p (fromIntegral bytes) if p' /= nullPtr - then do s <- peekCString p'+ then do s <- peekFilePath p' free p' return s else do errno <- getErrno@@ -173,7 +189,7 @@ changeWorkingDirectory :: FilePath -> IO () changeWorkingDirectory path = modifyIOError (`ioeSetFileName` path) $- withCString path $ \s -> + withFilePath path $ \s -> throwErrnoIfMinus1Retry_ "changeWorkingDirectory" (c_chdir s) foreign import ccall unsafe "chdir"@@ -182,7 +198,7 @@ removeDirectory :: FilePath -> IO () removeDirectory path = modifyIOError (`ioeSetFileName` path) $- withCString path $ \s ->+ withFilePath path $ \s -> throwErrnoIfMinus1Retry_ "removeDirectory" (c_rmdir s) foreign import ccall unsafe "rmdir"@@ -190,7 +206,7 @@ changeWorkingDirectoryFd :: Fd -> IO () changeWorkingDirectoryFd (Fd fd) = - throwErrnoIfMinus1_ "changeWorkingDirectoryFd" (c_fchdir fd)+ throwErrnoIfMinus1Retry_ "changeWorkingDirectoryFd" (c_fchdir fd) foreign import ccall unsafe "fchdir" c_fchdir :: CInt -> IO CInt
System/Posix/DynamicLinker.hsc view
@@ -51,11 +51,17 @@ import Control.Exception ( bracket ) import Control.Monad ( liftM ) import Foreign.Ptr ( Ptr, nullPtr, FunPtr, nullFunPtr )-import Foreign.C.String ( withCString, peekCString )+import Foreign.C.String+#if __GLASGOW_HASKELL__ > 611+import System.Posix.Internals ( withFilePath )+#else+withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString+#endif -dlopen :: String -> [RTLDFlags] -> IO DL+dlopen :: FilePath -> [RTLDFlags] -> IO DL dlopen path flags = do- withCString path $ \ p -> do+ withFilePath path $ \ p -> do liftM DLHandle $ throwDLErrorIf "dlopen" (== nullPtr) $ c_dlopen p (packRTLDFlags flags) dlclose :: DL -> IO ()@@ -70,7 +76,7 @@ dlsym :: DL -> String -> IO (FunPtr a) dlsym source symbol = do- withCString symbol $ \ s -> do+ withCAString symbol $ \ s -> do throwDLErrorIf "dlsym" (== nullFunPtr) $ c_dlsym (packDL source) s withDL :: String -> [RTLDFlags] -> (DL -> IO a) -> IO a
System/Posix/DynamicLinker/Module.hsc view
@@ -58,8 +58,15 @@ import System.Posix.DynamicLinker import Foreign.Ptr ( Ptr, nullPtr, FunPtr )+#if __GLASGOW_HASKELL__ > 611+import System.Posix.Internals ( withFilePath )+#else import Foreign.C.String ( withCString ) +withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString+#endif+ -- abstract handle for dynamically loaded module (EXPORTED) -- newtype Module = Module (Ptr ())@@ -72,7 +79,7 @@ moduleOpen :: String -> [RTLDFlags] -> IO Module moduleOpen file flags = do- modPtr <- withCString file $ \ modAddr -> c_dlopen modAddr (packRTLDFlags flags)+ modPtr <- withFilePath file $ \ modAddr -> c_dlopen modAddr (packRTLDFlags flags) if (modPtr == nullPtr) then moduleError >>= \ err -> ioError (userError ("dlopen: " ++ err)) else return $ Module modPtr
System/Posix/Env.hsc view
@@ -33,14 +33,28 @@ import Foreign.Storable import Control.Monad ( liftM ) import Data.Maybe ( fromMaybe )+#if __GLASGOW_HASKELL__ > 700+import System.Posix.Internals (withFilePath, peekFilePath)+#elif __GLASGOW_HASKELL__ > 611+import System.Posix.Internals (withFilePath) +peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString+#else+withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString++peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString+#endif+ -- |'getEnv' looks up a variable in the environment. getEnv :: String -> IO (Maybe String) getEnv name = do- litstring <- withCString name c_getenv+ litstring <- withFilePath name c_getenv if litstring /= nullPtr- then liftM Just $ peekCString litstring+ then liftM Just $ peekFilePath litstring else return Nothing -- |'getEnvDefault' is a wrapper around 'getEnv' where the@@ -55,12 +69,24 @@ getEnvironmentPrim :: IO [String] getEnvironmentPrim = do- c_environ <- peek c_environ_p+ c_environ <- getCEnviron arr <- peekArray0 nullPtr c_environ- mapM peekCString arr+ mapM peekFilePath arr +getCEnviron :: IO (Ptr CString)+#if darwin_HOST_OS+-- You should not access _environ directly on Darwin in a bundle/shared library.+-- See #2458 and http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man7/environ.7.html+getCEnviron = nsGetEnviron >>= peek++foreign import ccall unsafe "_NSGetEnviron"+ nsGetEnviron :: IO (Ptr (Ptr CString))+#else+getCEnviron = peek c_environ_p+ foreign import ccall unsafe "&environ" c_environ_p :: Ptr (Ptr CString)+#endif -- |'getEnvironment' retrieves the entire environment as a -- list of @(key,value)@ pairs.@@ -79,7 +105,7 @@ unsetEnv :: String -> IO () #ifdef HAVE_UNSETENV -unsetEnv name = withCString name $ \ s ->+unsetEnv name = withFilePath name $ \ s -> throwErrnoIfMinus1_ "unsetenv" (c_unsetenv s) foreign import ccall unsafe "__hsunix_unsetenv"@@ -92,7 +118,7 @@ -- and is equivalent to @setEnv(key,value,True{-overwrite-})@. putEnv :: String -> IO ()-putEnv keyvalue = withCString keyvalue $ \s ->+putEnv keyvalue = withFilePath keyvalue $ \s -> throwErrnoIfMinus1_ "putenv" (c_putenv s) foreign import ccall unsafe "putenv"@@ -108,8 +134,8 @@ setEnv :: String -> String -> Bool {-overwrite-} -> IO () #ifdef HAVE_SETENV setEnv key value ovrwrt = do- withCString key $ \ keyP ->- withCString value $ \ valueP ->+ withFilePath key $ \ keyP ->+ withFilePath value $ \ valueP -> throwErrnoIfMinus1_ "setenv" $ c_setenv keyP valueP (fromIntegral (fromEnum ovrwrt))
System/Posix/Error.hs view
@@ -21,7 +21,8 @@ throwErrnoPathIfNullRetry, throwErrnoPathIfMinus1, throwErrnoPathIfMinus1_,- throwErrnoPathIfMinus1Retry+ throwErrnoPathIfMinus1Retry,+ throwErrnoPathIfMinus1Retry_ ) where import Foreign@@ -30,6 +31,10 @@ throwErrnoPathIfMinus1Retry :: Num a => String -> FilePath -> IO a -> IO a throwErrnoPathIfMinus1Retry loc path f = throwErrnoPathIfRetry (== -1) loc path f++throwErrnoPathIfMinus1Retry_ :: Num a => String -> FilePath -> IO a -> IO ()+throwErrnoPathIfMinus1Retry_ loc path f =+ void $ throwErrnoPathIfRetry (== -1) loc path f throwErrnoPathIfNullRetry :: String -> FilePath -> IO (Ptr a) -> IO (Ptr a) throwErrnoPathIfNullRetry loc path f =
System/Posix/Files.hsc view
@@ -24,6 +24,8 @@ -- ----------------------------------------------------------------------------- +#include "HsUnix.h"+ module System.Posix.Files ( -- * File modes -- FileMode exported by System.Posix.Types@@ -84,8 +86,6 @@ PathVar(..), getPathVar, getFdPathVar, ) where -#include "HsUnix.h"- import System.Posix.Error import System.Posix.Types import System.IO.Unsafe@@ -93,7 +93,27 @@ import System.Posix.Internals import Foreign hiding (unsafePerformIO) import Foreign.C+#if __GLASGOW_HASKELL__ > 700+import System.Posix.Internals (withFilePath, peekFilePath)+#elif __GLASGOW_HASKELL__ > 611+import System.Posix.Internals (withFilePath) +peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString++peekFilePathLen :: CStringLen -> IO FilePath+peekFilePathLen = peekCStringLen+#else+withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString++peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString++peekFilePathLen :: CStringLen -> IO FilePath+peekFilePathLen = peekCStringLen+#endif+ -- ----------------------------------------------------------------------------- -- POSIX file modes @@ -212,7 +232,7 @@ -- Note: calls @chmod@. setFileMode :: FilePath -> FileMode -> IO () setFileMode name m =- withCString name $ \s -> do+ withFilePath name $ \s -> do throwErrnoPathIfMinus1_ "setFileMode" name (c_chmod s m) -- | @setFdMode fd mode@ acts like 'setFileMode' but uses a file descriptor@@ -255,7 +275,7 @@ -- Note: calls @access@. fileExist :: FilePath -> IO Bool fileExist name = - withCString name $ \s -> do+ withFilePath name $ \s -> do r <- c_access s (#const F_OK) if (r == 0) then return True@@ -266,7 +286,7 @@ access :: FilePath -> CMode -> IO Bool access name flags = - withCString name $ \s -> do+ withFilePath name $ \s -> do r <- c_access s (fromIntegral flags) if (r == 0) then return True@@ -370,7 +390,7 @@ getFileStatus path = do fp <- mallocForeignPtrBytes (#const sizeof(struct stat)) withForeignPtr fp $ \p ->- withCString path $ \s -> + withFilePath path $ \s -> throwErrnoPathIfMinus1_ "getFileStatus" path (c_stat s p) return (FileStatus fp) @@ -393,7 +413,7 @@ getSymbolicLinkStatus path = do fp <- mallocForeignPtrBytes (#const sizeof(struct stat)) withForeignPtr fp $ \p ->- withCString path $ \s -> + withFilePath path $ \s -> throwErrnoPathIfMinus1_ "getSymbolicLinkStatus" path (c_lstat s p) return (FileStatus fp) @@ -409,7 +429,7 @@ -- Note: calls @mkfifo@. createNamedPipe :: FilePath -> FileMode -> IO () createNamedPipe name mode = do- withCString name $ \s -> + withFilePath name $ \s -> throwErrnoPathIfMinus1_ "createNamedPipe" name (c_mkfifo s mode) -- | @createDevice path mode dev@ creates either a regular or a special file@@ -422,7 +442,7 @@ -- Note: calls @mknod@. createDevice :: FilePath -> FileMode -> DeviceID -> IO () createDevice path mode dev =- withCString path $ \s ->+ withFilePath path $ \s -> throwErrnoPathIfMinus1_ "createDevice" path (c_mknod s mode dev) foreign import ccall unsafe "__hsunix_mknod" @@ -437,8 +457,8 @@ -- Note: calls @link@. createLink :: FilePath -> FilePath -> IO () createLink name1 name2 =- withCString name1 $ \s1 ->- withCString name2 $ \s2 ->+ withFilePath name1 $ \s1 ->+ withFilePath name2 $ \s2 -> throwErrnoPathIfMinus1_ "createLink" name1 (c_link s1 s2) -- | @removeLink path@ removes the link named @path@.@@ -446,7 +466,7 @@ -- Note: calls @unlink@. removeLink :: FilePath -> IO () removeLink name =- withCString name $ \s ->+ withFilePath name $ \s -> throwErrnoPathIfMinus1_ "removeLink" name (c_unlink s) -- -----------------------------------------------------------------------------@@ -461,8 +481,8 @@ -- Note: calls @symlink@. createSymbolicLink :: FilePath -> FilePath -> IO () createSymbolicLink file1 file2 =- withCString file1 $ \s1 ->- withCString file2 $ \s2 ->+ withFilePath file1 $ \s1 ->+ withFilePath file2 $ \s2 -> throwErrnoPathIfMinus1_ "createSymbolicLink" file1 (c_symlink s1 s2) foreign import ccall unsafe "symlink"@@ -483,10 +503,10 @@ readSymbolicLink :: FilePath -> IO FilePath readSymbolicLink file = allocaArray0 (#const PATH_MAX) $ \buf -> do- withCString file $ \s -> do+ withFilePath file $ \s -> do len <- throwErrnoPathIfMinus1 "readSymbolicLink" file $ c_readlink s buf (#const PATH_MAX)- peekCStringLen (buf,fromIntegral len)+ peekFilePathLen (buf,fromIntegral len) foreign import ccall unsafe "readlink" c_readlink :: CString -> CString -> CSize -> IO CInt@@ -499,8 +519,8 @@ -- Note: calls @rename@. rename :: FilePath -> FilePath -> IO () rename name1 name2 =- withCString name1 $ \s1 ->- withCString name2 $ \s2 ->+ withFilePath name1 $ \s1 ->+ withFilePath name2 $ \s2 -> throwErrnoPathIfMinus1_ "rename" name1 (c_rename s1 s2) foreign import ccall unsafe "rename"@@ -517,7 +537,7 @@ -- Note: calls @chown@. setOwnerAndGroup :: FilePath -> UserID -> GroupID -> IO () setOwnerAndGroup name uid gid = do- withCString name $ \s ->+ withFilePath name $ \s -> throwErrnoPathIfMinus1_ "setOwnerAndGroup" name (c_chown s uid gid) foreign import ccall unsafe "chown"@@ -541,7 +561,7 @@ -- Note: calls @lchown@. setSymbolicLinkOwnerAndGroup :: FilePath -> UserID -> GroupID -> IO () setSymbolicLinkOwnerAndGroup name uid gid = do- withCString name $ \s ->+ withFilePath name $ \s -> throwErrnoPathIfMinus1_ "setSymbolicLinkOwnerAndGroup" name (c_lchown s uid gid) @@ -558,7 +578,7 @@ -- Note: calls @utime@. setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO () setFileTimes name atime mtime = do- withCString name $ \s ->+ withFilePath name $ \s -> allocaBytes (#const sizeof(struct utimbuf)) $ \p -> do (#poke struct utimbuf, actime) p atime (#poke struct utimbuf, modtime) p mtime@@ -570,7 +590,7 @@ -- Note: calls @utime@. touchFile :: FilePath -> IO () touchFile name = do- withCString name $ \s ->+ withFilePath name $ \s -> throwErrnoPathIfMinus1_ "touchFile" name (c_utime s nullPtr) -- -----------------------------------------------------------------------------@@ -582,7 +602,7 @@ -- Note: calls @truncate@. setFileSize :: FilePath -> FileOffset -> IO () setFileSize file off = - withCString file $ \s ->+ withFilePath file $ \s -> throwErrnoPathIfMinus1_ "setFileSize" file (c_truncate s off) foreign import ccall unsafe "truncate"@@ -672,7 +692,7 @@ -- Note: calls @pathconf@. getPathVar :: FilePath -> PathVar -> IO Limit getPathVar name v = do- withCString name $ \ nameP -> + withFilePath name $ \ nameP -> throwErrnoPathIfMinus1 "getPathVar" name $ c_pathconf nameP (pathVarConst v)
System/Posix/IO.hsc view
@@ -94,6 +94,13 @@ import qualified Hugs.IO (handleToFd, openFd) #endif +#if __GLASGOW_HASKELL__ > 611+import System.Posix.Internals ( withFilePath )+#else+withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString+#endif+ #include "HsUnix.h" -- -----------------------------------------------------------------------------@@ -178,7 +185,7 @@ -> IO Fd openFd name how maybe_mode (OpenFileFlags appendFlag exclusiveFlag nocttyFlag nonBlockFlag truncateFlag) = do- withCString name $ \s -> do+ withFilePath name $ \s -> do fd <- throwErrnoPathIfMinus1Retry "openFd" name (c_open s all_flags mode_w) return (Fd fd) where@@ -259,7 +266,7 @@ -- state as a result. flushWriteBuffer h_ FD.release fd- return (Handle__{haType=ClosedHandle,..}, Fd (fromIntegral (FD.fdFD fd)))+ return (Handle__{haType=ClosedHandle,..}, Fd (FD.fdFD fd)) fdToHandle fd = FD.fdToHandle (fromIntegral fd) @@ -424,8 +431,8 @@ -- ----------------------------------------------------------------------------- -- fd{Read,Write} --- | Read data from an 'Fd' and convert it to a 'String'. Throws an--- exception if this is an invalid descriptor, or EOF has been+-- | Read data from an 'Fd' and convert it to a 'String' using the locale encoding.+-- Throws an exception if this is an invalid descriptor, or EOF has been -- reached. fdRead :: Fd -> ByteCount -- ^How many bytes to read@@ -434,7 +441,7 @@ fdRead fd nbytes = do allocaBytes (fromIntegral nbytes) $ \ buf -> do rc <- fdReadBuf fd buf nbytes- case fromIntegral rc of+ case rc of 0 -> ioError (ioeSetErrorString (mkIOError EOF "fdRead" Nothing Nothing) "EOF") n -> do s <- peekCStringLen (castPtr buf, fromIntegral n)@@ -450,18 +457,16 @@ fdReadBuf fd buf nbytes = fmap fromIntegral $ throwErrnoIfMinus1Retry "fdReadBuf" $ - c_safe_read (fromIntegral fd) (castPtr buf) (fromIntegral nbytes)+ c_safe_read (fromIntegral fd) (castPtr buf) nbytes foreign import ccall safe "read" c_safe_read :: CInt -> Ptr CChar -> CSize -> IO CSsize --- | Write a 'String' to an 'Fd' (no character conversion is done,--- the least-significant 8 bits of each character are written).+-- | Write a 'String' to an 'Fd' using the locale encoding. fdWrite :: Fd -> String -> IO ByteCount fdWrite fd str = - withCStringLen str $ \ (buf,len) -> do- rc <- fdWriteBuf fd (castPtr buf) (fromIntegral len)- return (fromIntegral rc)+ withCStringLen str $ \ (buf,len) ->+ fdWriteBuf fd (castPtr buf) (fromIntegral len) -- | Write data from memory to an 'Fd'. This is exactly equivalent -- to the POSIX @write@ function.@@ -472,7 +477,7 @@ fdWriteBuf fd buf len = fmap fromIntegral $ throwErrnoIfMinus1Retry "fdWriteBuf" $ - c_safe_write (fromIntegral fd) (castPtr buf) (fromIntegral len)+ c_safe_write (fromIntegral fd) (castPtr buf) len foreign import ccall safe "write" c_safe_write :: CInt -> Ptr CChar -> CSize -> IO CSsize
System/Posix/Process.hsc view
@@ -29,12 +29,13 @@ -- ** Process environment getProcessID, getParentProcessID,- getProcessGroupID, -- ** Process groups- createProcessGroup,+ getProcessGroupID,+ getProcessGroupIDOf,+ createProcessGroupFor, joinProcessGroup,- setProcessGroupID,+ setProcessGroupIDOf, -- ** Sessions createSession,@@ -58,12 +59,16 @@ getAnyProcessStatus, getGroupProcessStatus, + -- ** Deprecated+ createProcessGroup,+ setProcessGroupID,+ ) where #include "HsUnix.h" import Foreign.C.Error-import Foreign.C.String ( CString, withCString )+import Foreign.C.String import Foreign.C.Types ( CInt, CClock ) import Foreign.Marshal.Alloc ( alloca, allocaBytes ) import Foreign.Marshal.Array ( withArray0 )@@ -80,6 +85,13 @@ import GHC.TopHandler ( runIO ) #endif +#if __GLASGOW_HASKELL__ > 611+import System.Posix.Internals ( withFilePath )+#else+withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString+#endif+ #ifdef __HUGS__ {-# CFILES cbits/HsUnix.c #-} #endif@@ -111,11 +123,33 @@ foreign import ccall unsafe "getpgrp" c_getpgrp :: IO CPid --- | @'createProcessGroup' pid@ calls @setpgid@ to make+-- | @'getProcessGroupIDOf' pid@ calls @getpgid@ to obtain the+-- 'ProcessGroupID' for process @pid@.+getProcessGroupIDOf :: ProcessID -> IO ProcessGroupID+getProcessGroupIDOf pid =+ throwErrnoIfMinus1 "getProcessGroupIDOf" (c_getpgid pid)++foreign import ccall unsafe "getpgid"+ c_getpgid :: CPid -> IO CPid++{-+ To be added in the future, after the deprecation period for the+ existing createProcessGroup has elapsed:++-- | 'createProcessGroup' calls @setpgid(0,0)@ to make+-- the current process a new process group leader.+createProcessGroup :: IO ProcessGroupID+createProcessGroup = do+ throwErrnoIfMinus1_ "createProcessGroup" (c_setpgid 0 0)+ pgid <- getProcessGroupID+ return pgid+-}++-- | @'createProcessGroupFor' pid@ calls @setpgid@ to make -- process @pid@ a new process group leader.-createProcessGroup :: ProcessID -> IO ProcessGroupID-createProcessGroup pid = do- throwErrnoIfMinus1_ "createProcessGroup" (c_setpgid pid 0)+createProcessGroupFor :: ProcessID -> IO ProcessGroupID+createProcessGroupFor pid = do+ throwErrnoIfMinus1_ "createProcessGroupFor" (c_setpgid pid 0) return pid -- | @'joinProcessGroup' pgid@ calls @setpgid@ to set the@@ -124,12 +158,23 @@ joinProcessGroup pgid = throwErrnoIfMinus1_ "joinProcessGroup" (c_setpgid 0 pgid) --- | @'setProcessGroupID' pid pgid@ calls @setpgid@ to set the--- 'ProcessGroupID' for process @pid@ to @pgid@.-setProcessGroupID :: ProcessID -> ProcessGroupID -> IO ()-setProcessGroupID pid pgid =- throwErrnoIfMinus1_ "setProcessGroupID" (c_setpgid pid pgid)+{-+ To be added in the future, after the deprecation period for the+ existing setProcessGroupID has elapsed: +-- | @'setProcessGroupID' pgid@ calls @setpgid@ to set the+-- 'ProcessGroupID' of the current process to @pgid@.+setProcessGroupID :: ProcessGroupID -> IO ()+setProcessGroupID pgid =+ throwErrnoIfMinus1_ "setProcessGroupID" (c_setpgid 0 pgid)+-}++-- | @'setProcessGroupIDOf' pid pgid@ calls @setpgid@ to set the+-- 'ProcessGroupIDOf' for process @pid@ to @pgid@.+setProcessGroupIDOf :: ProcessID -> ProcessGroupID -> IO ()+setProcessGroupIDOf pid pgid =+ throwErrnoIfMinus1_ "setProcessGroupIDOf" (c_setpgid pid pgid)+ foreign import ccall unsafe "setpgid" c_setpgid :: CPid -> CPid -> IO CInt @@ -256,7 +301,7 @@ stable <- newStablePtr (runIO action) pid <- throwErrnoIfMinus1 "forkProcess" (forkProcessPrim stable) freeStablePtr stable- return $ fromIntegral pid+ return pid foreign import ccall "forkProcess" forkProcessPrim :: StablePtr (IO ()) -> IO CPid #endif /* __GLASGOW_HASKELL__ */@@ -275,8 +320,8 @@ -> Maybe [(String, String)] -- ^ Environment -> IO a executeFile path search args Nothing = do- withCString path $ \s ->- withMany withCString (path:args) $ \cstrs ->+ withFilePath path $ \s ->+ withMany withFilePath (path:args) $ \cstrs -> withArray0 nullPtr cstrs $ \arr -> do pPrPr_disableITimers if search @@ -285,11 +330,11 @@ return undefined -- never reached executeFile path search args (Just env) = do- withCString path $ \s ->- withMany withCString (path:args) $ \cstrs ->+ withFilePath path $ \s ->+ withMany withFilePath (path:args) $ \cstrs -> withArray0 nullPtr cstrs $ \arg_arr -> let env' = map (\ (name, val) -> name ++ ('=' : val)) env in- withMany withCString env' $ \cenv ->+ withMany withFilePath env' $ \cenv -> withArray0 nullPtr cenv $ \env_arr -> do pPrPr_disableITimers if search @@ -387,5 +432,29 @@ foreign import ccall unsafe "exit" c_exit :: CInt -> IO ()++-- -----------------------------------------------------------------------------+-- Deprecated or subject to change++{-# DEPRECATED createProcessGroup "This function is scheduled to be replaced by something different in the future, we therefore recommend that you do not use this version and use createProcessGroupFor instead." #-}+-- | @'createProcessGroup' pid@ calls @setpgid@ to make+-- process @pid@ a new process group leader.+-- This function is currently deprecated,+-- and might be changed to making the current+-- process a new process group leader in future versions.+createProcessGroup :: ProcessID -> IO ProcessGroupID+createProcessGroup pid = do+ throwErrnoIfMinus1_ "createProcessGroup" (c_setpgid pid 0)+ return pid++{-# DEPRECATED setProcessGroupID "This function is scheduled to be replaced by something different in the future, we therefore recommend that you do not use this version and use setProcessGroupIdOf instead." #-}+-- | @'setProcessGroupID' pid pgid@ calls @setpgid@ to set the+-- 'ProcessGroupID' for process @pid@ to @pgid@.+-- This function is currently deprecated,+-- and might be changed to setting the 'ProcessGroupID'+-- for the current process in future versions.+setProcessGroupID :: ProcessID -> ProcessGroupID -> IO ()+setProcessGroupID pid pgid =+ throwErrnoIfMinus1_ "setProcessGroupID" (c_setpgid pid pgid) -- -----------------------------------------------------------------------------
System/Posix/Process/Internals.hs view
@@ -34,12 +34,12 @@ if c_WIFSIGNALED wstat /= 0 then do let termsig = c_WTERMSIG wstat- return (Terminated (fromIntegral termsig))+ return (Terminated termsig) else do if c_WIFSTOPPED wstat /= 0 then do let stopsig = c_WSTOPSIG wstat- return (Stopped (fromIntegral stopsig))+ return (Stopped stopsig) else do ioError (mkIOError illegalOperationErrorType "waitStatus" Nothing Nothing)
System/Posix/Signals.hsc view
@@ -276,7 +276,7 @@ -- with interrupt signal @int@. signalProcess :: Signal -> ProcessID -> IO () signalProcess sig pid - = throwErrnoIfMinus1_ "signalProcess" (c_kill (fromIntegral pid) sig)+ = throwErrnoIfMinus1_ "signalProcess" (c_kill pid sig) foreign import ccall unsafe "kill" c_kill :: CPid -> CInt -> IO CInt@@ -286,7 +286,7 @@ -- all processes in group @pgid@ with interrupt signal @int@. signalProcessGroup :: Signal -> ProcessGroupID -> IO () signalProcessGroup sig pgid - = throwErrnoIfMinus1_ "signalProcessGroup" (c_killpg (fromIntegral pgid) sig)+ = throwErrnoIfMinus1_ "signalProcessGroup" (c_killpg pgid sig) foreign import ccall unsafe "killpg" c_killpg :: CPid -> CInt -> IO CInt
System/Posix/Temp.hsc view
@@ -32,6 +32,21 @@ import System.Posix.Types import Foreign.C +#if __GLASGOW_HASKELL__ > 700+import System.Posix.Internals (withFilePath, peekFilePath)+#elif __GLASGOW_HASKELL__ > 611+import System.Posix.Internals (withFilePath)++peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString+#else+withFilePath :: FilePath -> (CString -> IO a) -> IO a+withFilePath = withCString++peekFilePath :: CString -> IO FilePath+peekFilePath = peekCString+#endif+ -- |'mkstemp' - make a unique filename and open it for -- reading\/writing (only safe on GHC & Hugs). -- The returned 'FilePath' is the (possibly relative) path of@@ -39,9 +54,9 @@ mkstemp :: String -> IO (FilePath, Handle) mkstemp template = do #if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)- withCString template $ \ ptr -> do+ withFilePath template $ \ ptr -> do fd <- throwErrnoIfMinus1 "mkstemp" (c_mkstemp ptr)- name <- peekCString ptr+ name <- peekFilePath ptr h <- fdToHandle (Fd fd) return (name, h) #else@@ -54,9 +69,9 @@ mktemp :: String -> IO String mktemp template = do- withCString template $ \ ptr -> do+ withFilePath template $ \ ptr -> do ptr <- throwErrnoIfNull "mktemp" (c_mktemp ptr)- peekCString ptr+ peekFilePath ptr foreign import ccall unsafe "mktemp" c_mktemp :: CString -> IO CString
System/Posix/User.hsc view
@@ -131,7 +131,7 @@ getLoginName = do -- ToDo: use getlogin_r str <- throwErrnoIfNull "getLoginName" c_getlogin- peekCString str+ peekCAString str foreign import ccall unsafe "getlogin" c_getlogin :: IO CString@@ -225,7 +225,7 @@ getGroupEntryForName name = do allocaBytes (#const sizeof(struct group)) $ \pgr -> alloca $ \ ppgr ->- withCString name $ \ pstr -> do+ withCAString name $ \ pstr -> do throwErrorIfNonZero_ "getGroupEntryForName" $ doubleAllocWhile isERANGE grBufSize $ \s b -> c_getgrnam_r pstr pgr b (fromIntegral s) ppgr@@ -287,11 +287,11 @@ unpackGroupEntry :: Ptr CGroup -> IO GroupEntry unpackGroupEntry ptr = do- name <- (#peek struct group, gr_name) ptr >>= peekCString- passwd <- (#peek struct group, gr_passwd) ptr >>= peekCString+ name <- (#peek struct group, gr_name) ptr >>= peekCAString+ passwd <- (#peek struct group, gr_passwd) ptr >>= peekCAString gid <- (#peek struct group, gr_gid) ptr mem <- (#peek struct group, gr_mem) ptr- members <- peekArray0 nullPtr mem >>= mapM peekCString+ members <- peekArray0 nullPtr mem >>= mapM peekCAString return (GroupEntry name passwd gid members) -- -----------------------------------------------------------------------------@@ -359,7 +359,7 @@ getUserEntryForName name = do allocaBytes (#const sizeof(struct passwd)) $ \ppw -> alloca $ \ pppw ->- withCString name $ \ pstr -> do+ withCAString name $ \ pstr -> do throwErrorIfNonZero_ "getUserEntryForName" $ doubleAllocWhile isERANGE pwBufSize $ \s b -> c_getpwnam_r pstr ppw b (fromIntegral s) pppw@@ -377,7 +377,7 @@ -> CString -> CSize -> Ptr (Ptr CPasswd) -> IO CInt #elif HAVE_GETPWNAM getUserEntryForName name = do- withCString name $ \ pstr -> do+ withCAString name $ \ pstr -> do withMVar lock $ \_ -> do ppw <- throwErrnoIfNull "getUserEntryForName" $ c_getpwnam pstr unpackUserEntry ppw@@ -446,13 +446,13 @@ unpackUserEntry :: Ptr CPasswd -> IO UserEntry unpackUserEntry ptr = do- name <- (#peek struct passwd, pw_name) ptr >>= peekCString- passwd <- (#peek struct passwd, pw_passwd) ptr >>= peekCString+ name <- (#peek struct passwd, pw_name) ptr >>= peekCAString+ passwd <- (#peek struct passwd, pw_passwd) ptr >>= peekCAString uid <- (#peek struct passwd, pw_uid) ptr gid <- (#peek struct passwd, pw_gid) ptr- gecos <- (#peek struct passwd, pw_gecos) ptr >>= peekCString- dir <- (#peek struct passwd, pw_dir) ptr >>= peekCString- shell <- (#peek struct passwd, pw_shell) ptr >>= peekCString+ gecos <- (#peek struct passwd, pw_gecos) ptr >>= peekCAString+ dir <- (#peek struct passwd, pw_dir) ptr >>= peekCAString+ shell <- (#peek struct passwd, pw_shell) ptr >>= peekCAString return (UserEntry name passwd uid gid gecos dir shell) -- Used when calling re-entrant system calls that signal their 'errno' @@ -462,7 +462,7 @@ rc <- act if (rc == 0) then return ()- else ioError (errnoToIOError loc (Errno (fromIntegral rc)) Nothing Nothing)+ else ioError (errnoToIOError loc (Errno rc) Nothing Nothing) -- Used when a function returns NULL to indicate either an error or -- EOF, depending on whether the global errno is nonzero.
configure view
@@ -3799,7 +3799,7 @@ done -for ac_header in libutil.h pty.h utmp.h+for ac_header in bsd/libutil.h libutil.h pty.h utmp.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
configure.ac view
@@ -23,7 +23,7 @@ AC_CHECK_HEADERS([dirent.h fcntl.h grp.h limits.h pwd.h signal.h string.h]) AC_CHECK_HEADERS([sys/resource.h sys/stat.h sys/times.h sys/time.h]) AC_CHECK_HEADERS([sys/utsname.h sys/wait.h])-AC_CHECK_HEADERS([libutil.h pty.h utmp.h])+AC_CHECK_HEADERS([bsd/libutil.h libutil.h pty.h utmp.h]) AC_CHECK_HEADERS([termios.h time.h unistd.h utime.h]) AC_CHECK_FUNCS([getgrgid_r getgrnam_r getpwnam_r getpwuid_r getpwnam getpwuid])
include/HsUnix.h view
@@ -75,7 +75,9 @@ #include <dirent.h> #endif -#ifdef HAVE_LIBUTIL_H+#if defined(HAVE_BSD_LIBUTIL_H)+#include <bsd/libutil.h>+#elif defined(HAVE_LIBUTIL_H) #include <libutil.h> #endif #ifdef HAVE_PTY_H
include/HsUnixConfig.h view
@@ -94,6 +94,9 @@ /* The value of SIG_UNBLOCK. */ #define CONST_SIG_UNBLOCK 1 +/* Define to 1 if you have the <bsd/libutil.h> header file. */+/* #undef HAVE_BSD_LIBUTIL_H */+ /* Define if we have /dev/ptc. */ /* #undef HAVE_DEV_PTC */
include/HsUnixConfig.h.in view
@@ -93,6 +93,9 @@ /* The value of SIG_UNBLOCK. */ #undef CONST_SIG_UNBLOCK +/* Define to 1 if you have the <bsd/libutil.h> header file. */+#undef HAVE_BSD_LIBUTIL_H+ /* Define if we have /dev/ptc. */ #undef HAVE_DEV_PTC
unix.cabal view
@@ -1,5 +1,5 @@ name: unix-version: 2.4.2.0+version: 2.5.0.0 license: BSD3 license-file: LICENSE maintainer: libraries@haskell.org@@ -47,8 +47,10 @@ System.Posix.Signals.Exts System.Posix.Semaphore System.Posix.SharedMem- build-depends: base >= 4.2 && < 4.4- extensions: CPP, ForeignFunctionInterface, EmptyDataDecls+ build-depends: base >= 4.2 && < 4.5+ extensions: CPP, ForeignFunctionInterface, EmptyDataDecls+ if impl(ghc >= 7.1)+ extensions: NondecreasingIndentation include-dirs: include includes: HsUnix.h execvpe.h install-includes:@@ -56,6 +58,6 @@ c-sources: cbits/HsUnix.c cbits/execvpe.c cbits/dirUtils.c source-repository head- type: darcs- location: http://darcs.haskell.org/packages/unix/+ type: git+ location: http://darcs.haskell.org/packages/unix.git/