From a3d23d8de3b8129df831b73507220525eb304998 Mon Sep 17 00:00:00 2001 From: Mann mit Hut <github+mmhat@with-h.at> Date: Thu, 9 Feb 2023 01:34:27 +0100 Subject: [PATCH] Renamed pattern synonyms and added some more Haddocks --- System/Posix/Directory.hsc | 24 +++-- System/Posix/Directory/ByteString.hsc | 24 +++-- System/Posix/Directory/Common.hsc | 129 +++++++++++++++++++------- System/Posix/Directory/PosixPath.hsc | 24 +++-- 4 files changed, 138 insertions(+), 63 deletions(-) diff --git a/System/Posix/Directory.hsc b/System/Posix/Directory.hsc index 5e2f621..4aeedfb 100644 --- a/System/Posix/Directory.hsc +++ b/System/Posix/Directory.hsc @@ -29,16 +29,19 @@ module System.Posix.Directory ( -- * Reading directories DirStream, - DirType( DtUnknown - , DtFifo - , DtChr - , DtDir - , DtBlk - , DtReg - , DtLnk - , DtSock - , DtWht + DirType( UnknownType + , NamedPipeType + , CharacterDeviceType + , DirectoryType + , BlockDeviceType + , RegularFileType + , SymbolicLinkType + , SocketType + , WhiteoutType ), + isUnknownType, isBlockDeviceType, isCharacterDeviceType, isNamedPipeType, + isRegularFileType, isDirectoryType, isSymbolicLinkType, isSocketType, + isWhiteoutType, openDirStream, readDirStream, readDirStreamMaybe, @@ -118,6 +121,9 @@ readDirStreamMaybe = readDirStreamWith -- structure together with the entry's type (@d_type@) wrapped in a -- @Just (d_name, d_type)@ if an entry was read and @Nothing@ if -- the end of the directory stream was reached. +-- +-- __Note__: The returned 'DirType' has some limitations; Please see its +-- documentation. readDirStreamWithType :: DirStream -> IO (Maybe (FilePath, DirType)) readDirStreamWithType = readDirStreamWith (\(DirEnt dEnt) -> (,) diff --git a/System/Posix/Directory/ByteString.hsc b/System/Posix/Directory/ByteString.hsc index 875124e..83fa09b 100644 --- a/System/Posix/Directory/ByteString.hsc +++ b/System/Posix/Directory/ByteString.hsc @@ -29,16 +29,19 @@ module System.Posix.Directory.ByteString ( -- * Reading directories DirStream, - DirType( DtUnknown - , DtFifo - , DtChr - , DtDir - , DtBlk - , DtReg - , DtLnk - , DtSock - , DtWht + DirType( UnknownType + , NamedPipeType + , CharacterDeviceType + , DirectoryType + , BlockDeviceType + , RegularFileType + , SymbolicLinkType + , SocketType + , WhiteoutType ), + isUnknownType, isBlockDeviceType, isCharacterDeviceType, isNamedPipeType, + isRegularFileType, isDirectoryType, isSymbolicLinkType, isSocketType, + isWhiteoutType, openDirStream, readDirStream, readDirStreamMaybe, @@ -119,6 +122,9 @@ readDirStreamMaybe = readDirStreamWith -- structure together with the entry's type (@d_type@) wrapped in a -- @Just (d_name, d_type)@ if an entry was read and @Nothing@ if -- the end of the directory stream was reached. +-- +-- __Note__: The returned 'DirType' has some limitations; Please see its +-- documentation. readDirStreamWithType :: DirStream -> IO (Maybe (RawFilePath, DirType)) readDirStreamWithType = readDirStreamWith (\(DirEnt dEnt) -> (,) diff --git a/System/Posix/Directory/Common.hsc b/System/Posix/Directory/Common.hsc index 1dba7c6..b025bc8 100644 --- a/System/Posix/Directory/Common.hsc +++ b/System/Posix/Directory/Common.hsc @@ -21,16 +21,19 @@ module System.Posix.Directory.Common ( DirStream(..), DirEnt(..), CDir, CDirent, DirStreamOffset(..), DirType( DirType - , DtUnknown - , DtFifo - , DtChr - , DtDir - , DtBlk - , DtReg - , DtLnk - , DtSock - , DtWht + , UnknownType + , NamedPipeType + , CharacterDeviceType + , DirectoryType + , BlockDeviceType + , RegularFileType + , SymbolicLinkType + , SocketType + , WhiteoutType ), + isUnknownType, isBlockDeviceType, isCharacterDeviceType, isNamedPipeType, + isRegularFileType, isDirectoryType, isSymbolicLinkType, isSocketType, + isWhiteoutType, unsafeOpenDirStreamFd, readDirStreamWith, readDirStreamWithPtr, @@ -78,34 +81,88 @@ instance Storable DirEnt where data {-# CTYPE "DIR" #-} CDir data {-# CTYPE "struct dirent" #-} CDirent +-- | The value of the @d_type@ field of a @dirent@ struct. +-- Note that the possible values of that type depend on the filesystem that is +-- queried. From @readdir(3)@: +-- +-- > Currently, only some filesystems (among them: Btrfs, ext2, ext3, and ext4) +-- > have full support for returning the file type in d_type. All applications +-- > must properly handle a return of DT_UNKNOWN. +-- +-- For example, JFS is a filesystem that does not support @d_type@; +-- See https://github.com/haskell/ghcup-hs/issues/766 +-- +-- Furthermore, @dirent@ or the constants represented by the associated pattern +-- synonyms of this type may not be provided by the underlying platform. In that +-- case none of those patterns will match and the application must handle that +-- case accordingly. newtype DirType = DirType CChar - -pattern DtUnknown :: DirType -pattern DtUnknown = DirType CONST_DT_UNKNOWN - -pattern DtFifo :: DirType -pattern DtFifo = DirType (CONST_DT_FIFO) - -pattern DtChr :: DirType -pattern DtChr = DirType (CONST_DT_CHR) - -pattern DtDir :: DirType -pattern DtDir = DirType (CONST_DT_DIR) - -pattern DtBlk :: DirType -pattern DtBlk = DirType (CONST_DT_BLK) - -pattern DtReg :: DirType -pattern DtReg = DirType (CONST_DT_REG) - -pattern DtLnk :: DirType -pattern DtLnk = DirType (CONST_DT_LNK) - -pattern DtSock :: DirType -pattern DtSock = DirType (CONST_DT_SOCK) - -pattern DtWht :: DirType -pattern DtWht = DirType (CONST_DT_WHT) + deriving Eq + +-- | The 'DirType' refers to an entry of unknown type. +pattern UnknownType :: DirType +pattern UnknownType = DirType CONST_DT_UNKNOWN + +-- | The 'DirType' refers to an entry that is a named pipe. +pattern NamedPipeType :: DirType +pattern NamedPipeType = DirType CONST_DT_FIFO + +-- | The 'DirType' refers to an entry that is a character device. +pattern CharacterDeviceType :: DirType +pattern CharacterDeviceType = DirType CONST_DT_CHR + +-- | The 'DirType' refers to an entry that is a directory. +pattern DirectoryType :: DirType +pattern DirectoryType = DirType CONST_DT_DIR + +-- | The 'DirType' refers to an entry that is a block device. +pattern BlockDeviceType :: DirType +pattern BlockDeviceType = DirType CONST_DT_BLK + +-- | The 'DirType' refers to an entry that is a regular file. +pattern RegularFileType :: DirType +pattern RegularFileType = DirType CONST_DT_REG + +-- | The 'DirType' refers to an entry that is a symbolic link. +pattern SymbolicLinkType :: DirType +pattern SymbolicLinkType = DirType CONST_DT_LNK + +-- | The 'DirType' refers to an entry that is a socket. +pattern SocketType :: DirType +pattern SocketType = DirType CONST_DT_SOCK + +-- | The 'DirType' refers to an entry that is a whiteout. +pattern WhiteoutType :: DirType +pattern WhiteoutType = DirType CONST_DT_WHT + +-- | Checks if this 'DirType' refers to an entry of unknown type. +isUnknownType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a block device entry. +isBlockDeviceType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a character device entry. +isCharacterDeviceType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a named pipe entry. +isNamedPipeType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a regular file entry. +isRegularFileType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a directory entry. +isDirectoryType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a symbolic link entry. +isSymbolicLinkType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a socket entry. +isSocketType :: DirType -> Bool +-- | Checks if this 'DirType' refers to a whiteout entry. +isWhiteoutType :: DirType -> Bool + +isUnknownType dtype = dtype == UnknownType +isBlockDeviceType dtype = dtype == BlockDeviceType +isCharacterDeviceType dtype = dtype == CharacterDeviceType +isNamedPipeType dtype = dtype == NamedPipeType +isRegularFileType dtype = dtype == RegularFileType +isDirectoryType dtype = dtype == DirectoryType +isSymbolicLinkType dtype = dtype == SymbolicLinkType +isSocketType dtype = dtype == SocketType +isWhiteoutType dtype = dtype == WhiteoutType -- | Call @fdopendir@ to obtain a directory stream for @fd@. @fd@ must not be -- otherwise used after this. diff --git a/System/Posix/Directory/PosixPath.hsc b/System/Posix/Directory/PosixPath.hsc index 12b54d1..dcd69e4 100644 --- a/System/Posix/Directory/PosixPath.hsc +++ b/System/Posix/Directory/PosixPath.hsc @@ -28,16 +28,19 @@ module System.Posix.Directory.PosixPath ( -- * Reading directories Common.DirStream, - Common.DirType( DtUnknown - , DtFifo - , DtChr - , DtDir - , DtBlk - , DtReg - , DtLnk - , DtSock - , DtWht + Common.DirType( UnknownType + , NamedPipeType + , CharacterDeviceType + , DirectoryType + , BlockDeviceType + , RegularFileType + , SymbolicLinkType + , SocketType + , WhiteoutType ), + Common.isUnknownType, Common.isBlockDeviceType, Common.isCharacterDeviceType, + Common.isNamedPipeType, Common.isRegularFileType, Common.isDirectoryType, + Common.isSymbolicLinkType, Common.isSocketType, Common.isWhiteoutType, openDirStream, readDirStream, readDirStreamMaybe, @@ -117,6 +120,9 @@ readDirStreamMaybe = Common.readDirStreamWith -- structure together with the entry's type (@d_type@) wrapped in a -- @Just (d_name, d_type)@ if an entry was read and @Nothing@ if -- the end of the directory stream was reached. +-- +-- __Note__: The returned 'DirType' has some limitations; Please see its +-- documentation. readDirStreamWithType :: Common.DirStream -> IO (Maybe (PosixPath, Common.DirType)) readDirStreamWithType = Common.readDirStreamWith (\(Common.DirEnt dEnt) -> (,) -- GitLab