changeset 66:c52e5f86b0ab

Handle EAGAIN and EWOULDBLOCK when reading files
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 26 Feb 2022 13:56:13 +0100
parents a0cc15de8ae9
children 19893b4f42a5
files shasum.py
diffstat 1 files changed, 20 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/shasum.py	Sun Feb 13 16:10:13 2022 +0100
+++ b/shasum.py	Sat Feb 26 13:56:13 2022 +0100
@@ -25,6 +25,7 @@
 import argparse
 import base64
 import binascii
+import errno
 import hashlib
 import io
 try:
@@ -470,10 +471,15 @@
         if mmap is None:
             # No mmmap available -> use traditional low-level file IO
             while True:
-                buf = os.read(fd, CHUNK_SIZE)
-                if len(buf) == 0:
-                    break
-                h.update(buf)
+                try:
+                    buf = os.read(fd, CHUNK_SIZE)
+                except OSError as e:
+                    if e.errno not in (errno.EAGAIN, errno.EWOULDBLOCK):
+                        raise
+                else:
+                    if len(buf) == 0:
+                        break
+                    h.update(buf)
         else:
             #
             # Use mmap
@@ -519,11 +525,16 @@
     """
     h = hashobj()
     while True:
-        buf = instream.read(CHUNK_SIZE)
-        if buf is not None:
-            if len(buf) == 0:
-                break
-            h.update(buf)
+        try:
+            buf = instream.read(CHUNK_SIZE)
+        except OSError as e:
+            if e.errno not in (errno.EAGAIN, errno.EWOULDBLOCK):
+                raise
+        else:
+            if buf is not None:
+                if len(buf) == 0:
+                    break
+                h.update(buf)
     return h.digest()