{-# LINE 1 "System/Posix/DynamicLinker/ByteString.hsc" #-}{-# LANGUAGE Safe #-}------------------------------------------------------------------------------- |-- Module : System.Posix.DynamicLinker.ByteString-- Copyright : (c) Volker Stolz <vs@foldr.org> 2003-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : vs@foldr.org-- Stability : provisional-- Portability : non-portable (requires POSIX)---- Dynamic linker support through dlopen()-----------------------------------------------------------------------------moduleSystem.Posix.DynamicLinker.ByteString(moduleSystem.Posix.DynamicLinker.Prim ,dlopen ,dlsym ,dlerror ,dlclose ,withDL ,withDL_ ,undl ,)-- Usage:-- ******---- Let's assume you want to open a local shared library \'foo\' (.\/libfoo.so)-- offering a function-- @char \* mogrify (char\*,int)@-- and invoke @str = mogrify("test",1)@:------ type Fun = CString -> Int -> IO CString-- foreign import dynamic unsafe fun__ :: FunPtr Fun -> Fun---- withDL "libfoo.so" [RTLD_NOW] \$ \\ mod -> do-- funptr <- dlsym mod "mogrify"-- let fun = fun__ funptr-- withCString "test" \$ \\ str -> do-- strptr <- fun str 1-- strstr <- peekCString strptr-- ...--whereimportSystem.Posix.DynamicLinker.Common importSystem.Posix.DynamicLinker.Prim importControl.Exception(bracket)importForeignimportSystem.Posix.ByteString.FilePath dlopen ::RawFilePath ->[RTLDFlags ]->IODL dlopen :: RawFilePath -> [RTLDFlags] -> IO DL
dlopen RawFilePath
path [RTLDFlags]
flags =RawFilePath -> (CString -> IO DL) -> IO DL
forall a. RawFilePath -> (CString -> IO a) -> IO a
withFilePath RawFilePath
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
<$>String -> (Ptr () -> Bool) -> IO (Ptr ()) -> IO (Ptr ())
forall a. String -> (a -> Bool) -> IO a -> IO a
throwDLErrorIf String
"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 ::RawFilePath ->[RTLDFlags ]->(DL ->IOa )->IOa withDL :: forall a. RawFilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
withDL RawFilePath
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(RawFilePath -> [RTLDFlags] -> IO DL
dlopen RawFilePath
file [RTLDFlags]
flags )(DL -> IO ()
dlclose )DL -> IO a
f withDL_ ::RawFilePath ->[RTLDFlags ]->(DL ->IOa )->IO()withDL_ :: forall a. RawFilePath -> [RTLDFlags] -> (DL -> IO a) -> IO ()
withDL_ RawFilePath
file [RTLDFlags]
flags DL -> IO a
f =RawFilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
forall a. RawFilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
withDL RawFilePath
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()

AltStyle によって変換されたページ (->オリジナル) /