-- License : BSD-style (see the file libraries/base/LICENSE)
--
-- Maintainer : libraries@haskell.org
--- Stability : provisional
+-- Stability : stable
-- Portability : portable
--
-- System-independent interface to directory manipulation.
read <- c_access s r_OK
write <- c_access s w_OK
exec <- c_access s x_OK
- withFileStatus name $ \st -> do
+ withFileStatus "getPermissions" name $ \st -> do
is_dir <- isDirectory st
return (
Permissions {
The operand is not a valid directory name.
[ENAMETOOLONG, ELOOP]
-* 'isDoesNotExist' 'NoSuchThing'
+* 'isDoesNotExistError' \/ 'NoSuchThing'
The directory does not exist.
@[ENOENT, ENOTDIR]@
withCString path $ \s ->
throwErrnoIfMinus1Retry_ "removeDirectory" (c_rmdir s)
-{- |@'removefile' file@ removes the directory entry for an existing file
+{- |'removeFile' /file/ removes the directory entry for an existing file
/file/, where /file/ is not itself a directory. The
implementation may specify additional constraints which must be
satisfied before a file can be removed (e.g. the file may not be in
* 'HardwareFault'
A physical I\/O error has occurred.
-'EIO'
+@[EIO]@
* 'InvalidArgument'
The operand is not a valid file name.
@[ENAMETOOLONG, ELOOP]@
-* 'isDoesNotExist' \/ 'NoSuchThing'
+* 'isDoesNotExistError' \/ 'NoSuchThing'
The file does not exist.
@[ENOENT, ENOTDIR]@
renameDirectory :: FilePath -> FilePath -> IO ()
renameDirectory opath npath =
- withFileStatus opath $ \st -> do
+ withFileStatus "renameDirectory" opath $ \st -> do
is_dir <- isDirectory st
if (not is_dir)
then ioException (IOError Nothing InappropriateType "renameDirectory"
renameFile :: FilePath -> FilePath -> IO ()
renameFile opath npath =
- withFileOrSymlinkStatus opath $ \st -> do
+ withFileOrSymlinkStatus "renameFile" opath $ \st -> do
is_dir <- isDirectory st
if is_dir
then ioException (IOError Nothing InappropriateType "renameFile"
getCurrentDirectory :: IO FilePath
getCurrentDirectory = do
- p <- mallocBytes path_max
- go p path_max
+ p <- mallocBytes long_path_size
+ go p long_path_size
where go p bytes = do
p' <- c_getcwd p (fromIntegral bytes)
if p' /= nullPtr
doesDirectoryExist :: FilePath -> IO Bool
doesDirectoryExist name =
catch
- (withFileStatus name $ \st -> isDirectory st)
+ (withFileStatus "doesDirectoryExist" name $ \st -> isDirectory st)
(\ _ -> return False)
{- |The operation 'doesFileExist' returns 'True'
doesFileExist :: FilePath -> IO Bool
doesFileExist name = do
catch
- (withFileStatus name $ \st -> do b <- isDirectory st; return (not b))
+ (withFileStatus "doesFileExist" name $ \st -> do b <- isDirectory st; return (not b))
(\ _ -> return False)
{- |The 'getModificationTime' operation returns the
getModificationTime :: FilePath -> IO ClockTime
getModificationTime name =
- withFileStatus name $ \ st ->
+ withFileStatus "getModificationTime" name $ \ st ->
modificationTime st
-withFileStatus :: FilePath -> (Ptr CStat -> IO a) -> IO a
-withFileStatus name f = do
+withFileStatus :: String -> FilePath -> (Ptr CStat -> IO a) -> IO a
+withFileStatus loc name f = do
modifyIOError (`ioeSetFileName` name) $
allocaBytes sizeof_stat $ \p ->
withCString (fileNameEndClean name) $ \s -> do
- throwErrnoIfMinus1Retry_ "withFileStatus" (c_stat s p)
+ throwErrnoIfMinus1Retry_ loc (c_stat s p)
f p
-withFileOrSymlinkStatus :: FilePath -> (Ptr CStat -> IO a) -> IO a
-withFileOrSymlinkStatus name f = do
+withFileOrSymlinkStatus :: String -> FilePath -> (Ptr CStat -> IO a) -> IO a
+withFileOrSymlinkStatus loc name f = do
modifyIOError (`ioeSetFileName` name) $
allocaBytes sizeof_stat $ \p ->
withCString name $ \s -> do
- throwErrnoIfMinus1Retry_ "withFileOrSymlinkStatus" (lstat s p)
+ throwErrnoIfMinus1Retry_ loc (lstat s p)
f p
modificationTime :: Ptr CStat -> IO ClockTime
fileNameEndClean :: String -> String
fileNameEndClean name =
- if i >= 0 && (ec == '\\' || ec == '/') then
+ if i > 0 && (ec == '\\' || ec == '/') then
fileNameEndClean (take i name)
else
name
unionCMode = (+)
-foreign import ccall unsafe "__hscore_path_max"
- path_max :: Int
+foreign import ccall unsafe "__hscore_long_path_size"
+ long_path_size :: Int
foreign import ccall unsafe "__hscore_R_OK" r_OK :: CMode
foreign import ccall unsafe "__hscore_W_OK" w_OK :: CMode