{-# LINE 1 "src/Magic/Operations.hsc" #-}
module Magic.Operations(
magicFile, magicStdin, magicDescriptor,
magicString, magicCString, magicByteString,
magicSetFlags, magicGetFlags,
magicGetParam, magicSetParam,
magicCompile, magicCheck, magicGetPath,
magicVersion, magicErrno)
where
import Foreign.Ptr
import Foreign.C.String
import Foreign.C.Types
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Utils (with)
import Foreign.Storable (peek)
import Data.Word
import Data.ByteString (ByteString)
import qualified Data.ByteString.Unsafe as BSU
import System.Posix.Types (Fd)
import Magic.Types
import Magic.Utils
magicFile :: Magic -> FilePath -> IO String
magicFile :: Magic -> FilePath -> IO FilePath
magicFile Magic
magic FilePath
fp =
Magic -> (Ptr CMagic -> IO FilePath) -> IO FilePath
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
magic (\Ptr CMagic
cmagic ->
FilePath -> (CString -> IO FilePath) -> IO FilePath
forall a. FilePath -> (CString -> IO a) -> IO a
withCString FilePath
fp (\CString
cfp ->
do res <- FilePath -> Magic -> IO CString -> IO CString
forall a. FilePath -> Magic -> IO (Ptr a) -> IO (Ptr a)
throwErrorIfNull FilePath
"magicFile" Magic
magic (Ptr CMagic -> CString -> IO CString
magic_file Ptr CMagic
cmagic CString
cfp)
peekCString res
)
)
magicStdin :: Magic -> IO String
magicStdin :: Magic -> IO FilePath
magicStdin Magic
magic =
Magic -> (Ptr CMagic -> IO FilePath) -> IO FilePath
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
magic (\Ptr CMagic
cmagic ->
do res <- FilePath -> Magic -> IO CString -> IO CString
forall a. FilePath -> Magic -> IO (Ptr a) -> IO (Ptr a)
throwErrorIfNull FilePath
"magicStdin" Magic
magic (Ptr CMagic -> CString -> IO CString
magic_file Ptr CMagic
cmagic CString
forall a. Ptr a
nullPtr)
peekCString res
)
magicString :: Magic -> String -> IO String
magicString :: Magic -> FilePath -> IO FilePath
magicString Magic
m FilePath
s = FilePath -> (CStringLen -> IO FilePath) -> IO FilePath
forall a. FilePath -> (CStringLen -> IO a) -> IO a
withCStringLen FilePath
s (Magic -> CStringLen -> IO FilePath
magicCString Magic
m)
magicCString :: Magic -> CStringLen -> IO String
magicCString :: Magic -> CStringLen -> IO FilePath
magicCString Magic
magic (CString
cstr, Int
len) =
Magic -> (Ptr CMagic -> IO FilePath) -> IO FilePath
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
magic (\Ptr CMagic
cmagic ->
do res <- FilePath -> Magic -> IO CString -> IO CString
forall a. FilePath -> Magic -> IO (Ptr a) -> IO (Ptr a)
throwErrorIfNull FilePath
"magicCString" Magic
magic (Ptr CMagic -> CString -> Word64 -> IO CString
magic_buffer Ptr CMagic
cmagic CString
cstr (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len))
peekCString res
)
magicSetFlags :: Magic -> [MagicFlag] -> IO ()
magicSetFlags :: Magic -> [MagicFlag] -> IO ()
magicSetFlags Magic
m [MagicFlag]
mfl = Magic -> (Ptr CMagic -> IO ()) -> IO ()
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
m (\Ptr CMagic
cmagic ->
FilePath -> Magic -> IO CInt -> IO ()
checkIntError FilePath
"magicSetFlags" Magic
m (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr CMagic -> CInt -> IO CInt
magic_setflags Ptr CMagic
cmagic CInt
flags)
where flags :: CInt
flags = [MagicFlag] -> CInt
flaglist2int [MagicFlag]
mfl
magicCompile :: Magic
-> Maybe String
-> IO ()
magicCompile :: Magic -> Maybe FilePath -> IO ()
magicCompile Magic
m Maybe FilePath
mstr = Magic -> (Ptr CMagic -> IO ()) -> IO ()
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
m (\Ptr CMagic
cm ->
case Maybe FilePath
mstr of
Maybe FilePath
Nothing -> Ptr CMagic -> CString -> IO ()
worker Ptr CMagic
cm CString
forall a. Ptr a
nullPtr
Just FilePath
x -> FilePath -> (CString -> IO ()) -> IO ()
forall a. FilePath -> (CString -> IO a) -> IO a
withCString FilePath
x (Ptr CMagic -> CString -> IO ()
worker Ptr CMagic
cm)
)
where worker :: Ptr CMagic -> CString -> IO ()
worker Ptr CMagic
cm CString
cs = FilePath -> Magic -> IO CInt -> IO ()
checkIntError FilePath
"magicCompile" Magic
m (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$ Ptr CMagic -> CString -> IO CInt
magic_compile Ptr CMagic
cm CString
cs
magicDescriptor :: Magic -> Fd -> IO String
magicDescriptor :: Magic -> Fd -> IO FilePath
magicDescriptor Magic
magic Fd
fd =
Magic -> (Ptr CMagic -> IO FilePath) -> IO FilePath
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
magic (\Ptr CMagic
cmagic ->
do res <- FilePath -> Magic -> IO CString -> IO CString
forall a. FilePath -> Magic -> IO (Ptr a) -> IO (Ptr a)
throwErrorIfNull FilePath
"magicDescriptor" Magic
magic
(Ptr CMagic -> CInt -> IO CString
magic_descriptor Ptr CMagic
cmagic (Fd -> CInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Fd
fd))
peekCString res)
magicByteString :: Magic -> ByteString -> IO String
magicByteString :: Magic -> ByteString -> IO FilePath
magicByteString Magic
magic ByteString
bs =
Magic -> (Ptr CMagic -> IO FilePath) -> IO FilePath
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
magic (\Ptr CMagic
cmagic ->
ByteString -> (CStringLen -> IO FilePath) -> IO FilePath
forall a. ByteString -> (CStringLen -> IO a) -> IO a
BSU.unsafeUseAsCStringLen ByteString
bs (\(CString
cstr, Int
len) ->
do res <- FilePath -> Magic -> IO CString -> IO CString
forall a. FilePath -> Magic -> IO (Ptr a) -> IO (Ptr a)
throwErrorIfNull FilePath
"magicByteString" Magic
magic
(Ptr CMagic -> CString -> Word64 -> IO CString
magic_buffer Ptr CMagic
cmagic CString
cstr (Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
len))
peekCString res))
magicGetFlags :: Magic -> IO [MagicFlag]
magicGetFlags :: Magic -> IO [MagicFlag]
magicGetFlags Magic
m =
Magic -> (Ptr CMagic -> IO [MagicFlag]) -> IO [MagicFlag]
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
m (\Ptr CMagic
cmagic ->
do fl <- Ptr CMagic -> IO CInt
magic_getflags Ptr CMagic
cmagic
if fl < 0
then ioError (userError
"magicGetFlags: magic_getflags is unsupported by this libmagic")
else return (int2flaglist fl))
magicGetParam :: Magic -> MagicParam -> IO Int
magicGetParam :: Magic -> MagicParam -> IO Int
magicGetParam Magic
m MagicParam
p =
Magic -> (Ptr CMagic -> IO Int) -> IO Int
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
m (\Ptr CMagic
cmagic ->
(Ptr CSize -> IO Int) -> IO Int
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca (\Ptr CSize
ptr ->
do FilePath -> Magic -> IO CInt -> IO ()
checkIntError FilePath
"magicGetParam" Magic
m
(Ptr CMagic -> CInt -> Ptr () -> IO CInt
magic_getparam Ptr CMagic
cmagic (MagicParam -> CInt
paramToCInt MagicParam
p) (Ptr CSize -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr CSize
ptr))
v <- Ptr CSize -> IO CSize
forall a. Storable a => Ptr a -> IO a
peek Ptr CSize
ptr
return (fromIntegral (v :: CSize))))
magicSetParam :: Magic -> MagicParam -> Int -> IO ()
magicSetParam :: Magic -> MagicParam -> Int -> IO ()
magicSetParam Magic
m MagicParam
p Int
val =
Magic -> (Ptr CMagic -> IO ()) -> IO ()
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
m (\Ptr CMagic
cmagic ->
CSize -> (Ptr CSize -> IO ()) -> IO ()
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
val :: CSize) (\Ptr CSize
ptr ->
FilePath -> Magic -> IO CInt -> IO ()
checkIntError FilePath
"magicSetParam" Magic
m
(Ptr CMagic -> CInt -> Ptr () -> IO CInt
magic_setparam Ptr CMagic
cmagic (MagicParam -> CInt
paramToCInt MagicParam
p) (Ptr CSize -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr Ptr CSize
ptr))))
paramToCInt :: MagicParam -> CInt
paramToCInt :: MagicParam -> CInt
paramToCInt MagicParam
p = case MagicParam
p of
MagicParam
MagicParamIndirMax -> CInt
0
{-# LINE 186 "src/Magic/Operations.hsc" #-}
MagicParamNameMax -> 1
{-# LINE 187 "src/Magic/Operations.hsc" #-}
MagicParamElfPhnumMax -> 2
{-# LINE 188 "src/Magic/Operations.hsc" #-}
MagicParamElfShnumMax -> 3
{-# LINE 189 "src/Magic/Operations.hsc" #-}
MagicParamElfNotesMax -> 4
{-# LINE 190 "src/Magic/Operations.hsc" #-}
MagicParamRegexMax -> 5
{-# LINE 191 "src/Magic/Operations.hsc" #-}
MagicParamBytesMax -> 6
{-# LINE 192 "src/Magic/Operations.hsc" #-}
MagicParamEncodingMax -> 7
{-# LINE 193 "src/Magic/Operations.hsc" #-}
MagicParamElfShsizeMax -> 8
{-# LINE 194 "src/Magic/Operations.hsc" #-}
magicCheck :: Magic -> Maybe FilePath -> IO Bool
magicCheck :: Magic -> Maybe FilePath -> IO Bool
magicCheck Magic
m Maybe FilePath
mpath =
Magic -> (Ptr CMagic -> IO Bool) -> IO Bool
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
m (\Ptr CMagic
cmagic ->
case Maybe FilePath
mpath of
Maybe FilePath
Nothing -> (CInt -> Bool) -> IO CInt -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
0) (Ptr CMagic -> CString -> IO CInt
magic_check Ptr CMagic
cmagic CString
forall a. Ptr a
nullPtr)
Just FilePath
p -> FilePath -> (CString -> IO Bool) -> IO Bool
forall a. FilePath -> (CString -> IO a) -> IO a
withCString FilePath
p ((CInt -> Bool) -> IO CInt -> IO Bool
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
0) (IO CInt -> IO Bool) -> (CString -> IO CInt) -> CString -> IO Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr CMagic -> CString -> IO CInt
magic_check Ptr CMagic
cmagic))
magicGetPath :: IO FilePath
magicGetPath :: IO FilePath
magicGetPath =
do res <- CString -> CInt -> IO CString
magic_getpath CString
forall a. Ptr a
nullPtr CInt
0
if res == nullPtr then return "" else peekCString res
magicVersion :: IO Int
magicVersion :: IO Int
magicVersion = (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 b. (Integral a, Num b) => a -> b
fromIntegral IO CInt
magic_version
magicErrno :: Magic -> IO Int
magicErrno :: Magic -> IO Int
magicErrno Magic
m = Magic -> (Ptr CMagic -> IO Int) -> IO Int
forall a. Magic -> (Ptr CMagic -> IO a) -> IO a
withMagicPtr Magic
m ((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 b. (Integral a, Num b) => a -> b
fromIntegral (IO CInt -> IO Int)
-> (Ptr CMagic -> IO CInt) -> Ptr CMagic -> IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr CMagic -> IO CInt
magic_errno)
foreign import ccall safe "magic.h magic_file"
magic_file :: Ptr CMagic -> CString -> IO CString
foreign import ccall unsafe "magic.h magic_buffer"
magic_buffer :: Ptr CMagic -> CString -> Word64 -> IO CString
{-# LINE 241 "src/Magic/Operations.hsc" #-}
foreign import ccall unsafe "magic.h magic_setflags"
magic_setflags :: Ptr CMagic -> CInt -> IO CInt
foreign import ccall safe "magic.h magic_compile"
magic_compile :: Ptr CMagic -> CString -> IO CInt
foreign import ccall safe "magic.h magic_descriptor"
magic_descriptor :: Ptr CMagic -> CInt -> IO CString
foreign import ccall safe "magic.h magic_check"
magic_check :: Ptr CMagic -> CString -> IO CInt
foreign import ccall unsafe "magic.h magic_getflags"
magic_getflags :: Ptr CMagic -> IO CInt
foreign import ccall unsafe "magic.h magic_getparam"
magic_getparam :: Ptr CMagic -> CInt -> Ptr () -> IO CInt
foreign import ccall unsafe "magic.h magic_setparam"
magic_setparam :: Ptr CMagic -> CInt -> Ptr () -> IO CInt
foreign import ccall unsafe "magic.h magic_getpath"
magic_getpath :: CString -> CInt -> IO CString
foreign import ccall unsafe "magic.h magic_version"
magic_version :: IO CInt
foreign import ccall unsafe "magic.h magic_errno"
magic_errno :: Ptr CMagic -> IO CInt