fix touch and statfs to work on any files in any locale
Use withCAString rather than withCString. XXX Actually, this only works in non-unicode locales when presented with unicode characters. Help?
This commit is contained in:
parent
44b115e0b1
commit
f1c7dc1212
3 changed files with 6 additions and 8 deletions
|
@ -84,9 +84,9 @@ cleanup file key hascontent = do
|
||||||
-- file it points to
|
-- file it points to
|
||||||
-- XXX Currently broken on non-utf8 locales when
|
-- XXX Currently broken on non-utf8 locales when
|
||||||
-- dealing with utf-8 filenames.
|
-- dealing with utf-8 filenames.
|
||||||
--liftIO $ do
|
liftIO $ do
|
||||||
--mtime <- modificationTime <$> getFileStatus file
|
mtime <- modificationTime <$> getFileStatus file
|
||||||
--touch file (TimeSpec mtime) False
|
touch file (TimeSpec mtime) False
|
||||||
|
|
||||||
force <- Annex.getState Annex.force
|
force <- Annex.getState Annex.force
|
||||||
if force
|
if force
|
||||||
|
|
|
@ -50,8 +50,6 @@ module Utility.StatFS ( FileSystemStats(..), getFileSystemStats ) where
|
||||||
import Foreign
|
import Foreign
|
||||||
import Foreign.C.Types
|
import Foreign.C.Types
|
||||||
import Foreign.C.String
|
import Foreign.C.String
|
||||||
import Data.ByteString (useAsCString)
|
|
||||||
import Data.ByteString.Char8 (pack)
|
|
||||||
|
|
||||||
#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)
|
#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)
|
||||||
# include <sys/param.h>
|
# include <sys/param.h>
|
||||||
|
@ -105,7 +103,7 @@ getFileSystemStats path =
|
||||||
return Nothing
|
return Nothing
|
||||||
#else
|
#else
|
||||||
allocaBytes (#size struct statfs) $ \vfs ->
|
allocaBytes (#size struct statfs) $ \vfs ->
|
||||||
useAsCString (pack path) $ \cpath -> do
|
withCAString path $ \cpath -> do
|
||||||
res <- c_statfs cpath vfs
|
res <- c_statfs cpath vfs
|
||||||
if res == -1 then return Nothing
|
if res == -1 then return Nothing
|
||||||
else do
|
else do
|
||||||
|
|
|
@ -64,7 +64,7 @@ foreign import ccall "utimensat"
|
||||||
|
|
||||||
touchBoth file atime mtime follow =
|
touchBoth file atime mtime follow =
|
||||||
allocaArray 2 $ \ptr ->
|
allocaArray 2 $ \ptr ->
|
||||||
withCString file $ \f -> do
|
withCAString file $ \f -> do
|
||||||
pokeArray ptr [atime, mtime]
|
pokeArray ptr [atime, mtime]
|
||||||
r <- c_utimensat at_fdcwd f ptr flags
|
r <- c_utimensat at_fdcwd f ptr flags
|
||||||
when (r /= 0) $ throwErrno "touchBoth"
|
when (r /= 0) $ throwErrno "touchBoth"
|
||||||
|
@ -101,7 +101,7 @@ foreign import ccall "lutimes"
|
||||||
|
|
||||||
touchBoth file atime mtime follow =
|
touchBoth file atime mtime follow =
|
||||||
allocaArray 2 $ \ptr ->
|
allocaArray 2 $ \ptr ->
|
||||||
withCString file $ \f -> do
|
withCAString file $ \f -> do
|
||||||
pokeArray ptr [atime, mtime]
|
pokeArray ptr [atime, mtime]
|
||||||
r <- syscall f ptr
|
r <- syscall f ptr
|
||||||
if (r /= 0)
|
if (r /= 0)
|
||||||
|
|
Loading…
Reference in a new issue