simple-sendfile 0.1.3 → 0.2.0
raw patch · 3 files changed
+18/−13 lines, 3 files
Files
- Network/Sendfile/Linux.hsc +15/−10
- Network/Sendfile/MacOS.hsc +2/−2
- simple-sendfile.cabal +1/−1
Network/Sendfile/Linux.hsc view
@@ -5,10 +5,9 @@ import Control.Applicative import Control.Concurrent import Control.Exception-import Control.Monad import Data.Int import Data.Word-import Foreign.C.Error (throwErrno)+import Foreign.C.Error (eAGAIN, getErrno, throwErrno) import Foreign.Marshal (alloca) import Foreign.Ptr (Ptr) import Foreign.Storable (poke)@@ -58,14 +57,20 @@ sendPart :: Fd -> Fd -> Ptr (#type off_t) -> (#type size_t) -> IO () -> IO () sendPart dst src offp len hook = do do bytes <- c_sendfile dst src offp len- if bytes == -1- then throwErrno "Network.SendFile.Linux.sendPart"- else do- let left = len - fromIntegral bytes- when (left /= 0) $ do- hook- threadWaitWrite dst- sendPart dst src offp left hook+ case bytes of+ -1 -> do errno <- getErrno+ if errno == eAGAIN+ then loop len+ else throwErrno "Network.SendFile.Linux.sendPart"+ 0 -> return () -- the file is truncated+ _ -> loop (len - fromIntegral bytes)+ where+ loop left+ | left == 0 = return ()+ | otherwise = do+ hook+ threadWaitWrite dst+ sendPart dst src offp left hook -- Dst Src in order. take care foreign import ccall unsafe "sendfile64" c_sendfile
Network/Sendfile/MacOS.hsc view
@@ -54,7 +54,7 @@ do rc <- c_sendfile src dst off lenp when (rc /= 0) $ do errno <- getErrno- if errno == eAGAIN || errno == eINTR+ if errno `elem` [eAGAIN, eINTR] then do sent <- peek lenp poke lenp 0@@ -69,7 +69,7 @@ rc <- c_sendfile src dst off lenp when (rc /= 0) $ do errno <- getErrno- if errno == eAGAIN || errno == eINTR+ if errno `elem` [eAGAIN, eINTR] then do sent <- peek lenp poke lenp (len - sent)
simple-sendfile.cabal view
@@ -1,5 +1,5 @@ Name: simple-sendfile-Version: 0.1.3+Version: 0.2.0 Author: Kazu Yamamoto <kazu@iij.ad.jp> Maintainer: Kazu Yamamoto <kazu@iij.ad.jp> License: BSD3