packages feed

simple-sendfile 0.1.3 → 0.2.0

raw patch · 3 files changed

+18/−13 lines, 3 files

Files

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