{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
module System.Linux.Netlink.GeNetlink
where
import Data.List (intersperse)
import Data.Serialize.Get
import Data.Serialize.Put
import Data.Word (Word8)
import System.Linux.Netlink hiding (makeSocket)
data =
{
GenlHeader -> Word8
genlCmd :: Word8
, GenlHeader -> Word8
genlVersion :: Word8
} deriving (GenlHeader -> GenlHeader -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GenlHeader -> GenlHeader -> Bool
$c/= :: GenlHeader -> GenlHeader -> Bool
== :: GenlHeader -> GenlHeader -> Bool
$c== :: GenlHeader -> GenlHeader -> Bool
Eq)
instance Convertable GenlHeader where
getPut :: GenlHeader -> Put
getPut = GenlHeader -> Put
putGeHeader
getGet :: MessageType -> Get GenlHeader
getGet MessageType
_ = Get GenlHeader
getGenlHeader
data GenlData a = GenlData
{
:: GenlHeader
, forall a. GenlData a -> a
genlDataData :: a
} deriving (GenlData a -> GenlData a -> Bool
forall a. Eq a => GenlData a -> GenlData a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GenlData a -> GenlData a -> Bool
$c/= :: forall a. Eq a => GenlData a -> GenlData a -> Bool
== :: GenlData a -> GenlData a -> Bool
$c== :: forall a. Eq a => GenlData a -> GenlData a -> Bool
Eq)
instance Convertable a => Convertable (GenlData a) where
getPut :: GenlData a -> Put
getPut (GenlData GenlHeader
h a
a) = GenlHeader -> Put
putGeHeader GenlHeader
h forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall a. Convertable a => a -> Put
getPut a
a
getGet :: MessageType -> Get (GenlData a)
getGet MessageType
t = do
GenlHeader
hdr <- Get GenlHeader
getGenlHeader
a
dat <- forall a. Convertable a => MessageType -> Get a
getGet MessageType
t
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$forall a. GenlHeader -> a -> GenlData a
GenlData GenlHeader
hdr a
dat
type GenlPacket a = Packet (GenlData a)
instance Show GenlHeader where
show :: GenlHeader -> String
show (GenlHeader Word8
cmd Word8
ver) =
String
"Header: Cmd = " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Word8
cmd forall a. [a] -> [a] -> [a]
++ String
", Version: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Word8
ver forall a. [a] -> [a] -> [a]
++ String
"\n"
instance {-# OVERLAPPABLE #-} Show a => Show (GenlData a) where
show :: GenlData a -> String
show (GenlData GenlHeader
hdr a
content) =
forall a. Show a => a -> String
show GenlHeader
hdr forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show a
content
instance Show (GenlData NoData) where
show :: GenlData NoData -> String
show (GenlData GenlHeader
hdr NoData
_) =
forall a. Show a => a -> String
show GenlHeader
hdr
instance {-# OVERLAPPABLE #-} Show a => Show (GenlPacket a) where
showList :: [GenlPacket a] -> ShowS
showList [GenlPacket a]
xs = ((forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. a -> [a] -> [a]
intersperse String
"===\n" forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> String
show forall a b. (a -> b) -> a -> b
$[GenlPacket a]
xs) forall a. [a] -> [a] -> [a]
++)
show :: GenlPacket a -> String
show (Packet Header
_ GenlData a
cus Attributes
attrs) =
String
"GenlPacket: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show GenlData a
cus forall a. [a] -> [a] -> [a]
++ String
"\n" forall a. [a] -> [a] -> [a]
++
String
"Attrs: \n" forall a. [a] -> [a] -> [a]
++ Attributes -> String
showNLAttrs Attributes
attrs
show GenlPacket a
p = forall a. Show a => Packet a -> String
showPacket GenlPacket a
p
getGenlHeader :: Get GenlHeader
= do
Word8
cmd <- Get Word8
getWord8
Word8
version <- Get Word8
getWord8
Word16
_ <- Get Word16
getWord16host
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$Word8 -> Word8 -> GenlHeader
GenlHeader Word8
cmd Word8
version
putGeHeader :: GenlHeader -> Put
GenlHeader
gehdr = do
Putter Word8
putWord8 forall a b. (a -> b) -> a -> b
$ GenlHeader -> Word8
genlCmd GenlHeader
gehdr
Putter Word8
putWord8 forall a b. (a -> b) -> a -> b
$ GenlHeader -> Word8
genlVersion GenlHeader
gehdr
Putter Word16
putWord16host Word16
0
makeSocket :: IO NetlinkSocket
makeSocket :: IO NetlinkSocket
makeSocket = Int -> IO NetlinkSocket
makeSocketGeneric Int
16