]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Retry the read() operation on EINTR. In particular, tar should not die on SIGINT.
authorTim Kientzle <kientzle@gmail.com>
Sun, 16 May 2010 20:35:38 +0000 (16:35 -0400)
committerTim Kientzle <kientzle@gmail.com>
Sun, 16 May 2010 20:35:38 +0000 (16:35 -0400)
SVN-Revision: 2405

libarchive/archive_read_open_fd.c
libarchive/archive_read_open_filename.c

index 65735b274d293a2dddbb519f1f996ba6692f4c74..bc547a57c523b823c74c9ef471e44d3abdbadb07 100644 (file)
@@ -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
index a099da0a2c8ae7d21954f74f986b40c9ce69e1f7..701cb4b56b42b1076c48f1ccdb0de50787eb2a6d 100644 (file)
@@ -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);
 }
 
 /*