--- |Computation of @'generateETagFromFile' fpath@ generates a strong
--- entity tag from a file. The file doesn't necessarily have to be a
--- regular file; it may be a FIFO or a device file. The tag is made of
--- inode ID, size and modification time.
---
--- Note that the tag is not strictly strong because the file could be
--- modified twice at a second without changing inode ID or size, but
--- it's not really possible to generate a strict strong ETag from a
--- file since we don't want to simply grab the entire file and use it
--- as an ETag. It is indeed possible to hash it with SHA-1 or MD5 to
--- increase strictness, but it's too inefficient if the file is really
--- large (say, 1 TiB).
-generateETagFromFile :: FilePath -> IO ETag
-generateETagFromFile path
- = path `seq`
- do stat <- getFileStatus path
- let inode = fromEnum $! fileID stat
- size = fromEnum $! fileSize stat
- lastMod = fromEnum $! modificationTime stat
- tag = fmtHex False 0 inode
- ++ "-" ++
- fmtHex False 0 size
- ++ "-" ++
- fmtHex False 0 lastMod
- return $! strongETag tag