packages feed

Snusmumrik-0.0.1: FileStats.hs

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