{-# LINE 1 "src/HsShellScript/Misc.chs" #-}
module HsShellScript.Misc where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp
import qualified Foreign.Storable as C2HSImp
import Control.Exception
import Control.Monad
import Data.Bits
import Data.Typeable
import Foreign
import Foreign.C
import Foreign.C.Error
import Foreign.C.String
import Foreign.Ptr
import GHC.IO hiding (finally, bracket)
import GHC.IO.Exception
import HsShellScript.ProcErr
import Prelude hiding (catch)
import System.Directory
import System.IO
import System.IO.Error hiding (catch)
import System.Posix hiding (removeDirectory)
import System.Random
zeros :: Int
-> Int
-> String
zeros :: Int -> Int -> String
zeros Int
stellen Int
z =
let txt :: String
txt = Int -> String
forall a. Show a => a -> String
show Int
z
auff :: Int
auff = Int
stellen Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
txt
n :: String
n = Int -> String -> String
forall a. Int -> [a] -> [a]
take (if Int
auff Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 then Int
auff else Int
0) (Char -> String
forall a. a -> [a]
repeat Char
'0')
in String
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
txt
chomp :: String
-> String
chomp :: String -> String
chomp String
"" = String
""
chomp String
"\n" = String
""
chomp [Char
x] = [Char
x]
chomp (Char
x:String
xs) = let xs' :: String
xs' = String -> String
chomp String
xs
in if String
xs' String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"" Bool -> Bool -> Bool
&& Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'\n' then String
"" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
xs'
lazy_contents :: String
-> IO String
lazy_contents :: String -> IO String
lazy_contents String
path = do
Handle
h <- if String
path String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
"-" then Handle -> IO Handle
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Handle
stdin else String -> IOMode -> IO Handle
openFile String
path IOMode
ReadMode
Handle -> IO String
hGetContents Handle
h
contents :: String
-> IO String
contents :: String -> IO String
contents String
pfad = do
String
txt <- String -> IO String
lazy_contents String
pfad
Int -> IO () -> IO ()
forall a b. a -> b -> b
seq (String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
txt) (() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return String
txt
path_exists :: String
-> IO Bool
path_exists :: String -> IO Bool
path_exists String
pfad = do
Bool
de <- String -> IO Bool
doesDirectoryExist String
pfad
Bool
fe <- String -> IO Bool
doesFileExist String
pfad
Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool
de Bool -> Bool -> Bool
|| Bool
fe)
path_exists' :: String
-> IO Bool
path_exists' :: String -> IO Bool
path_exists' String
path =
IO Bool -> (IOException -> IO Bool) -> IO Bool
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch (do String -> IO FileStatus
getSymbolicLinkStatus String
path
Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True)
(\(IOException
ioe :: IOError) ->
if IOException -> Bool
isDoesNotExistError IOException
ioe then Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
else IOException -> IO Bool
forall a. IOException -> IO a
ioError IOException
ioe)
is_dir :: String
-> IO Bool
is_dir :: String -> IO Bool
is_dir = String -> IO Bool
doesDirectoryExist
is_file :: String
-> IO Bool
is_file :: String -> IO Bool
is_file = String -> IO Bool
doesFileExist
getFileStatus' :: FilePath
-> IO FileStatus
getFileStatus' :: String -> IO FileStatus
getFileStatus' String
path =
String -> IO FileStatus
getFileStatus String
path
IO FileStatus -> (IOException -> IO FileStatus) -> IO FileStatus
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
`catch` (\IOException
ioe -> IOException -> IO FileStatus
forall a. IOException -> IO a
ioError (IOException
ioe { ioe_filename :: Maybe String
ioe_filename = String -> Maybe String
forall a. a -> Maybe a
Just String
path }))
fileAccess' :: FilePath -> Bool -> Bool -> Bool -> IO Bool
fileAccess' :: String -> Bool -> Bool -> Bool -> IO Bool
fileAccess' String
p Bool
b Bool
c Bool
d =
String -> Bool -> Bool -> Bool -> IO Bool
fileAccess String
p Bool
b Bool
c Bool
d
IO Bool -> (IOException -> IO Bool) -> IO Bool
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
`catch` (\IOException
ioe -> IOException -> IO Bool
forall a. IOException -> IO a
ioError (IOException
ioe { ioe_filename :: Maybe String
ioe_filename = String -> Maybe String
forall a. a -> Maybe a
Just String
p }))
temp_file :: Int
-> String
-> String
-> IO FilePath
temp_file :: Int -> String -> String -> IO String
temp_file Int
nr String
prefix String
suffix = do
(CInt
fd, String
path) <- IO (CInt, String)
-> ((CInt, String) -> IO Bool) -> IO (CInt, String)
forall {m :: * -> *} {b}. Monad m => m b -> (b -> m Bool) -> m b
untilIO (do String
path <- Int -> String -> String -> IO String
temp_path Int
nr String
prefix String
suffix
CInt
fd <- String -> (Ptr CChar -> IO CInt) -> IO CInt
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCString String
path ((Ptr CChar -> IO CInt) -> IO CInt)
-> (Ptr CChar -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
cpath ->
Ptr CChar -> CInt -> CUInt -> IO CInt
hsshellscript_open_nonvariadic Ptr CChar
cpath (CInt
o_CREAT CInt -> CInt -> CInt
forall a. Bits a => a -> a -> a
.|. CInt
o_EXCL) CUInt
0o600
(CInt, String) -> IO (CInt, String)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (CInt
fd, String
path)
)
(\(CInt
fd, String
path) ->
if CInt
fd CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1 then do Errno
errno <- IO Errno
getErrno
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Errno
errno Errno -> Errno -> Bool
forall a. Eq a => a -> a -> Bool
/= Errno
eEXIST) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
String -> Maybe Handle -> Maybe String -> IO ()
forall a. String -> Maybe Handle -> Maybe String -> IO a
throwErrno' String
"temp_file" Maybe Handle
forall a. Maybe a
Nothing (String -> Maybe String
forall a. a -> Maybe a
Just String
path)
Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
else Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
)
CInt
res <- CInt -> IO CInt
c_close CInt
fd
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (CInt
res CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$ String -> Maybe Handle -> Maybe String -> IO ()
forall a. String -> Maybe Handle -> Maybe String -> IO a
throwErrno' String
"temp_file" Maybe Handle
forall a. Maybe a
Nothing (String -> Maybe String
forall a. a -> Maybe a
Just String
path)
String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return String
path
temp_dir :: Int
-> String
-> String
-> IO FilePath
temp_dir :: Int -> String -> String -> IO String
temp_dir Int
nr String
prefix String
suffix = do
(CInt
_, String
path) <- IO (CInt, String)
-> ((CInt, String) -> IO Bool) -> IO (CInt, String)
forall {m :: * -> *} {b}. Monad m => m b -> (b -> m Bool) -> m b
untilIO (do String
path <- Int -> String -> String -> IO String
temp_path Int
nr String
prefix String
suffix
CInt
ret <- String -> (Ptr CChar -> IO CInt) -> IO CInt
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCString String
path ((Ptr CChar -> IO CInt) -> IO CInt)
-> (Ptr CChar -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
cpath -> Ptr CChar -> CUInt -> IO CInt
c_mkdir Ptr CChar
cpath CUInt
0o700
(CInt, String) -> IO (CInt, String)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (CInt
ret, String
path)
)
(\(CInt
ret, String
path) ->
if CInt
ret CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== -CInt
1 then do Errno
errno <- IO Errno
getErrno
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Errno
errno Errno -> Errno -> Bool
forall a. Eq a => a -> a -> Bool
/= Errno
eEXIST) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
String -> Maybe Handle -> Maybe String -> IO ()
forall a. String -> Maybe Handle -> Maybe String -> IO a
throwErrno' String
"temp_dir" Maybe Handle
forall a. Maybe a
Nothing (String -> Maybe String
forall a. a -> Maybe a
Just String
path)
Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
else Bool -> IO Bool
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
)
String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return String
path
tmp_file :: String
-> IO FilePath
tmp_file :: String -> IO String
tmp_file String
prefix = Int -> String -> String -> IO String
temp_file Int
6 (String
prefix String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".") String
""
tmp_dir :: String
-> IO FilePath
tmp_dir :: String -> IO String
tmp_dir String
prefix = Int -> String -> String -> IO String
temp_dir Int
6 (String
prefix String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".") String
""
with_temp_file :: Int
-> String
-> String
-> (Handle -> IO a)
-> IO a
with_temp_file :: forall a. Int -> String -> String -> (Handle -> IO a) -> IO a
with_temp_file Int
nr String
prefix String
suffix Handle -> IO a
io =
IO (String, Handle)
-> ((String, Handle) -> IO ())
-> ((String, Handle) -> IO a)
-> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (do String
path <- Int -> String -> String -> IO String
temp_file Int
nr String
prefix String
suffix
Handle
h <- String -> IOMode -> IO Handle
openFile String
path IOMode
ReadWriteMode
(String, Handle) -> IO (String, Handle)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (String
path, Handle
h)
)
(\(String
path,Handle
h) -> do
Handle -> IO ()
hClose Handle
h
String -> IO ()
removeFile String
path
)
(\(String
path,Handle
h) ->
Handle -> IO a
io Handle
h
)
with_temp_dir :: Int
-> String
-> String
-> (FilePath -> IO a)
-> IO a
with_temp_dir :: forall a. Int -> String -> String -> (String -> IO a) -> IO a
with_temp_dir Int
nr String
prefix String
suffix String -> IO a
io =
do String
path <- Int -> String -> String -> IO String
temp_dir Int
nr String
prefix String
suffix
a
a <- IO a -> (SomeException -> IO a) -> IO a
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch (String -> IO a
io String
path)
(\SomeException
e -> do String -> IO ()
remove String
path IO () -> (SomeException -> IO ()) -> IO ()
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
`catch` (\(SomeException
e::SomeException) -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
SomeException -> IO a
forall a e. Exception e => e -> a
throw (SomeException
e :: SomeException)
)
String -> IO ()
remove String
path
a -> IO a
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a
where
remove :: String -> IO ()
remove String
path = String -> IO ()
removeDirectory String
path
IO () -> (IOException -> IO ()) -> IO ()
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
`catch` (\IOException
ioe -> IOException -> IO ()
forall a. IOException -> IO a
ioError (IOException
ioe { ioe_filename :: Maybe String
ioe_filename = String -> Maybe String
forall a. a -> Maybe a
Just String
path }))
with_tmp_file :: String
-> (Handle -> IO a)
-> IO a
with_tmp_file :: forall a. String -> (Handle -> IO a) -> IO a
with_tmp_file String
prefix Handle -> IO a
io =
IO (String, Handle)
-> ((String, Handle) -> IO ())
-> ((String, Handle) -> IO a)
-> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (do String
path <- String -> IO String
tmp_file String
prefix
Handle
h <- String -> IOMode -> IO Handle
openFile String
path IOMode
ReadWriteMode
(String, Handle) -> IO (String, Handle)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (String
path, Handle
h)
)
(\(String
path,Handle
h) -> do
Handle -> IO ()
hClose Handle
h
String -> IO ()
removeFile String
path
)
(\(String
path,Handle
h) -> do
a
e <- Handle -> IO a
io Handle
h
a -> IO a
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
e
)
with_tmp_dir :: String
-> (FilePath -> IO a)
-> IO a
with_tmp_dir :: forall a. String -> (String -> IO a) -> IO a
with_tmp_dir String
prefix String -> IO a
io = Int -> String -> String -> (String -> IO a) -> IO a
forall a. Int -> String -> String -> (String -> IO a) -> IO a
with_temp_dir Int
6 (String
prefix String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".") String
"" String -> IO a
io
temp_path :: Int
-> String
-> String
-> IO FilePath
temp_path :: Int -> String -> String -> IO String
temp_path Int
nr String
prefix String
suffix = do
IO String -> (String -> IO Bool) -> IO String
forall {m :: * -> *} {b}. Monad m => m b -> (b -> m Bool) -> m b
untilIO (do String
rand <- [IO Char] -> IO String
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence (Int -> [IO Char] -> [IO Char]
forall a. Int -> [a] -> [a]
take Int
nr (IO Char -> [IO Char]
forall a. a -> [a]
repeat ((Int -> Char) -> IO Int -> IO Char
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Char
char ((Int, Int) -> IO Int
forall a. Random a => (a, a) -> IO a
randomRIO (Int
0, Int
10Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
2Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
26 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)))))
String -> IO String
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (String
prefix String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
rand String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
suffix)
)
(\String
path -> (Bool -> Bool) -> IO Bool -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Bool -> Bool
not (String -> IO Bool
path_exists' String
path))
where char :: Int -> Char
char Int
nr = String
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" String -> Int -> Char
forall a. HasCallStack => [a] -> Int -> a
!! Int
nr
untilIO :: m b -> (b -> m Bool) -> m b
untilIO m b
io b -> m Bool
cond = do
b
res <- m b
io
Bool
u <- b -> m Bool
cond b
res
if Bool
u then b -> m b
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return b
res
else m b -> (b -> m Bool) -> m b
untilIO m b
io b -> m Bool
cond
data Mntent = Mntent { Mntent -> String
mnt_fsname :: String
, Mntent -> String
mnt_dir :: String
, Mntent -> String
mnt_type :: String
, Mntent -> String
mnt_opts :: String
, Mntent -> Int
mnt_freq :: Int
, Mntent -> Int
mnt_passno :: Int
}
deriving (ReadPrec [Mntent]
ReadPrec Mntent
Int -> ReadS Mntent
ReadS [Mntent]
(Int -> ReadS Mntent)
-> ReadS [Mntent]
-> ReadPrec Mntent
-> ReadPrec [Mntent]
-> Read Mntent
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Mntent
readsPrec :: Int -> ReadS Mntent
$creadList :: ReadS [Mntent]
readList :: ReadS [Mntent]
$creadPrec :: ReadPrec Mntent
readPrec :: ReadPrec Mntent
$creadListPrec :: ReadPrec [Mntent]
readListPrec :: ReadPrec [Mntent]
Read, Int -> Mntent -> String -> String
[Mntent] -> String -> String
Mntent -> String
(Int -> Mntent -> String -> String)
-> (Mntent -> String)
-> ([Mntent] -> String -> String)
-> Show Mntent
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> Mntent -> String -> String
showsPrec :: Int -> Mntent -> String -> String
$cshow :: Mntent -> String
show :: Mntent -> String
$cshowList :: [Mntent] -> String -> String
showList :: [Mntent] -> String -> String
Show, Typeable, Mntent -> Mntent -> Bool
(Mntent -> Mntent -> Bool)
-> (Mntent -> Mntent -> Bool) -> Eq Mntent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Mntent -> Mntent -> Bool
== :: Mntent -> Mntent -> Bool
$c/= :: Mntent -> Mntent -> Bool
/= :: Mntent -> Mntent -> Bool
Eq)
read_mounts :: String
-> IO [Mntent]
read_mounts :: String -> IO [Mntent]
read_mounts String
path = do
Ptr ()
h <- String -> (Ptr CChar -> IO (Ptr ())) -> IO (Ptr ())
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCString String
path ((Ptr CChar -> IO (Ptr ())) -> IO (Ptr ()))
-> (Ptr CChar -> IO (Ptr ())) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
cpath ->
String -> (Ptr CChar -> IO (Ptr ())) -> IO (Ptr ())
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCString String
"r" ((Ptr CChar -> IO (Ptr ())) -> IO (Ptr ()))
-> (Ptr CChar -> IO (Ptr ())) -> IO (Ptr ())
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
r ->
Ptr CChar -> Ptr CChar -> IO (Ptr ())
setmntent Ptr CChar
cpath Ptr CChar
r
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Ptr ()
h Ptr () -> Ptr () -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr ()
forall a. Ptr a
nullPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
String -> Maybe Handle -> Maybe String -> IO ()
forall a. String -> Maybe Handle -> Maybe String -> IO a
throwErrno' String
"setmntent(3) in read_mounts" Maybe Handle
forall a. Maybe a
Nothing (String -> Maybe String
forall a. a -> Maybe a
Just String
path)
[Mntent]
mntent <- Ptr () -> [Mntent] -> IO [Mntent]
getmntent Ptr ()
h []
Ptr () -> IO CInt
endmntent Ptr ()
h
[Mntent] -> IO [Mntent]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Mntent]
mntent
where
getmntent :: Ptr () -> [Mntent] -> IO [Mntent]
getmntent Ptr ()
h [Mntent]
l = do
Ptr ()
ptr <- Ptr () -> IO (Ptr ())
c_getmntent Ptr ()
h
if (Ptr ()
ptr Ptr () -> Ptr () -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr ()
forall a. Ptr a
nullPtr) then [Mntent] -> IO [Mntent]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return [Mntent]
l
else do String
mnt_fsname_str <- (\Ptr ()
ptr -> do {Ptr () -> Int -> IO (Ptr CChar)
forall b. Ptr b -> Int -> IO (Ptr CChar)
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
0 :: IO (C2HSImp.Ptr C2HSImp.CChar)}) Ptr ()
ptr IO (Ptr CChar) -> (Ptr CChar -> IO String) -> IO String
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr CChar -> IO String
peekCString
String
mnt_dir_str <- (\Ptr ()
ptr -> do {Ptr () -> Int -> IO (Ptr CChar)
forall b. Ptr b -> Int -> IO (Ptr CChar)
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
8 :: IO (C2HSImp.Ptr C2HSImp.CChar)}) Ptr ()
ptr IO (Ptr CChar) -> (Ptr CChar -> IO String) -> IO String
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr CChar -> IO String
peekCString
String
mnt_type_str <- (\Ptr ()
ptr -> do {Ptr () -> Int -> IO (Ptr CChar)
forall b. Ptr b -> Int -> IO (Ptr CChar)
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
16 :: IO (C2HSImp.Ptr C2HSImp.CChar)}) Ptr ()
ptr IO (Ptr CChar) -> (Ptr CChar -> IO String) -> IO String
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr CChar -> IO String
peekCString
String
mnt_opts_str <- (\Ptr ()
ptr -> do {Ptr () -> Int -> IO (Ptr CChar)
forall b. Ptr b -> Int -> IO (Ptr CChar)
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
24 :: IO (C2HSImp.Ptr C2HSImp.CChar)}) Ptr ()
ptr IO (Ptr CChar) -> (Ptr CChar -> IO String) -> IO String
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Ptr CChar -> IO String
peekCString
Int
mnt_freq_int <- (CInt -> Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CInt -> Int
forall a. Enum a => a -> Int
fromEnum (IO CInt -> IO Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> a -> b
$ (\Ptr ()
ptr -> do {Ptr () -> Int -> IO CInt
forall b. Ptr b -> Int -> IO CInt
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
32 :: IO C2HSImp.CInt}) Ptr ()
ptr
Int
mnt_passno_int <- (CInt -> Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CInt -> Int
forall a. Enum a => a -> Int
fromEnum (IO CInt -> IO Int) -> IO CInt -> IO Int
forall a b. (a -> b) -> a -> b
$ (\Ptr ()
ptr -> do {Ptr () -> Int -> IO CInt
forall b. Ptr b -> Int -> IO CInt
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
36 :: IO C2HSImp.CInt}) Ptr ()
ptr
Ptr () -> [Mntent] -> IO [Mntent]
getmntent Ptr ()
h ([Mntent]
l [Mntent] -> [Mntent] -> [Mntent]
forall a. [a] -> [a] -> [a]
++ [Mntent { mnt_fsname :: String
mnt_fsname = String
mnt_fsname_str
, mnt_dir :: String
mnt_dir = String
mnt_dir_str
, mnt_type :: String
mnt_type = String
mnt_type_str
, mnt_opts :: String
mnt_opts = String
mnt_opts_str
, mnt_freq :: Int
mnt_freq = Int
mnt_freq_int
, mnt_passno :: Int
mnt_passno = Int
mnt_passno_int
}])
read_mtab :: IO [Mntent]
read_mtab :: IO [Mntent]
read_mtab = String -> IO [Mntent]
read_mounts String
"/etc/mtab"
read_fstab :: IO [Mntent]
read_fstab :: IO [Mntent]
read_fstab = String -> IO [Mntent]
read_mounts String
"/etc/fstab"
foreign import ccall unsafe "HsBase.h __hscore_o_creat" o_CREAT :: CInt
foreign import ccall unsafe "HsBase.h __hscore_o_excl" o_EXCL :: CInt
glob :: String
-> IO [String]
glob :: String -> IO [String]
glob String
pattern = do
String -> (Ptr CChar -> IO [String]) -> IO [String]
forall a. String -> (Ptr CChar -> IO a) -> IO a
withCString String
pattern ((Ptr CChar -> IO [String]) -> IO [String])
-> (Ptr CChar -> IO [String]) -> IO [String]
forall a b. (a -> b) -> a -> b
$ \Ptr CChar
pattern_ptr ->
Int -> (Ptr () -> IO [String]) -> IO [String]
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes Int
72 ((Ptr () -> IO [String]) -> IO [String])
-> (Ptr () -> IO [String]) -> IO [String]
forall a b. (a -> b) -> a -> b
$ \Ptr ()
buf_ptr ->
do CInt
res <- Ptr () -> Ptr CChar -> IO CInt
do_glob Ptr ()
buf_ptr Ptr CChar
pattern_ptr
case CInt
res of
CInt
0 ->
do Ptr (Ptr CChar)
pptr <- (\Ptr ()
ptr -> do {Ptr () -> Int -> IO (Ptr (Ptr CChar))
forall b. Ptr b -> Int -> IO (Ptr (Ptr CChar))
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
8 :: IO (C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar))}) Ptr ()
buf_ptr
Int
len <- Ptr CChar -> Ptr (Ptr CChar) -> IO Int
forall a. (Storable a, Eq a) => a -> Ptr a -> IO Int
lengthArray0 Ptr CChar
forall a. Ptr a
nullPtr Ptr (Ptr CChar)
pptr
[Ptr CChar]
cstrs <- Int -> Ptr (Ptr CChar) -> IO [Ptr CChar]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
len Ptr (Ptr CChar)
pptr
(Ptr CChar -> IO String) -> [Ptr CChar] -> IO [String]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Ptr CChar -> IO String
peekCString [Ptr CChar]
cstrs
CInt
1 ->
String -> Maybe Handle -> Maybe String -> IO [String]
forall a. String -> Maybe Handle -> Maybe String -> IO a
throwErrno' String
"glob" Maybe Handle
forall a. Maybe a
Nothing (String -> Maybe String
forall a. a -> Maybe a
Just String
pattern)
CInt
2 ->
IOException -> IO [String]
forall a. IOException -> IO a
ioError (IOException -> String -> IOException
ioeSetErrorString (IOErrorType
-> String -> Maybe Handle -> Maybe String -> IOException
mkIOError IOErrorType
ResourceExhausted String
"glob" Maybe Handle
forall a. Maybe a
Nothing (String -> Maybe String
forall a. a -> Maybe a
Just String
pattern))
String
"Out of memory")
CInt
3 ->
[String] -> IO [String]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return []
IO [String] -> IO () -> IO [String]
forall a b. IO a -> IO b -> IO a
`finally`
(do Ptr (Ptr CChar)
pptr <- (\Ptr ()
ptr -> do {Ptr () -> Int -> IO (Ptr (Ptr CChar))
forall b. Ptr b -> Int -> IO (Ptr (Ptr CChar))
forall a b. Storable a => Ptr b -> Int -> IO a
C2HSImp.peekByteOff Ptr ()
ptr Int
8 :: IO (C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar))}) Ptr ()
buf_ptr
Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Ptr (Ptr CChar)
pptr Ptr (Ptr CChar) -> Ptr (Ptr CChar) -> Bool
forall a. Eq a => a -> a -> Bool
/= Ptr (Ptr CChar)
forall a. Ptr a
nullPtr) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
Ptr () -> IO ()
globfree Ptr ()
buf_ptr
)
glob_quote :: String
-> String
glob_quote :: String -> String
glob_quote String
path =
case String
path of
[] -> []
(Char
'*':String
rest) -> (Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'*'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
glob_quote String
rest)
(Char
'?':String
rest) -> (Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'?'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
glob_quote String
rest)
(Char
'[':String
rest) -> (Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'['Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
glob_quote String
rest)
(Char
'\\':String
rest) -> (Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:Char
'\\'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
glob_quote String
rest)
(Char
ch:String
rest) -> Char
ch Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
glob_quote String
rest
foreign import ccall safe "HsShellScript/Misc.chs.h hsshellscript_open_nonvariadic"
hsshellscript_open_nonvariadic :: ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CInt -> (C2HSImp.CUInt -> (IO C2HSImp.CInt))))
foreign import ccall safe "HsShellScript/Misc.chs.h close"
c_close :: (C2HSImp.CInt -> (IO C2HSImp.CInt))
foreign import ccall safe "HsShellScript/Misc.chs.h mkdir"
c_mkdir :: ((C2HSImp.Ptr C2HSImp.CChar) -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))
foreign import ccall safe "HsShellScript/Misc.chs.h setmntent"
setmntent :: ((C2HSImp.Ptr C2HSImp.CChar) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (IO (C2HSImp.Ptr ()))))
foreign import ccall safe "HsShellScript/Misc.chs.h endmntent"
endmntent :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))
foreign import ccall safe "HsShellScript/Misc.chs.h getmntent"
c_getmntent :: ((C2HSImp.Ptr ()) -> (IO (C2HSImp.Ptr ())))
foreign import ccall safe "HsShellScript/Misc.chs.h do_glob"
do_glob :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr C2HSImp.CChar) -> (IO C2HSImp.CInt)))
foreign import ccall safe "HsShellScript/Misc.chs.h globfree"
globfree :: ((C2HSImp.Ptr ()) -> (IO ()))