diff options
author | Tim Kientzle <kientzle@gmail.com> | 2010-05-16 16:35:38 -0400 |
---|---|---|
committer | Tim Kientzle <kientzle@gmail.com> | 2010-05-16 16:35:38 -0400 |
commit | 28b9e32f4fc8982a15718c6095c118053d22dccf (patch) | |
tree | bab3b8279289872c62c451970d9b4f2dc5c27859 /libarchive/archive_read_open_fd.c | |
parent | 92f4ed06e4e379043c47bb757675fef8effa4c49 (diff) | |
download | libarchive-28b9e32f4fc8982a15718c6095c118053d22dccf.tar.gz |
Retry the read() operation on EINTR. In particular, tar should not die on SIGINT.
SVN-Revision: 2405
Diffstat (limited to 'libarchive/archive_read_open_fd.c')
-rw-r--r-- | libarchive/archive_read_open_fd.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/libarchive/archive_read_open_fd.c b/libarchive/archive_read_open_fd.c index 65735b27..bc547a57 100644 --- a/libarchive/archive_read_open_fd.c +++ b/libarchive/archive_read_open_fd.c @@ -116,11 +116,15 @@ file_read(struct archive *a, void *client_data, const void **buff) ssize_t bytes_read; *buff = mine->buffer; - bytes_read = read(mine->fd, mine->buffer, mine->block_size); - if (bytes_read < 0) { - archive_set_error(a, errno, "Error reading fd %d", mine->fd); + for (;;) { + bytes_read = read(mine->fd, mine->buffer, mine->block_size); + if (bytes_read < 0) { + if (errno == EINTR) + continue; + archive_set_error(a, errno, "Error reading fd %d", mine->fd); + } + return (bytes_read); } - return (bytes_read); } #if ARCHIVE_VERSION_NUMBER < 3000000 |