{-# LANGUAGE CPP #-} module Network.Socket.SendFile.Internal ( sendFile, sendFile', sendFileMode ) where import System.IO ( Handle, IOMode(..), hFileSize, withBinaryFile ) #if defined(WIN32_SENDFILE) import Network.Socket.SendFile.Win32 (_sendFile) sendFileMode :: String sendFileMode = "WIN32_SENDFILE" #endif #if defined(LINUX_SENDFILE) import Network.Socket.SendFile.Linux (_sendFile) sendFileMode :: String sendFileMode = "LINUX_SENDFILE" #endif #if defined(PORTABLE_SENDFILE) import Network.Socket.SendFile.Portable (_sendFile) sendFileMode :: String sendFileMode = "PORTABLE_SENDFILE" #endif sendFile :: Handle -> FilePath -> IO () sendFile outp infp = withBinaryFile infp ReadMode $ \inp -> do count <- hFileSize inp sendFile' outp inp count sendFile' :: Handle -> Handle -> Integer -> IO () sendFile' outp inp count | count < 0 = error "sendFile' - count must be a positive integer" | count == 0 = return () -- Send nothing -- why do the work? Also, Windows treats '0' as 'send the whole file'. | otherwise = _sendFile outp inp count