-- | 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) }