# HG changeset patch # User Franz Glasner # Date 1645880173 -3600 # Node ID c52e5f86b0ab0697331098dd5b6fac026ce166bc # Parent a0cc15de8ae97d8170afbcc4bc29ece6ae0e204d Handle EAGAIN and EWOULDBLOCK when reading files diff -r a0cc15de8ae9 -r c52e5f86b0ab shasum.py --- 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()