module System.UDev.Device
( Device
, Devnum
, newFromSysPath
, newFromDevnum
, newFromSubsystemSysname
, newFromDeviceId
, newFromEnvironment
, getParent
, getParentWithSubsystemDevtype
, getDevpath
, getSubsystem
, getDevtype
, getSyspath
, getSysname
, getSysnum
, getDevnode
, isInitialized
, getDevlinksListEntry
, getPropertiesListEntry
, getTagsListEntry
, getPropertyValue
, getDriver
, getDevnum
, getAction
, getSysattrValue
, setSysattrValue
, getSysattrListEntry
, getSeqnum
, getUsecSinceInitialized
, hasTag
) where
import Control.Applicative
import Data.ByteString as BS
import Foreign hiding (unsafePerformIO)
import Foreign.C
import System.IO.Unsafe
import System.UDev.Context
import System.UDev.List
import System.UDev.Types
foreign import ccall unsafe "udev_device_new_from_syspath"
c_newFromSysPath :: UDev -> CString -> IO Device
type SysPath = ByteString
newFromSysPath :: UDev -> SysPath -> IO Device
newFromSysPath udev sysPath = do
Device <$> (throwErrnoIfNull "newFromSysPath" $ do
useAsCString sysPath $ \ c_sysPath -> do
getDevice <$> c_newFromSysPath udev c_sysPath)
type Dev_t = CULong
foreign import ccall unsafe "udev_device_new_from_devnum"
c_newFromDevnum :: UDev -> CChar -> Dev_t -> IO Device
type Devnum = Int
newFromDevnum :: UDev -> Char -> Devnum -> IO Device
newFromDevnum udev char devnum
= c_newFromDevnum udev (toEnum (fromEnum char)) (fromIntegral devnum)
foreign import ccall unsafe "udev_device_new_from_subsystem_sysname"
c_newFromSubsystemSysname :: UDev -> CString -> CString -> IO Device
newFromSubsystemSysname :: UDev -> ByteString -> ByteString -> IO Device
newFromSubsystemSysname udev subsystem sysname = do
useAsCString subsystem $ \ c_subsystem ->
useAsCString sysname $ \ c_sysname ->
c_newFromSubsystemSysname udev c_subsystem c_sysname
foreign import ccall unsafe "udev_device_new_from_device_id"
c_newFromDeviceId :: UDev -> CString -> IO Device
newFromDeviceId :: UDev -> ByteString -> IO Device
newFromDeviceId udev devId = do
useAsCString devId $ \ c_devId ->
c_newFromDeviceId udev c_devId
foreign import ccall unsafe "udev_device_new_from_environment"
c_newFromEnvironment :: UDev -> IO Device
newFromEnvironment :: UDev -> IO Device
newFromEnvironment = c_newFromEnvironment
foreign import ccall unsafe "udev_device_get_parent"
c_getParent :: Device -> IO Device
getParent :: Device -> IO Device
getParent = c_getParent
foreign import ccall unsafe "udev_device_get_parent_with_subsystem_devtype"
c_getParentWithSubsystemDevtype :: Device -> CString -> CString
-> IO Device
getParentWithSubsystemDevtype :: Device -> ByteString -> ByteString
-> IO (Maybe Device)
getParentWithSubsystemDevtype udev subsystem devtype = do
mdev <- useAsCString subsystem $ \ c_subsystem ->
useAsCString devtype $ \ c_devtype ->
c_getParentWithSubsystemDevtype udev c_subsystem c_devtype
return $ if getDevice mdev == nullPtr then Nothing else Just mdev
foreign import ccall unsafe "udev_device_get_devpath"
c_getDevpath :: Device -> IO CString
getDevpath :: Device -> IO ByteString
getDevpath dev = packCString =<< c_getDevpath dev
foreign import ccall unsafe "udev_device_get_subsystem"
c_getSubsystem :: Device -> IO CString
packCStringMaybe :: CString -> IO (Maybe ByteString)
packCStringMaybe cstring =
if cstring == nullPtr
then return Nothing
else Just <$> packCString cstring
getSubsystem :: Device -> Maybe ByteString
getSubsystem dev = unsafePerformIO $ packCStringMaybe =<< c_getSubsystem dev
foreign import ccall unsafe "udev_device_get_devtype"
c_getDevtype :: Device -> IO CString
getDevtype :: Device -> Maybe ByteString
getDevtype dev = unsafePerformIO $ packCStringMaybe =<< c_getDevtype dev
foreign import ccall unsafe "udev_device_get_syspath"
c_getSyspath :: Device -> IO CString
getSyspath :: Device -> ByteString
getSyspath dev = unsafePerformIO $ packCString =<< c_getSyspath dev
foreign import ccall unsafe "udev_device_get_sysname"
c_getSysname :: Device -> IO CString
getSysname :: Device -> ByteString
getSysname dev = unsafePerformIO $ packCString =<< c_getSysname dev
foreign import ccall unsafe "udev_device_get_sysnum"
c_getSysnum :: Device -> IO CString
getSysnum :: Device -> Maybe ByteString
getSysnum dev = unsafePerformIO $ packCStringMaybe =<< c_getSysnum dev
foreign import ccall unsafe "udev_device_get_devnode"
c_getDevnode :: Device -> IO CString
getDevnode :: Device -> Maybe ByteString
getDevnode udev = unsafePerformIO $ packCStringMaybe =<< c_getDevnode udev
foreign import ccall unsafe "udev_device_get_is_initialized"
c_isInitialized :: Device -> IO CInt
isInitialized :: Device -> IO Bool
isInitialized dev = (< 0) <$> c_isInitialized dev
foreign import ccall unsafe "udev_device_get_devlinks_list_entry"
c_getDevlinksListEntry :: Device -> IO List
getDevlinksListEntry :: Device -> IO List
getDevlinksListEntry = c_getDevlinksListEntry
foreign import ccall unsafe "udev_device_get_properties_list_entry"
c_getPropertiesListEntry :: Device -> IO List
getPropertiesListEntry :: Device -> IO List
getPropertiesListEntry = c_getPropertiesListEntry
foreign import ccall unsafe "udev_device_get_tags_list_entry"
c_getTagsListEntry :: Device -> IO List
getTagsListEntry :: Device -> IO List
getTagsListEntry = c_getTagsListEntry
foreign import ccall unsafe "udev_device_get_property_value"
c_getPropertyValue :: Device -> CString -> IO CString
getPropertyValue :: Device -> ByteString -> IO (Maybe ByteString)
getPropertyValue dev prop = do
res <- useAsCString prop $ \ c_prop ->
c_getPropertyValue dev c_prop
if res == nullPtr then return Nothing else Just <$> packCString res
foreign import ccall unsafe "udev_device_get_driver"
c_getDriver :: Device -> IO CString
getDriver :: Device -> IO ByteString
getDriver dev = packCString =<< c_getDriver dev
foreign import ccall unsafe "udev_device_get_devnum"
c_getDevnum :: Device -> IO Devnum
getDevnum :: Device -> IO Devnum
getDevnum = c_getDevnum
foreign import ccall unsafe "udev_device_get_action"
c_getAction :: Device -> CString
getAction :: Device -> Maybe ByteString
getAction dev
| c_action == nullPtr = Nothing
| otherwise = Just $ unsafePerformIO $ packCString c_action
where
c_action = c_getAction dev
foreign import ccall unsafe "udev_device_get_sysattr_value"
c_getSysattrValue :: Device -> CString -> CString
getSysattrValue :: Device -> ByteString -> ByteString
getSysattrValue dev sysattr = do
unsafePerformIO $ do
packCString =<< useAsCString sysattr (return . c_getSysattrValue dev)
foreign import ccall unsafe "udev_device_set_sysattr_value"
c_setSysattrValue :: Device -> CString -> CString -> IO CInt
setSysattrValue :: Device
-> ByteString
-> ByteString
-> IO ()
setSysattrValue dev sysattr value = do
throwErrnoIf_ (0 <) "setSysattrValue" $ do
useAsCString sysattr $ \ c_sysattr ->
useAsCString value $ \ c_value ->
c_setSysattrValue dev c_sysattr c_value
foreign import ccall unsafe "udev_device_get_sysattr_list_entry"
c_getSysAttrListEntry :: Device -> IO List
getSysattrListEntry :: Device -> IO List
getSysattrListEntry = c_getSysAttrListEntry
toMaybe :: CULLong -> Maybe Int
toMaybe 0 = Nothing
toMaybe n = Just (fromIntegral n)
foreign import ccall unsafe "udev_device_get_seqnum"
c_getSeqnum :: Device -> IO CULLong
getSeqnum :: Device -> IO (Maybe Int)
getSeqnum dev = toMaybe <$> c_getSeqnum dev
foreign import ccall unsafe "udev_device_get_usec_since_initialized"
c_getUsecSinceInitialized :: Device -> IO CULLong
getUsecSinceInitialized :: Device -> IO (Maybe Int)
getUsecSinceInitialized dev = toMaybe <$> c_getUsecSinceInitialized dev
foreign import ccall unsafe "udev_device_has_tag"
c_hasTag :: Device -> CString -> IO CInt
hasTag :: Device -> ByteString -> IO Bool
hasTag dev tag = do
(1 ==) <$> do
useAsCString tag $ \ c_tag ->
c_hasTag dev c_tag