aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@FreeBSD.org>2010-05-18 14:11:38 +0000
committerTim Kientzle <kientzle@FreeBSD.org>2010-05-18 14:11:38 +0000
commit50e63ee142df73af137176c01feac6d4b6e590df (patch)
treed9dfb4417f8788eac18c4b1ff58b471f8d0dce57 /lib
parent1dfdc15bb0126487cd2784f4a42a5d3598b21f7c (diff)
downloadsrc-50e63ee142df73af137176c01feac6d4b6e590df.tar.gz
src-50e63ee142df73af137176c01feac6d4b6e590df.zip
Retry reads that fail with EINTR. This fixes a problem
with bsdtar failing on SIGINT.
Notes
Notes: svn path=/head/; revision=208263
Diffstat (limited to 'lib')
-rw-r--r--lib/libarchive/archive_read_open_fd.c12
-rw-r--r--lib/libarchive/archive_read_open_filename.c20
2 files changed, 20 insertions, 12 deletions
diff --git a/lib/libarchive/archive_read_open_fd.c b/lib/libarchive/archive_read_open_fd.c
index 8a7829b7fb0a..90e764a7a399 100644
--- a/lib/libarchive/archive_read_open_fd.c
+++ b/lib/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_API_VERSION < 2
diff --git a/lib/libarchive/archive_read_open_filename.c b/lib/libarchive/archive_read_open_filename.c
index ec0bb369e036..3d6c5dce8c8b 100644
--- a/lib/libarchive/archive_read_open_filename.c
+++ b/lib/libarchive/archive_read_open_filename.c
@@ -160,15 +160,19 @@ 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) {
- if (mine->filename[0] == '\0')
- archive_set_error(a, errno, "Error reading stdin");
- else
- archive_set_error(a, errno, "Error reading '%s'",
- mine->filename);
+ for (;;) {
+ bytes_read = read(mine->fd, mine->buffer, mine->block_size);
+ if (bytes_read < 0) {
+ if (errno == EINTR)
+ continue;
+ else if (mine->filename[0] == '\0')
+ archive_set_error(a, errno, "Error reading stdin");
+ else
+ archive_set_error(a, errno, "Error reading '%s'",
+ mine->filename);
+ }
+ return (bytes_read);
}
- return (bytes_read);
}
#if ARCHIVE_API_VERSION < 2