packages feed

sendfile-0.3.1: src/Network/Socket/SendFile/Linux.hsc

{-# LANGUAGE ForeignFunctionInterface #-}
-- | 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)

#include <sys/sendfile.h>

_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 -> (#type size_t) -> IO (#type ssize_t)