packages feed

unix-compat 0.2 → 0.2.1

raw patch · 4 files changed

+110/−113 lines, 4 filesdep ~directory

Dependency ranges changed: directory

Files

src/System/PosixCompat/Extensions.hsc view
@@ -18,7 +18,7 @@ type CMinor = CUInt  -- | Gets the major number from a 'DeviceID' for a device file.--- +-- -- The portable implementation always returns @0@. deviceMajor :: DeviceID -> CMajor #ifdef UNIX_IMPL@@ -30,7 +30,7 @@ #endif  -- | Gets the minor number from a 'DeviceID' for a device file.--- +-- -- The portable implementation always returns @0@. deviceMinor :: DeviceID -> CMinor #ifdef UNIX_IMPL
src/System/PosixCompat/Files.hsc view
@@ -36,7 +36,7 @@     isDirectory, isSymbolicLink, isSocket,      -- * Creation-    createNamedPipe, +    createNamedPipe,     createDevice,      -- * Hard links@@ -81,9 +81,7 @@ import Control.Monad (liftM, liftM2) import Data.Bits ((.|.), (.&.)) import Prelude hiding (read)-import System.Directory (renameFile, doesFileExist, doesDirectoryExist, -                         Permissions(..), getPermissions, setPermissions,-                         getModificationTime)+import System.Directory import System.IO (IOMode(..), openFile, hFileSize, hSetFileSize, hClose) import System.IO.Error import System.PosixCompat.Types@@ -96,7 +94,8 @@  unsupported :: String -> IO a unsupported f = ioError $ mkIOError illegalOperationErrorType x Nothing Nothing-    where x = "System.PosixCompat.Files." ++ f ++ ": not supported"+  where+    x = "System.PosixCompat.Files." ++ f ++ ": not supported"  -- ----------------------------------------------------------------------------- -- POSIX file modes@@ -134,9 +133,9 @@ otherModes       :: FileMode accessModes      :: FileMode -stdFileMode = ownerReadMode  .|. ownerWriteMode .|. -	      groupReadMode  .|. groupWriteMode .|. -	      otherReadMode  .|. otherWriteMode+stdFileMode = ownerReadMode  .|. ownerWriteMode .|.+              groupReadMode  .|. groupWriteMode .|.+              otherReadMode  .|. otherWriteMode ownerModes  = ownerReadMode  .|. ownerWriteMode .|. ownerExecuteMode groupModes  = groupReadMode  .|. groupWriteMode .|. groupExecuteMode otherModes  = otherReadMode  .|. otherWriteMode .|. otherExecuteMode@@ -180,21 +179,21 @@ setFileCreationMask _ = return nullFileMode  modeToPerms :: FileMode -> Permissions-modeToPerms m = Permissions {-                             readable   = m .&. ownerReadMode    /= 0,-                             writable   = m .&. ownerWriteMode   /= 0,-                             executable = m .&. ownerExecuteMode /= 0,-                             searchable = m .&. ownerExecuteMode /= 0-                            }+modeToPerms m =+    setOwnerReadable   (m .&. ownerReadMode    /= 0) $+    setOwnerWritable   (m .&. ownerWriteMode   /= 0) $+    setOwnerExecutable (m .&. ownerExecuteMode /= 0) $+    setOwnerSearchable (m .&. ownerExecuteMode /= 0) $+    emptyPermissions  -- ----------------------------------------------------------------------------- -- access()  fileAccess :: FilePath -> Bool -> Bool -> Bool -> IO Bool-fileAccess name read write exec = +fileAccess name read write exec =     do perm <- getPermissions name-       return $ (not read  || readable perm) -             && (not write || writable perm) +       return $ (not read  || readable perm)+             && (not write || writable perm)              && (not exec  || executable perm || searchable perm)  fileExist :: FilePath -> IO Bool@@ -203,79 +202,79 @@ -- ----------------------------------------------------------------------------- -- stat() support -data FileStatus = FileStatus {-                              deviceID         :: DeviceID,-                              fileID           :: FileID,-                              fileMode         :: FileMode,-                              linkCount        :: LinkCount,-                              fileOwner        :: UserID,-                              fileGroup        :: GroupID,-                              specialDeviceID  :: DeviceID,-                              fileSize         :: FileOffset,-                              accessTime       :: EpochTime,-                              modificationTime :: EpochTime,-                              statusChangeTime :: EpochTime-                             }+data FileStatus = FileStatus+    { deviceID         :: DeviceID+    , fileID           :: FileID+    , fileMode         :: FileMode+    , linkCount        :: LinkCount+    , fileOwner        :: UserID+    , fileGroup        :: GroupID+    , specialDeviceID  :: DeviceID+    , fileSize         :: FileOffset+    , accessTime       :: EpochTime+    , modificationTime :: EpochTime+    , statusChangeTime :: EpochTime+    }  isBlockDevice :: FileStatus -> Bool-isBlockDevice stat = -  (fileMode stat `intersectFileModes` fileTypeModes) == blockSpecialMode+isBlockDevice stat =+    (fileMode stat `intersectFileModes` fileTypeModes) == blockSpecialMode  isCharacterDevice :: FileStatus -> Bool-isCharacterDevice stat = -  (fileMode stat `intersectFileModes` fileTypeModes) == characterSpecialMode+isCharacterDevice stat =+    (fileMode stat `intersectFileModes` fileTypeModes) == characterSpecialMode  isNamedPipe :: FileStatus -> Bool-isNamedPipe stat = -  (fileMode stat `intersectFileModes` fileTypeModes) == namedPipeMode+isNamedPipe stat =+    (fileMode stat `intersectFileModes` fileTypeModes) == namedPipeMode  isRegularFile :: FileStatus -> Bool-isRegularFile stat = -  (fileMode stat `intersectFileModes` fileTypeModes) == regularFileMode+isRegularFile stat =+    (fileMode stat `intersectFileModes` fileTypeModes) == regularFileMode  isDirectory :: FileStatus -> Bool-isDirectory stat = -  (fileMode stat `intersectFileModes` fileTypeModes) == directoryMode+isDirectory stat =+    (fileMode stat `intersectFileModes` fileTypeModes) == directoryMode  isSymbolicLink :: FileStatus -> Bool-isSymbolicLink stat = -  (fileMode stat `intersectFileModes` fileTypeModes) == symbolicLinkMode+isSymbolicLink stat =+    (fileMode stat `intersectFileModes` fileTypeModes) == symbolicLinkMode  isSocket :: FileStatus -> Bool-isSocket stat = -  (fileMode stat `intersectFileModes` fileTypeModes) == socketMode+isSocket stat =+    (fileMode stat `intersectFileModes` fileTypeModes) == socketMode  getFileStatus :: FilePath -> IO FileStatus-getFileStatus path = +getFileStatus path =     do perm  <- liftM permsToMode $ getPermissions path        typ   <- getFileType path        size  <- if typ == regularFileMode then getFileSize path else return 0        mtime <- liftM clockTimeToEpochTime $ getModificationTime path-       return $ FileStatus {-                            deviceID           = -1,-                            fileID             = -1,-                            fileMode           = typ .|. perm,-                            linkCount          = 1,-                            fileOwner          = 0,-                            fileGroup          = 0,-                            specialDeviceID    = 0,-                            fileSize           = size,-                            accessTime         = mtime,-                            modificationTime   = mtime,-                            statusChangeTime   = mtime-                           }+       return $ FileStatus+                { deviceID         = -1+                , fileID           = -1+                , fileMode         = typ .|. perm+                , linkCount        = 1+                , fileOwner        = 0+                , fileGroup        = 0+                , specialDeviceID  = 0+                , fileSize         = size+                , accessTime       = mtime+                , modificationTime = mtime+                , statusChangeTime = mtime }  permsToMode :: Permissions -> FileMode permsToMode perms = r .|. w .|. x-  where r = f (readable perms) (ownerReadMode .|. groupReadMode .|. otherReadMode)-        w = f (writable perms) (ownerWriteMode .|. groupWriteMode .|. otherWriteMode)-        x = f (executable perms || searchable perms) -                     (ownerExecuteMode .|. groupExecuteMode .|. otherExecuteMode)-        f True m  = m-        f False _ = nullFileMode+  where+    r = f (readable perms) (ownerReadMode .|. groupReadMode .|. otherReadMode)+    w = f (writable perms) (ownerWriteMode .|. groupWriteMode .|. otherWriteMode)+    x = f (executable perms || searchable perms)+          (ownerExecuteMode .|. groupExecuteMode .|. otherExecuteMode)+    f True m  = m+    f False _ = nullFileMode  getFileType :: FilePath -> IO FileMode-getFileType path = +getFileType path =     do f <- doesFileExist path        if f then return regularFileMode             else do d <- doesDirectoryExist path@@ -283,7 +282,7 @@                          else unsupported "Unknown file type."  getFileSize :: FilePath -> IO FileOffset-getFileSize path = +getFileSize path =     bracket (openFile path ReadMode) hClose (liftM fromIntegral . hFileSize)  clockTimeToEpochTime :: ClockTime -> EpochTime@@ -348,21 +347,21 @@ setFileTimes _ _ _ = unsupported "setFileTimes"  touchFile :: FilePath -> IO ()-touchFile name = -    do t <- liftM clockTimeToEpochTime getClockTime +touchFile name =+    do t <- liftM clockTimeToEpochTime getClockTime        setFileTimes name t t  -- ----------------------------------------------------------------------------- -- Setting file sizes  setFileSize :: FilePath -> FileOffset -> IO ()-setFileSize file off = +setFileSize file off =     bracket (openFile file WriteMode) (hClose)             (\h -> hSetFileSize h (fromIntegral off))  setFdSize :: Fd -> FileOffset -> IO () #ifdef __GLASGOW_HASKELL__-setFdSize (Fd fd) off = +setFdSize (Fd fd) off =     do h <- fdToHandle (fromIntegral fd)        hSetFileSize h (fromIntegral off) #else@@ -373,27 +372,28 @@ -- pathconf()/fpathconf() support  data PathVar-  = FileSizeBits		  {- _PC_FILESIZEBITS     -}-  | LinkLimit                     {- _PC_LINK_MAX         -}-  | InputLineLimit                {- _PC_MAX_CANON        -}-  | InputQueueLimit               {- _PC_MAX_INPUT        -}-  | FileNameLimit                 {- _PC_NAME_MAX         -}-  | PathNameLimit                 {- _PC_PATH_MAX         -}-  | PipeBufferLimit               {- _PC_PIPE_BUF         -}-				  -- These are described as optional in POSIX:-  				  {- _PC_ALLOC_SIZE_MIN     -}-  				  {- _PC_REC_INCR_XFER_SIZE -}-  				  {- _PC_REC_MAX_XFER_SIZE  -}-  				  {- _PC_REC_MIN_XFER_SIZE  -}- 				  {- _PC_REC_XFER_ALIGN     -}-  | SymbolicLinkLimit		  {- _PC_SYMLINK_MAX      -}-  | SetOwnerAndGroupIsRestricted  {- _PC_CHOWN_RESTRICTED -}-  | FileNamesAreNotTruncated      {- _PC_NO_TRUNC         -}-  | VDisableChar		  {- _PC_VDISABLE         -}-  | AsyncIOAvailable		  {- _PC_ASYNC_IO         -}-  | PrioIOAvailable		  {- _PC_PRIO_IO          -}-  | SyncIOAvailable		  {- _PC_SYNC_IO          -}+  = FileSizeBits                  -- _PC_FILESIZEBITS+  | LinkLimit                     -- _PC_LINK_MAX+  | InputLineLimit                -- _PC_MAX_CANON+  | InputQueueLimit               -- _PC_MAX_INPUT+  | FileNameLimit                 -- _PC_NAME_MAX+  | PathNameLimit                 -- _PC_PATH_MAX+  | PipeBufferLimit               -- _PC_PIPE_BUF +  -- These are described as optional in POSIX:+                                  -- _PC_ALLOC_SIZE_MIN+                                  -- _PC_REC_INCR_XFER_SIZE+                                  -- _PC_REC_MAX_XFER_SIZE+                                  -- _PC_REC_MIN_XFER_SIZE+                                  -- _PC_REC_XFER_ALIGN+  | SymbolicLinkLimit             -- _PC_SYMLINK_MAX+  | SetOwnerAndGroupIsRestricted  -- _PC_CHOWN_RESTRICTED+  | FileNamesAreNotTruncated      -- _PC_NO_TRUNC+  | VDisableChar                  -- _PC_VDISABLE+  | AsyncIOAvailable              -- _PC_ASYNC_IO+  | PrioIOAvailable               -- _PC_PRIO_IO+  | SyncIOAvailable               -- _PC_SYNC_IO+ getPathVar :: FilePath -> PathVar -> IO Limit getPathVar _ _ = unsupported "getPathVar" @@ -401,4 +401,3 @@ getFdPathVar _ _ = unsupported "getFdPathVar"  #endif-
src/System/PosixCompat/User.hsc view
@@ -88,15 +88,14 @@ getEffectiveUserName = unsupported "getEffectiveUserName"  -- -------------------------------------------------------------------------------- The group database +-- The group database -data GroupEntry =- GroupEntry {-  groupName    :: String,-  groupPassword :: String,-  groupID      :: GroupID,-  groupMembers :: [String]- } deriving (Show, Read, Eq)+data GroupEntry = GroupEntry+    { groupName     :: String+    , groupPassword :: String+    , groupID       :: GroupID+    , groupMembers  :: [String]+    } deriving (Show, Read, Eq)  getGroupEntryForID :: GroupID -> IO GroupEntry getGroupEntryForID _ = unsupported "getGroupEntryForID"@@ -110,16 +109,15 @@ -- ----------------------------------------------------------------------------- -- The user database (pwd.h) -data UserEntry =- UserEntry {-   userName      :: String,-   userPassword  :: String,-   userID        :: UserID,-   userGroupID   :: GroupID,-   userGecos     :: String,-   homeDirectory :: String,-   userShell     :: String- } deriving (Show, Read, Eq)+data UserEntry = UserEntry+    { userName      :: String+    , userPassword  :: String+    , userID        :: UserID+    , userGroupID   :: GroupID+    , userGecos     :: String+    , homeDirectory :: String+    , userShell     :: String+    } deriving (Show, Read, Eq)  getUserEntryForID :: UserID -> IO UserEntry getUserEntryForID _ = unsupported "getUserEntryForID"
unix-compat.cabal view
@@ -1,5 +1,5 @@ name:           unix-compat-version:        0.2+version:        0.2.1 synopsis:       Portable POSIX-compatibility layer. description:    This package provides portable implementations of parts                 of the unix package. This package re-exports the unix @@ -38,7 +38,7 @@   build-depends: base == 4.*    if flag(portable) || os(windows)-    build-depends: old-time == 1.0.*, directory == 1.0.*+    build-depends: old-time == 1.0.*, directory == 1.1.*     extensions: GeneralizedNewtypeDeriving     if os(windows)       cpp-options: -DMISSING_POSIX_TYPES