From: Tim Kientzle Date: Sun, 16 May 2010 20:35:38 +0000 (-0400) Subject: Retry the read() operation on EINTR. In particular, tar should not die on SIGINT. X-Git-Tag: v3.0.0a~999 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=28b9e32f4fc8982a15718c6095c118053d22dccf;p=thirdparty%2Flibarchive.git Retry the read() operation on EINTR. In particular, tar should not die on SIGINT. SVN-Revision: 2405 --- diff --git a/libarchive/archive_read_open_fd.c b/libarchive/archive_read_open_fd.c index 65735b274..bc547a57c 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 diff --git a/libarchive/archive_read_open_filename.c b/libarchive/archive_read_open_filename.c index a099da0a2..701cb4b56 100644 --- a/libarchive/archive_read_open_filename.c +++ b/libarchive/archive_read_open_filename.c @@ -245,15 +245,19 @@ file_read(struct archive *a, void *client_data, const void **buff) * worth of data. */ *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); } /*