{-# INCLUDE <sys/sendfile.h> #-}
{-# LINE 1 "src/Network/Socket/SendFile/Linux.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "src/Network/Socket/SendFile/Linux.hsc" #-}
-- | Linux system-dependent code for 'sendfile'.
module Network.Socket.SendFile.Linux (_sendFile) where
import Data.Int
import Data.Word
import Foreign.C.Error (throwErrno)
import GHC.IOBase (FD, haFD)
import GHC.Handle (withHandle_)
import System.IO (Handle, hFlush)


{-# LINE 12 "src/Network/Socket/SendFile/Linux.hsc" #-}

_sendFile :: Handle -> Handle -> Integer -> IO ()
_sendFile outp inp count = do
    -- flush outp before sending
    hFlush outp
    withHandle_ "Network.Socket.SendFile.Linux.sendFile'" outp $ \outp' -> do
    withHandle_ "Network.Socket.SendFile.Linux.sendFile'" inp $ \inp' -> do 
    let out_fd = haFD outp'
    let in_fd = haFD inp'
    res <- c_sendfile_linux out_fd in_fd (fromIntegral count)
    if res == -1
        then throwErrno "Network.Socket.SendFile.Linux.sendFile'"
        else return ()

foreign import ccall unsafe
    c_sendfile_linux :: FD -> FD -> (Word32) -> IO (Int32)
{-# LINE 28 "src/Network/Socket/SendFile/Linux.hsc" #-}