    {-# LANGUAGE CPP, ForeignFunctionInterface #-}

    -- |
    -- Module      : Network.Socket.ByteString.Internal
    -- Copyright   : (c) Johan Tibell 2007-2010
    -- License     : BSD-style
    --
    -- Maintainer  : johan.tibell@gmail.com
    -- Stability   : stable
    -- Portability : portable
    --
    module Network.Socket.ByteString.Internal
        (
          mkInvalidRecvArgError
    #if !defined(mingw32_HOST_OS)
        , c_writev
        , c_sendmsg
    #endif
        ) where

    import System.IO.Error (ioeSetErrorString, mkIOError)

    #if !defined(mingw32_HOST_OS)
    # if __GLASGOW_HASKELL__ >= 703
    import Foreign.C.Types (CInt(..))
    import System.Posix.Types (CSsize(..))
    # else
    import Foreign.C.Types (CInt)
    import System.Posix.Types (CSsize)
    # endif
    import Foreign.Ptr (Ptr)

    import Network.Socket.ByteString.IOVec (IOVec)
    import Network.Socket.ByteString.MsgHdr (MsgHdr)
    #endif

    #if __GLASGOW_HASKELL__ < 611
    import GHC.IOBase (IOErrorType(..))
    #else
    import GHC.IO.Exception (IOErrorType(..))
    #endif

    mkInvalidRecvArgError :: String -> IOError
    mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError
                                        InvalidArgument
                                        loc Nothing Nothing) "non-positive length"

    #if !defined(mingw32_HOST_OS)
    foreign import ccall unsafe "writev"
      c_writev :: CInt -> Ptr IOVec -> CInt -> IO CSsize

    foreign import ccall unsafe "sendmsg"
      c_sendmsg :: CInt -> Ptr MsgHdr -> CInt -> IO CSsize
    #endif