{-# LANGUAGE ForeignFunctionInterface #-}
module System.UDev.Enumerate
( Enumerate
, newEnumerate
, Subsystem
, addMatchSubsystem
, addNoMatchSubsystem
, SysAttr
, SysValue
, addMatchSysattr
, addNoMatchSysattr
, addMatchProperty
, addMatchTag
, addMatchParent
, addMatchIsInitialized
, addMatchSysname
, addSyspath
, scanDevices
, scanSubsystems
, getListEntry
) where
import Data.ByteString as BS
import Foreign
import Foreign.C.Error
import Foreign.C.String
import Foreign.C.Types
import System.Posix.FilePath
import System.UDev.Context
import System.UDev.Device
import System.UDev.List
import System.UDev.Types
foreign import ccall unsafe "udev_enumerate_new"
c_new :: UDev -> IO Enumerate
newEnumerate :: UDev -> IO Enumerate
newEnumerate :: UDev -> IO Enumerate
newEnumerate = UDev -> IO Enumerate
c_new
{-# INLINE newEnumerate #-}
foreign import ccall unsafe "udev_enumerate_add_match_subsystem"
c_addMatchSubsystem :: Enumerate -> CString -> IO CInt
type Subsystem = ByteString
addMatchSubsystem :: Enumerate
-> Subsystem
-> IO ()
addMatchSubsystem :: Enumerate -> Subsystem -> IO ()
addMatchSubsystem Enumerate
enumerate Subsystem
subsystem =
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"addMatchSubsystem" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
subsystem ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$
Enumerate -> CString -> IO CInt
c_addMatchSubsystem Enumerate
enumerate
foreign import ccall unsafe "udev_enumerate_add_nomatch_subsystem"
c_addNoMatchSubsystem :: Enumerate -> CString -> IO CInt
addNoMatchSubsystem :: Enumerate
-> Subsystem
-> IO ()
addNoMatchSubsystem :: Enumerate -> Subsystem -> IO ()
addNoMatchSubsystem Enumerate
enumerate Subsystem
subsystem =
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"addNoMatchSubsystem" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
subsystem ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$
Enumerate -> CString -> IO CInt
c_addNoMatchSubsystem Enumerate
enumerate
type SysAttr = ByteString
type SysValue = ByteString
foreign import ccall unsafe "udev_enumerate_add_match_sysattr"
c_addMatchSysattr :: Enumerate -> CString -> CString -> IO CInt
addMatchSysattr :: Enumerate
-> SysAttr
-> Maybe SysValue
-> IO ()
addMatchSysattr :: Enumerate -> Subsystem -> Maybe Subsystem -> IO ()
addMatchSysattr Enumerate
enumerate Subsystem
sysattr Maybe Subsystem
mvalue =
(CInt -> Bool) -> String -> IO CInt -> IO ()
forall a. (a -> Bool) -> String -> IO a -> IO ()
throwErrnoIf_ (CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0) String
"addMatchSysattr" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
sysattr ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_sysattr ->
case Maybe Subsystem
mvalue of
Maybe Subsystem
Nothing -> Enumerate -> CString -> CString -> IO CInt
c_addMatchSysattr Enumerate
enumerate CString
c_sysattr CString
forall a. Ptr a
nullPtr
Just Subsystem
value ->
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
value ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_value ->
Enumerate -> CString -> CString -> IO CInt
c_addMatchSysattr Enumerate
enumerate CString
c_sysattr CString
c_value
foreign import ccall unsafe "udev_enumerate_add_nomatch_sysattr"
c_addNoMatchSysattr :: Enumerate -> CString -> CString -> IO CInt
addNoMatchSysattr :: Enumerate
-> ByteString
-> Maybe ByteString
-> IO ()
addNoMatchSysattr :: Enumerate -> Subsystem -> Maybe Subsystem -> IO ()
addNoMatchSysattr Enumerate
enumerate Subsystem
sysattr Maybe Subsystem
mvalue =
(CInt -> Bool) -> String -> IO CInt -> IO ()
forall a. (a -> Bool) -> String -> IO a -> IO ()
throwErrnoIf_ (CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0) String
"addNoMatchSysattr" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
sysattr ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_sysattr ->
case Maybe Subsystem
mvalue of
Maybe Subsystem
Nothing -> Enumerate -> CString -> CString -> IO CInt
c_addNoMatchSysattr Enumerate
enumerate CString
c_sysattr CString
forall a. Ptr a
nullPtr
Just Subsystem
value ->
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
value ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_value ->
Enumerate -> CString -> CString -> IO CInt
c_addNoMatchSysattr Enumerate
enumerate CString
c_sysattr CString
c_value
foreign import ccall unsafe "udev_enumerate_add_match_property"
c_addMatchProperty :: Enumerate -> CString -> CString -> IO CInt
addMatchProperty :: Enumerate
-> ByteString
-> ByteString
-> IO ()
addMatchProperty :: Enumerate -> Subsystem -> Subsystem -> IO ()
addMatchProperty Enumerate
enumerate Subsystem
prop Subsystem
value =
(CInt -> Bool) -> String -> IO CInt -> IO ()
forall a. (a -> Bool) -> String -> IO a -> IO ()
throwErrnoIf_ (CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0) String
"addMatchProperty" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
prop ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_prop ->
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
value ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_value ->
Enumerate -> CString -> CString -> IO CInt
c_addMatchProperty Enumerate
enumerate CString
c_prop CString
c_value
foreign import ccall unsafe "udev_enumerate_add_match_tag"
c_addMatchTag :: Enumerate -> CString -> IO CInt
addMatchTag :: Enumerate
-> ByteString
-> IO ()
addMatchTag :: Enumerate -> Subsystem -> IO ()
addMatchTag Enumerate
enumerate Subsystem
tag =
(CInt -> Bool) -> String -> IO CInt -> IO ()
forall a. (a -> Bool) -> String -> IO a -> IO ()
throwErrnoIf_ (CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0) String
"addMatchTag" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
tag ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_tag ->
Enumerate -> CString -> IO CInt
c_addMatchTag Enumerate
enumerate CString
c_tag
foreign import ccall unsafe "udev_enumerate_add_match_parent"
c_addMatchParent :: Enumerate -> Device -> IO CInt
addMatchParent :: Enumerate
-> Device
-> IO ()
addMatchParent :: Enumerate -> Device -> IO ()
addMatchParent Enumerate
enumerate Device
dev =
(CInt -> Bool) -> String -> IO CInt -> IO ()
forall a. (a -> Bool) -> String -> IO a -> IO ()
throwErrnoIf_ (CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0) String
"addMatchParent" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Enumerate -> Device -> IO CInt
c_addMatchParent Enumerate
enumerate Device
dev
foreign import ccall unsafe "udev_enumerate_add_match_is_initialized"
c_addMatchIsInitialized :: Enumerate -> IO CInt
addMatchIsInitialized :: Enumerate -> IO ()
addMatchIsInitialized :: Enumerate -> IO ()
addMatchIsInitialized Enumerate
enumerate =
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"addMatchIsInitialized" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Enumerate -> IO CInt
c_addMatchIsInitialized Enumerate
enumerate
foreign import ccall unsafe "udev_enumerate_add_match_sysname"
c_addMatchSysname :: Enumerate -> CString -> IO CInt
addMatchSysname :: Enumerate
-> ByteString
-> IO ()
addMatchSysname :: Enumerate -> Subsystem -> IO ()
addMatchSysname Enumerate
enumerate Subsystem
sysName =
String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"addMatchSysname" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
sysName ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$
Enumerate -> CString -> IO CInt
c_addMatchSysname Enumerate
enumerate
foreign import ccall unsafe "udev_enumerate_add_syspath"
c_addSyspath :: Enumerate -> CString -> IO CInt
addSyspath :: Enumerate
-> RawFilePath
-> IO ()
addSyspath :: Enumerate -> Subsystem -> IO ()
addSyspath Enumerate
enumerate Subsystem
syspath =
(CInt -> Bool) -> String -> IO CInt -> IO ()
forall a. (a -> Bool) -> String -> IO a -> IO ()
throwErrnoIf_ (CInt -> CInt -> Bool
forall a. Ord a => a -> a -> Bool
< CInt
0) String
"addSyspath" (IO CInt -> IO ()) -> IO CInt -> IO ()
forall a b. (a -> b) -> a -> b
$
Subsystem -> (CString -> IO CInt) -> IO CInt
forall a. Subsystem -> (CString -> IO a) -> IO a
useAsCString Subsystem
syspath ((CString -> IO CInt) -> IO CInt)
-> (CString -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ \ CString
c_syspath ->
Enumerate -> CString -> IO CInt
c_addSyspath Enumerate
enumerate CString
c_syspath
foreign import ccall unsafe "udev_enumerate_scan_devices"
c_scanDevices :: Enumerate -> IO CInt
scanDevices :: Enumerate -> IO ()
scanDevices :: Enumerate -> IO ()
scanDevices = String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"scanDevices" (IO CInt -> IO ()) -> (Enumerate -> IO CInt) -> Enumerate -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Enumerate -> IO CInt
c_scanDevices
foreign import ccall unsafe "udev_enumerate_scan_subsystems"
c_scanSubsystems :: Enumerate -> IO CInt
scanSubsystems :: Enumerate -> IO ()
scanSubsystems :: Enumerate -> IO ()
scanSubsystems = String -> IO CInt -> IO ()
forall a. (Eq a, Num a) => String -> IO a -> IO ()
throwErrnoIfMinus1_ String
"scanSubsystems" (IO CInt -> IO ()) -> (Enumerate -> IO CInt) -> Enumerate -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Enumerate -> IO CInt
c_scanSubsystems
foreign import ccall unsafe "udev_enumerate_get_list_entry"
c_getListEntry :: Enumerate -> IO List
getListEntry :: Enumerate -> IO (Maybe List)
getListEntry :: Enumerate -> IO (Maybe List)
getListEntry Enumerate
enumerate = do
List
xs <- Enumerate -> IO List
c_getListEntry Enumerate
enumerate
Maybe List -> IO (Maybe List)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe List -> IO (Maybe List)) -> Maybe List -> IO (Maybe List)
forall a b. (a -> b) -> a -> b
$ if List
xs List -> List -> Bool
forall a. Eq a => a -> a -> Bool
== List
nil then Maybe List
forall a. Maybe a
Nothing else List -> Maybe List
forall a. a -> Maybe a
Just List
xs
{-# INLINE getListEntry #-}