{-# LINE 1 "Network/Socket/Posix/CmsgHdr.hsc" #-}{-# OPTIONS_GHC -funbox-strict-fields #-}moduleNetwork.Socket.Posix.CmsgHdr(Cmsg (..),withCmsgs ,parseCmsgs )whereimportForeign.ForeignPtrimportForeign.Marshal.Alloc(allocaBytes)importForeign.Marshal.Utils(copyBytes)importqualifiedData.ByteStringasBimportData.ByteString.InternalimportNetwork.Socket.Imports importNetwork.Socket.Posix.Cmsg importNetwork.Socket.Posix.MsgHdr importNetwork.Socket.Types dataCmsgHdr =CmsgHdr {{-# LINE 27 "Network/Socket/Posix/CmsgHdr.hsc" #-}cmsgHdrLen::CSize{-# LINE 31 "Network/Socket/Posix/CmsgHdr.hsc" #-},CmsgHdr -> CInt
cmsgHdrLevel ::CInt,CmsgHdr -> CInt
cmsgHdrType ::CInt}deriving(CmsgHdr -> CmsgHdr -> Bool
(CmsgHdr -> CmsgHdr -> Bool)
-> (CmsgHdr -> CmsgHdr -> Bool) -> Eq CmsgHdr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CmsgHdr -> CmsgHdr -> Bool
== :: CmsgHdr -> CmsgHdr -> Bool
$c/= :: CmsgHdr -> CmsgHdr -> Bool
/= :: CmsgHdr -> CmsgHdr -> Bool
Eq,Int -> CmsgHdr -> ShowS
[CmsgHdr] -> ShowS
CmsgHdr -> String
(Int -> CmsgHdr -> ShowS)
-> (CmsgHdr -> String) -> ([CmsgHdr] -> ShowS) -> Show CmsgHdr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CmsgHdr -> ShowS
showsPrec :: Int -> CmsgHdr -> ShowS
$cshow :: CmsgHdr -> String
show :: CmsgHdr -> String
$cshowList :: [CmsgHdr] -> ShowS
showList :: [CmsgHdr] -> ShowS
Show)instanceStorableCmsgHdr wheresizeOf :: CmsgHdr -> Int
sizeOf ~CmsgHdr
_=((Int
16)){-# LINE 37 "Network/Socket/Posix/CmsgHdr.hsc" #-}alignment~_=alignment(0::CInt)peek :: Ptr CmsgHdr -> IO CmsgHdr
peek Ptr CmsgHdr
p =doCSize
len <-((\Ptr CmsgHdr
hsc_ptr ->Ptr CmsgHdr -> Int -> IO CSize
forall b. Ptr b -> Int -> IO CSize
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOffPtr CmsgHdr
hsc_ptr Int
0))Ptr CmsgHdr
p {-# LINE 41 "Network/Socket/Posix/CmsgHdr.hsc" #-}lvl<-((\hsc_ptr->peekByteOffhsc_ptr8))p{-# LINE 42 "Network/Socket/Posix/CmsgHdr.hsc" #-}typ<-((\hsc_ptr->peekByteOffhsc_ptr12))p{-# LINE 43 "Network/Socket/Posix/CmsgHdr.hsc" #-}return$CmsgHdrlenlvltyppoke :: Ptr CmsgHdr -> CmsgHdr -> IO ()
poke Ptr CmsgHdr
p (CmsgHdr CSize
len CInt
lvl CInt
typ )=doPtr CmsgHdr -> CSize -> IO ()
forall a. Ptr a -> CSize -> IO ()
zeroMemory Ptr CmsgHdr
p ((CSize
16)){-# LINE 47 "Network/Socket/Posix/CmsgHdr.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr0))plen{-# LINE 48 "Network/Socket/Posix/CmsgHdr.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr8))plvl{-# LINE 49 "Network/Socket/Posix/CmsgHdr.hsc" #-}((\hsc_ptr->pokeByteOffhsc_ptr12))ptyp{-# LINE 50 "Network/Socket/Posix/CmsgHdr.hsc" #-}withCmsgs ::[Cmsg ]->(PtrCmsgHdr ->Int->IOa )->IOa withCmsgs :: forall a. [Cmsg] -> (Ptr CmsgHdr -> Int -> IO a) -> IO a
withCmsgs [Cmsg]
cmsgs0 Ptr CmsgHdr -> Int -> IO a
action |Int
total Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
0=Ptr CmsgHdr -> Int -> IO a
action Ptr CmsgHdr
forall a. Ptr a
nullPtrInt
0|Bool
otherwise=Int -> (Ptr CmsgHdr -> IO a) -> IO a
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytesInt
total ((Ptr CmsgHdr -> IO a) -> IO a) -> (Ptr CmsgHdr -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$\Ptr CmsgHdr
ctrlPtr ->doPtr CmsgHdr -> [Cmsg] -> [Int] -> IO ()
loop Ptr CmsgHdr
ctrlPtr [Cmsg]
cmsgs0 [Int]
spaces Ptr CmsgHdr -> Int -> IO a
action Ptr CmsgHdr
ctrlPtr Int
total whereloop :: Ptr CmsgHdr -> [Cmsg] -> [Int] -> IO ()
loop Ptr CmsgHdr
ctrlPtr (Cmsg
cmsg :[Cmsg]
cmsgs )(Int
s :[Int]
ss )=doCmsg -> Ptr CmsgHdr -> IO ()
toCmsgHdr Cmsg
cmsg Ptr CmsgHdr
ctrlPtr letnextPtr :: Ptr b
nextPtr =Ptr CmsgHdr
ctrlPtr Ptr CmsgHdr -> Int -> Ptr b
forall a b. Ptr a -> Int -> Ptr b
`plusPtr`Int
s Ptr CmsgHdr -> [Cmsg] -> [Int] -> IO ()
loop Ptr CmsgHdr
forall a. Ptr a
nextPtr [Cmsg]
cmsgs [Int]
ss loop Ptr CmsgHdr
_[Cmsg]
_[Int]
_=() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return()cmsg_space :: Int -> Int
cmsg_space =CSize -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral(CSize -> Int) -> (Int -> CSize) -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CSize -> CSize
c_cmsg_space (CSize -> CSize) -> (Int -> CSize) -> Int -> CSize
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegralspaces :: [Int]
spaces =(Cmsg -> Int) -> [Cmsg] -> [Int]
forall a b. (a -> b) -> [a] -> [b]
map(Int -> Int
cmsg_space (Int -> Int) -> (Cmsg -> Int) -> Cmsg -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
.ByteString -> Int
B.length(ByteString -> Int) -> (Cmsg -> ByteString) -> Cmsg -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cmsg -> ByteString
cmsgData )[Cmsg]
cmsgs0 total :: Int
total =[Int] -> Int
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum[Int]
spaces toCmsgHdr ::Cmsg ->PtrCmsgHdr ->IO()toCmsgHdr :: Cmsg -> Ptr CmsgHdr -> IO ()
toCmsgHdr (Cmsg (CmsgId CInt
lvl CInt
typ )(PSForeignPtr Word8
fptr Int
off Int
len ))Ptr CmsgHdr
ctrlPtr =doPtr CmsgHdr -> CmsgHdr -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
pokePtr CmsgHdr
ctrlPtr (CmsgHdr -> IO ()) -> CmsgHdr -> IO ()
forall a b. (a -> b) -> a -> b
$CSize -> CInt -> CInt -> CmsgHdr
CmsgHdr (CSize -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral(CSize -> CSize) -> CSize -> CSize
forall a b. (a -> b) -> a -> b
$CSize -> CSize
c_cmsg_len (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegralInt
len ))CInt
lvl CInt
typ ForeignPtr Word8 -> (Ptr Word8 -> IO ()) -> IO ()
forall a b. ForeignPtr a -> (Ptr a -> IO b) -> IO b
withForeignPtrForeignPtr Word8
fptr ((Ptr Word8 -> IO ()) -> IO ()) -> (Ptr Word8 -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$\Ptr Word8
src0 ->doletsrc :: Ptr b
src =Ptr Word8
src0 Ptr Word8 -> Int -> Ptr b
forall a b. Ptr a -> Int -> Ptr b
`plusPtr`Int
off Ptr Word8
dst <-Ptr CmsgHdr -> IO (Ptr Word8)
c_cmsg_data Ptr CmsgHdr
ctrlPtr Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytesPtr Word8
dst Ptr Word8
forall a. Ptr a
src Int
len parseCmsgs ::SocketAddress sa =>Ptr(MsgHdr sa )->IO[Cmsg ]parseCmsgs :: forall sa. SocketAddress sa => Ptr (MsgHdr sa) -> IO [Cmsg]
parseCmsgs Ptr (MsgHdr sa)
msgptr =doPtr CmsgHdr
ptr <-Ptr (MsgHdr sa) -> IO (Ptr CmsgHdr)
forall sa. Ptr (MsgHdr sa) -> IO (Ptr CmsgHdr)
c_cmsg_firsthdr Ptr (MsgHdr sa)
msgptr Ptr CmsgHdr -> ([Cmsg] -> [Cmsg]) -> IO [Cmsg]
forall {c}. Ptr CmsgHdr -> ([Cmsg] -> c) -> IO c
loop Ptr CmsgHdr
ptr [Cmsg] -> [Cmsg]
forall a. a -> a
idwhereloop :: Ptr CmsgHdr -> ([Cmsg] -> c) -> IO c
loop Ptr CmsgHdr
ptr [Cmsg] -> c
build |Ptr CmsgHdr
ptr Ptr CmsgHdr -> Ptr CmsgHdr -> Bool
forall a. Eq a => a -> a -> Bool
==Ptr CmsgHdr
forall a. Ptr a
nullPtr=c -> IO c
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return(c -> IO c) -> c -> IO c
forall a b. (a -> b) -> a -> b
$[Cmsg] -> c
build []|Bool
otherwise=doCmsg
cmsg <-Ptr CmsgHdr -> IO Cmsg
fromCmsgHdr Ptr CmsgHdr
ptr Ptr CmsgHdr
nextPtr <-Ptr (MsgHdr sa) -> Ptr CmsgHdr -> IO (Ptr CmsgHdr)
forall sa. Ptr (MsgHdr sa) -> Ptr CmsgHdr -> IO (Ptr CmsgHdr)
c_cmsg_nxthdr Ptr (MsgHdr sa)
msgptr Ptr CmsgHdr
ptr Ptr CmsgHdr -> ([Cmsg] -> c) -> IO c
loop Ptr CmsgHdr
nextPtr ([Cmsg] -> c
build ([Cmsg] -> c) -> ([Cmsg] -> [Cmsg]) -> [Cmsg] -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Cmsg
cmsg Cmsg -> [Cmsg] -> [Cmsg]
forall a. a -> [a] -> [a]
:))fromCmsgHdr ::PtrCmsgHdr ->IOCmsg fromCmsgHdr :: Ptr CmsgHdr -> IO Cmsg
fromCmsgHdr Ptr CmsgHdr
ptr =doCmsgHdr CSize
len CInt
lvl CInt
typ <-Ptr CmsgHdr -> IO CmsgHdr
forall a. Storable a => Ptr a -> IO a
peekPtr CmsgHdr
ptr Ptr Word8
src <-Ptr CmsgHdr -> IO (Ptr Word8)
c_cmsg_data Ptr CmsgHdr
ptr letsiz :: Int
siz =CSize -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegralCSize
len Int -> Int -> Int
forall a. Num a => a -> a -> a
-(Ptr Word8
src Ptr Word8 -> Ptr CmsgHdr -> Int
forall a b. Ptr a -> Ptr b -> Int
`minusPtr`Ptr CmsgHdr
ptr )CmsgId -> ByteString -> Cmsg
Cmsg (CInt -> CInt -> CmsgId
CmsgId CInt
lvl CInt
typ )(ByteString -> Cmsg) -> IO ByteString -> IO Cmsg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Int -> (Ptr Word8 -> IO ()) -> IO ByteString
create(Int -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegralInt
siz )(\Ptr Word8
dst ->Ptr Word8 -> Ptr Word8 -> Int -> IO ()
forall a. Ptr a -> Ptr a -> Int -> IO ()
copyBytesPtr Word8
dst Ptr Word8
src Int
siz )foreignimportccallunsafe"cmsg_firsthdr"c_cmsg_firsthdr ::Ptr(MsgHdr sa )->IO(PtrCmsgHdr )foreignimportccallunsafe"cmsg_nxthdr"c_cmsg_nxthdr ::Ptr(MsgHdr sa )->PtrCmsgHdr ->IO(PtrCmsgHdr )foreignimportccallunsafe"cmsg_data"c_cmsg_data ::PtrCmsgHdr ->IO(PtrWord8)foreignimportccallunsafe"cmsg_space"c_cmsg_space ::CSize->CSizeforeignimportccallunsafe"cmsg_len"c_cmsg_len ::CSize->CSize

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