-- | Default access rights for files and directories
module FileStats (defaultStats, bookStats) where
import System.Fuse
import System.Posix.User
import System.Posix.Files
import System.Posix.Types (FileMode)
import Book
-- | returns default FileStat for library files and library directories respectively
defaultStats :: IO (FileStat, FileStat) -- ^ IO (defaultFileStat, defaultDirStat)
defaultStats = do
defaultFile <- effectiveUser defaultFileStat
defaultDir <- effectiveUser defaultDirStat
return (defaultFile, defaultDir)
effectiveUser :: FileStat -> IO FileStat
effectiveUser stat = do
uid <- getEffectiveUserID
gid <- getEffectiveGroupID
return $ stat { statFileOwner = uid, statFileGroup = gid }
defaultDirStat :: FileStat
defaultDirStat = FileStat {
statEntryType = Directory
, statFileMode = defaultDirMode
, statLinkCount = 0
, statFileOwner = 0 -- please override
, statFileGroup = 0 -- please override
, statSpecialDeviceID = 0
, statFileSize = 0
, statBlocks = 0
, statAccessTime = 0
, statModificationTime = 0
, statStatusChangeTime = 0
}
defaultDirMode :: FileMode
defaultDirMode = foldr unionFileModes (entryTypeToFileMode Directory)
[ ownerReadMode, ownerExecuteMode, groupReadMode, groupExecuteMode ]
defaultFileStat :: FileStat
defaultFileStat = FileStat {
statEntryType = RegularFile
, statFileMode = defaultFileMode
, statLinkCount = 1
, statFileOwner = 0 -- please override
, statFileGroup = 0 -- please override
, statSpecialDeviceID = 0
, statFileSize = 0
, statBlocks = 0
, statAccessTime = 0
, statModificationTime = 0
, statStatusChangeTime = 0
}
defaultFileMode :: FileMode
defaultFileMode = foldr unionFileModes (entryTypeToFileMode RegularFile)
[ ownerReadMode, groupReadMode ]
-- | Update file stats according to book's metadata.
bookStats :: FileStat -> Book -> FileStat
bookStats stats b = let sz = size b
in stats { statFileSize = fromIntegral sz
, statBlocks = ceiling ((toRational sz) / 512) }