{-# LINE 1 "System/Posix/DynamicLinker.hsc" #-}
{-# LANGUAGE Safe #-}
module System.Posix.DynamicLinker (
module System.Posix.DynamicLinker.Prim,
dlopen,
dlsym,
dlerror,
dlclose,
withDL, withDL_,
undl,
)
where
import System.Posix.DynamicLinker.Common
import System.Posix.DynamicLinker.Prim
import Control.Exception ( bracket )
import Foreign
import System.Posix.Internals ( withFilePath )
dlopen :: FilePath -> [RTLDFlags] -> IO DL
dlopen :: FilePath -> [RTLDFlags] -> IO DL
dlopen FilePath
path [RTLDFlags]
flags = FilePath -> (CString -> IO DL) -> IO DL
forall a. FilePath -> (CString -> IO a) -> IO a
withFilePath FilePath
path ((CString -> IO DL) -> IO DL) -> (CString -> IO DL) -> IO DL
forall a b. (a -> b) -> a -> b
$ \CString
p -> Ptr () -> DL
DLHandle (Ptr () -> DL) -> IO (Ptr ()) -> IO DL
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
FilePath -> (Ptr () -> Bool) -> IO (Ptr ()) -> IO (Ptr ())
forall a. FilePath -> (a -> Bool) -> IO a -> IO a
throwDLErrorIf FilePath
"dlopen" (Ptr () -> Ptr () -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr ()
forall a. Ptr a
nullPtr) (CString -> CInt -> IO (Ptr ())
c_dlopen CString
p ([RTLDFlags] -> CInt
packRTLDFlags [RTLDFlags]
flags))
withDL :: FilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
withDL :: forall a. FilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
withDL FilePath
file [RTLDFlags]
flags DL -> IO a
f = IO DL -> (DL -> IO ()) -> (DL -> IO a) -> IO a
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket (FilePath -> [RTLDFlags] -> IO DL
dlopen FilePath
file [RTLDFlags]
flags) (DL -> IO ()
dlclose) DL -> IO a
f
withDL_ :: FilePath -> [RTLDFlags] -> (DL -> IO a) -> IO ()
withDL_ :: forall a. FilePath -> [RTLDFlags] -> (DL -> IO a) -> IO ()
withDL_ FilePath
file [RTLDFlags]
flags DL -> IO a
f = FilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
forall a. FilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
withDL FilePath
file [RTLDFlags]
flags DL -> IO a
f IO a -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()