unix-compat 0.5.2 → 0.5.3
raw patch · 4 files changed
+64/−53 lines, 4 filesdep ~unixPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: unix
API changes (from Hackage documentation)
+ System.PosixCompat.Files: accessTimeHiRes :: FileStatus -> POSIXTime
+ System.PosixCompat.Files: modificationTimeHiRes :: FileStatus -> POSIXTime
+ System.PosixCompat.Files: statusChangeTimeHiRes :: FileStatus -> POSIXTime
Files
- src/System/PosixCompat/Files.hsc +56/−24
- src/System/PosixCompat/Internal/Time.hs +1/−14
- src/System/PosixCompat/Types.hs +3/−12
- unix-compat.cabal +4/−3
src/System/PosixCompat/Files.hsc view
@@ -59,6 +59,9 @@ , accessTime , modificationTime , statusChangeTime+ , accessTimeHiRes+ , modificationTimeHiRes+ , statusChangeTimeHiRes , isBlockDevice , isCharacterDevice , isNamedPipe@@ -120,6 +123,7 @@ import Control.Monad (liftM, liftM2) import Data.Bits ((.|.), (.&.)) import Data.Int (Int64)+import Data.Time.Clock.POSIX (POSIXTime) import Foreign.C.Types (CTime(..)) import Prelude hiding (read) import System.Directory (Permissions, emptyPermissions)@@ -129,8 +133,7 @@ import System.Directory (executable, setOwnerExecutable) import System.Directory (searchable, setOwnerSearchable) import System.Directory (doesFileExist, doesDirectoryExist)-import System.Directory (getModificationTime, renameFile)-import System.IO (IOMode(..), openFile, hFileSize, hSetFileSize, hClose)+import System.IO (IOMode(..), openFile, hSetFileSize, hClose) import System.IO.Error import System.PosixCompat.Types import System.Win32.File hiding (getFileType)@@ -139,7 +142,6 @@ import System.PosixCompat.Internal.Time ( getClockTime, clockTimeToEpochTime- , modificationTimeToEpochTime ) #ifdef __GLASGOW_HASKELL__@@ -267,17 +269,20 @@ -- 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+ { deviceID :: DeviceID+ , fileID :: FileID+ , fileMode :: FileMode+ , linkCount :: LinkCount+ , fileOwner :: UserID+ , fileGroup :: GroupID+ , specialDeviceID :: DeviceID+ , fileSize :: FileOffset+ , accessTime :: EpochTime+ , modificationTime :: EpochTime+ , statusChangeTime :: EpochTime+ , accessTimeHiRes :: POSIXTime+ , modificationTimeHiRes :: POSIXTime+ , statusChangeTimeHiRes :: POSIXTime } isBlockDevice :: FileStatus -> Bool@@ -312,9 +317,10 @@ getFileStatus path = do perm <- liftM permsToMode (getPermissions path) typ <- getFileType path- size <- if typ == regularFileMode then getFileSize path else return 0- mtime <- liftM modificationTimeToEpochTime (getModificationTime path) info <- bracket openPath closeHandle getFileInformationByHandle+ let atime = windowsToPosixTime (bhfiLastAccessTime info)+ mtime = windowsToPosixTime (bhfiLastWriteTime info)+ ctime = windowsToPosixTime (bhfiCreationTime info) return $ FileStatus { deviceID = fromIntegral (bhfiVolumeSerialNumber info) , fileID = fromIntegral (bhfiFileIndex info)@@ -323,10 +329,14 @@ , fileOwner = 0 , fileGroup = 0 , specialDeviceID = 0- , fileSize = size- , accessTime = mtime- , modificationTime = mtime- , statusChangeTime = mtime }+ , fileSize = fromIntegral (bhfiSize info)+ , accessTime = posixTimeToEpochTime atime+ , modificationTime = posixTimeToEpochTime mtime+ , statusChangeTime = posixTimeToEpochTime mtime+ , accessTimeHiRes = atime+ , modificationTimeHiRes = mtime+ , statusChangeTimeHiRes = ctime+ } where openPath = createFile path gENERIC_READ@@ -336,6 +346,32 @@ (sECURITY_ANONYMOUS .|. fILE_FLAG_BACKUP_SEMANTICS) Nothing +-- | Convert a 'POSIXTime' (synomym for 'Data.Time.Clock.NominalDiffTime')+-- into an 'EpochTime' (integral number of seconds since epoch). This merely+-- throws away the fractional part.+posixTimeToEpochTime :: POSIXTime -> EpochTime+posixTimeToEpochTime = fromInteger . floor++-- three function stolen from System.Directory.Internals.Windows:++-- | Difference between the Windows and POSIX epochs in units of 100ns.+windowsPosixEpochDifference :: Num a => a+windowsPosixEpochDifference = 116444736000000000++-- | Convert from Windows time to POSIX time.+windowsToPosixTime :: FILETIME -> POSIXTime+windowsToPosixTime (FILETIME t) =+ (fromIntegral t - windowsPosixEpochDifference) / 10000000++{- will be needed to /set/ high res timestamps, not yet supported++-- | Convert from POSIX time to Windows time. This is lossy as Windows time+-- has a resolution of only 100ns.+posixToWindowsTime :: POSIXTime -> FILETIME+posixToWindowsTime t = FILETIME $+ truncate (t * 10000000 + windowsPosixEpochDifference)+-}+ permsToMode :: Permissions -> FileMode permsToMode perms = r .|. w .|. x where@@ -353,10 +389,6 @@ else do d <- doesDirectoryExist path if d then return directoryMode else unsupported "Unknown file type."--getFileSize :: FilePath -> IO FileOffset-getFileSize path =- bracket (openFile path ReadMode) hClose (liftM fromIntegral . hFileSize) getFdStatus :: Fd -> IO FileStatus getFdStatus _ = unsupported "getFdStatus"
src/System/PosixCompat/Internal/Time.hs view
@@ -7,8 +7,6 @@ ClockTime , getClockTime , clockTimeToEpochTime- , ModificationTime- , modificationTimeToEpochTime ) where import System.Posix.Types (EpochTime)@@ -20,15 +18,9 @@ clockTimeToEpochTime :: ClockTime -> EpochTime clockTimeToEpochTime (TOD s _) = fromInteger s -type ModificationTime = ClockTime--modificationTimeToEpochTime :: ModificationTime -> EpochTime-modificationTimeToEpochTime = clockTimeToEpochTime- #else -import Data.Time.Clock (UTCTime)-import Data.Time.Clock.POSIX (POSIXTime, getPOSIXTime, utcTimeToPOSIXSeconds)+import Data.Time.Clock.POSIX (POSIXTime, getPOSIXTime) type ClockTime = POSIXTime @@ -37,10 +29,5 @@ clockTimeToEpochTime :: ClockTime -> EpochTime clockTimeToEpochTime = fromInteger . floor--type ModificationTime = UTCTime--modificationTimeToEpochTime :: UTCTime -> EpochTime-modificationTimeToEpochTime = clockTimeToEpochTime . utcTimeToPOSIXSeconds #endif
src/System/PosixCompat/Types.hs view
@@ -8,14 +8,11 @@ redefined by this module. -} module System.PosixCompat.Types (+ module System.Posix.Types #ifdef mingw32_HOST_OS- module AllPosixTypesButFileID- , FileID , UserID , GroupID , LinkCount-#else- module System.Posix.Types #endif ) where @@ -23,15 +20,9 @@ -- Since CIno (FileID's underlying type) reflects <sys/type.h> ino_t, -- which mingw defines as short int (int16), it must be overriden to -- match the size of windows fileIndex (word64).-import System.Posix.Types as AllPosixTypesButFileID hiding (FileID)--import Data.Word (Word32, Word64)+import System.Posix.Types -newtype FileID = FileID Word64- deriving (Eq, Ord, Enum, Bounded, Integral, Num, Real)-instance Show FileID where show (FileID x) = show x-instance Read FileID where readsPrec i s = [ (FileID x, s')- | (x,s') <- readsPrec i s]+import Data.Word (Word32) newtype UserID = UserID Word32 deriving (Eq, Ord, Enum, Bounded, Integral, Num, Real)
unix-compat.cabal view
@@ -1,5 +1,5 @@ name: unix-compat-version: 0.5.2+version: 0.5.3 synopsis: Portable POSIX-compatibility layer. description: This package provides portable implementations of parts of the unix package. This package re-exports the unix@@ -13,7 +13,7 @@ maintainer: Jacob Stanley <jacob@stanley.io> category: System build-type: Simple-cabal-version: >= 1.6+cabal-version: >= 1.10 source-repository head type: git@@ -24,6 +24,7 @@ default: False Library+ default-language: Haskell2010 hs-source-dirs: src ghc-options: -Wall build-depends: base == 4.*@@ -56,7 +57,7 @@ else build-depends: directory == 1.1.* else- build-depends: time >= 1.0 && < 1.9+ build-depends: time >= 1.0 && < 1.10 build-depends: directory >= 1.2 && < 1.4 other-modules: