diff --git a/Network/Sendfile/Linux.hsc b/Network/Sendfile/Linux.hsc
--- a/Network/Sendfile/Linux.hsc
+++ b/Network/Sendfile/Linux.hsc
@@ -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
diff --git a/Network/Sendfile/MacOS.hsc b/Network/Sendfile/MacOS.hsc
--- a/Network/Sendfile/MacOS.hsc
+++ b/Network/Sendfile/MacOS.hsc
@@ -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)
diff --git a/simple-sendfile.cabal b/simple-sendfile.cabal
--- a/simple-sendfile.cabal
+++ b/simple-sendfile.cabal
@@ -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
