{-# 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
(GenlHeader -> GenlHeader -> Bool)
-> (GenlHeader -> GenlHeader -> Bool) -> Eq GenlHeader
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 _ = Get GenlHeader
getGenlHeader
data GenlData a = GenlData
{
:: GenlHeader
, GenlData a -> a
genlDataData :: a
} deriving (GenlData a -> GenlData a -> Bool
(GenlData a -> GenlData a -> Bool)
-> (GenlData a -> GenlData a -> Bool) -> Eq (GenlData a)
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 h :: GenlHeader
h a :: a
a) = GenlHeader -> Put
putGeHeader GenlHeader
h Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> a -> Put
forall a. Convertable a => a -> Put
getPut a
a
getGet :: MessageType -> Get (GenlData a)
getGet t :: MessageType
t = do
GenlHeader
hdr <- Get GenlHeader
getGenlHeader
a
dat <- MessageType -> Get a
forall a. Convertable a => MessageType -> Get a
getGet MessageType
t
GenlData a -> Get (GenlData a)
forall (m :: * -> *) a. Monad m => a -> m a
return (GenlData a -> Get (GenlData a)) -> GenlData a -> Get (GenlData a)
forall a b. (a -> b) -> a -> b
$GenlHeader -> a -> GenlData a
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 cmd :: Word8
cmd ver :: Word8
ver) =
"Header: Cmd = " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word8 -> String
forall a. Show a => a -> String
show Word8
cmd String -> ShowS
forall a. [a] -> [a] -> [a]
++ ", Version: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word8 -> String
forall a. Show a => a -> String
show Word8
ver String -> ShowS
forall a. [a] -> [a] -> [a]
++ "\n"
instance {-# OVERLAPPABLE #-} Show a => Show (GenlData a) where
show :: GenlData a -> String
show (GenlData hdr :: GenlHeader
hdr content :: a
content) =
GenlHeader -> String
forall a. Show a => a -> String
show GenlHeader
hdr String -> ShowS
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
content
instance Show (GenlData NoData) where
show :: GenlData NoData -> String
show (GenlData hdr :: GenlHeader
hdr _) =
GenlHeader -> String
forall a. Show a => a -> String
show GenlHeader
hdr
instance {-# OVERLAPPABLE #-} Show a => Show (GenlPacket a) where
showList :: [GenlPacket a] -> ShowS
showList xs :: [GenlPacket a]
xs = (([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([String] -> String)
-> ([GenlPacket a] -> [String]) -> [GenlPacket a] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse "===\n" ([String] -> [String])
-> ([GenlPacket a] -> [String]) -> [GenlPacket a] -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenlPacket a -> String) -> [GenlPacket a] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map GenlPacket a -> String
forall a. Show a => a -> String
show ([GenlPacket a] -> String) -> [GenlPacket a] -> String
forall a b. (a -> b) -> a -> b
$[GenlPacket a]
xs) String -> ShowS
forall a. [a] -> [a] -> [a]
++)
show :: GenlPacket a -> String
show (Packet _ cus :: GenlData a
cus attrs :: Attributes
attrs) =
"GenlPacket: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ GenlData a -> String
forall a. Show a => a -> String
show GenlData a
cus String -> ShowS
forall a. [a] -> [a] -> [a]
++ "\n" String -> ShowS
forall a. [a] -> [a] -> [a]
++
"Attrs: \n" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Attributes -> String
showNLAttrs Attributes
attrs
show p :: GenlPacket a
p = GenlPacket a -> String
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
GenlHeader -> Get GenlHeader
forall (m :: * -> *) a. Monad m => a -> m a
return (GenlHeader -> Get GenlHeader) -> GenlHeader -> Get GenlHeader
forall a b. (a -> b) -> a -> b
$Word8 -> Word8 -> GenlHeader
GenlHeader Word8
cmd Word8
version
putGeHeader :: GenlHeader -> Put
gehdr :: GenlHeader
gehdr = do
Putter Word8
putWord8 Putter Word8 -> Putter Word8
forall a b. (a -> b) -> a -> b
$ GenlHeader -> Word8
genlCmd GenlHeader
gehdr
Putter Word8
putWord8 Putter Word8 -> Putter Word8
forall a b. (a -> b) -> a -> b
$ GenlHeader -> Word8
genlVersion GenlHeader
gehdr
Putter Word16
putWord16host 0
makeSocket :: IO NetlinkSocket
makeSocket :: IO NetlinkSocket
makeSocket = Int -> IO NetlinkSocket
makeSocketGeneric 16