summaryrefslogtreecommitdiff
path: root/libarchive/archive_read_open_fd.c
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@gmail.com>2010-05-16 16:35:38 -0400
committerTim Kientzle <kientzle@gmail.com>2010-05-16 16:35:38 -0400
commit28b9e32f4fc8982a15718c6095c118053d22dccf (patch)
treebab3b8279289872c62c451970d9b4f2dc5c27859 /libarchive/archive_read_open_fd.c
parent92f4ed06e4e379043c47bb757675fef8effa4c49 (diff)
downloadlibarchive-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.c12
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