svn commit: r208263 - head/lib/libarchive
Tim Kientzle
kientzle at FreeBSD.org
Tue May 18 14:11:39 UTC 2010
Author: kientzle
Date: Tue May 18 14:11:38 2010
New Revision: 208263
URL: http://svn.freebsd.org/changeset/base/208263
Log:
Retry reads that fail with EINTR. This fixes a problem
with bsdtar failing on SIGINT.
Modified:
head/lib/libarchive/archive_read_open_fd.c
head/lib/libarchive/archive_read_open_filename.c
Modified: head/lib/libarchive/archive_read_open_fd.c
==============================================================================
--- head/lib/libarchive/archive_read_open_fd.c Tue May 18 10:32:20 2010 (r208262)
+++ head/lib/libarchive/archive_read_open_fd.c Tue May 18 14:11:38 2010 (r208263)
@@ -116,11 +116,15 @@ file_read(struct archive *a, void *clien
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
Modified: head/lib/libarchive/archive_read_open_filename.c
==============================================================================
--- head/lib/libarchive/archive_read_open_filename.c Tue May 18 10:32:20 2010 (r208262)
+++ head/lib/libarchive/archive_read_open_filename.c Tue May 18 14:11:38 2010 (r208263)
@@ -160,15 +160,19 @@ file_read(struct archive *a, void *clien
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
More information about the svn-src-all
mailing list