{-# LINE 1 "Network/Socket/Msg/MsgHdr.hsc" #-}
{-# LANGUAGE CPP #-}
{-# LINE 2 "Network/Socket/Msg/MsgHdr.hsc" #-}

-- | Support module for the POSIX 'sendmsg,recvmsg' system calls.
-- This file was copied from network-bytestring package.
-- Original source: https://github.com/tibbe/network-bytestring/blob/master/Network/Socket/ByteString/MsgHdr.hsc

module Network.Socket.Msg.MsgHdr
  ( MsgHdr(..)
  ) where


{-# LINE 12 "Network/Socket/Msg/MsgHdr.hsc" #-}

{-# LINE 13 "Network/Socket/Msg/MsgHdr.hsc" #-}

import Foreign.C.Types (CInt, CSize)
import Foreign.Ptr (Ptr)
import Foreign.Storable (Storable(..))
import Network.Socket (SockAddr)

import Network.Socket.Msg.IOVec (IOVec)

data MsgHdr = MsgHdr
    { msgName       :: !(Ptr SockAddr)
    , msgNameLen    :: !CSize
    , msgIov        :: !(Ptr IOVec)
    , msgIovLen     :: !CSize
    , msgControl    :: !(Ptr ())
    , msgControlLen :: !CSize
    , msgFlags      :: !CInt
    } deriving (Show)

instance Storable MsgHdr where
  sizeOf _ = (56)
{-# LINE 33 "Network/Socket/Msg/MsgHdr.hsc" #-}
  alignment _ = alignment (undefined :: CInt)

  peek p = do
    name <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p
{-# LINE 37 "Network/Socket/Msg/MsgHdr.hsc" #-}
    nameLen <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p
{-# LINE 38 "Network/Socket/Msg/MsgHdr.hsc" #-}
    iov <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) p
{-# LINE 39 "Network/Socket/Msg/MsgHdr.hsc" #-}
    iovLen <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) p
{-# LINE 40 "Network/Socket/Msg/MsgHdr.hsc" #-}
    control <- ((\hsc_ptr -> peekByteOff hsc_ptr 32)) p
{-# LINE 41 "Network/Socket/Msg/MsgHdr.hsc" #-}
    controlLen <- ((\hsc_ptr -> peekByteOff hsc_ptr 40)) p
{-# LINE 42 "Network/Socket/Msg/MsgHdr.hsc" #-}
    flags <- ((\hsc_ptr -> peekByteOff hsc_ptr 48)) p
{-# LINE 43 "Network/Socket/Msg/MsgHdr.hsc" #-}
    return $! MsgHdr name nameLen iov iovLen control controlLen flags

  poke p mh = do
    ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p (msgName mh)
{-# LINE 47 "Network/Socket/Msg/MsgHdr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p (msgNameLen mh)
{-# LINE 48 "Network/Socket/Msg/MsgHdr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) p (msgIov mh)
{-# LINE 49 "Network/Socket/Msg/MsgHdr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) p (msgIovLen mh)
{-# LINE 50 "Network/Socket/Msg/MsgHdr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 32)) p (msgControl mh)
{-# LINE 51 "Network/Socket/Msg/MsgHdr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 40)) p (msgControlLen mh)
{-# LINE 52 "Network/Socket/Msg/MsgHdr.hsc" #-}
    ((\hsc_ptr -> pokeByteOff hsc_ptr 48)) p (msgFlags mh)
{-# LINE 53 "Network/Socket/Msg/MsgHdr.hsc" #-}