svn commit: r224700 - head/lib/libarchive
Martin Matuska
mm at FreeBSD.org
Sun Aug 7 20:24:33 UTC 2011
Author: mm
Date: Sun Aug 7 20:24:32 2011
New Revision: 224700
URL: http://svn.freebsd.org/changeset/base/224700
Log:
Merge revision 3554 from libarchive's release/2.8 branch:
Partial merge of 2431 from trunk: Retry writes on EINTR.
This should fix the SIGINT handler in bsdtar.
Note: The rest of r2431 can't be merged, since it interacts
with a big write-side rearchitecture.
PR: bin/149409
Reviewed by: kientzle
Approved by: re (kib)
MFC after: 3 days
Modified:
head/lib/libarchive/archive_write_open_fd.c
head/lib/libarchive/archive_write_open_file.c
head/lib/libarchive/archive_write_open_filename.c
Modified: head/lib/libarchive/archive_write_open_fd.c
==============================================================================
--- head/lib/libarchive/archive_write_open_fd.c Sun Aug 7 20:16:46 2011 (r224699)
+++ head/lib/libarchive/archive_write_open_fd.c Sun Aug 7 20:24:32 2011 (r224700)
@@ -51,7 +51,6 @@ __FBSDID("$FreeBSD$");
#include "archive.h"
struct write_fd_data {
- off_t offset;
int fd;
};
@@ -122,12 +121,16 @@ file_write(struct archive *a, void *clie
ssize_t bytesWritten;
mine = (struct write_fd_data *)client_data;
- bytesWritten = write(mine->fd, buff, length);
- if (bytesWritten <= 0) {
- archive_set_error(a, errno, "Write error");
- return (-1);
+ for (;;) {
+ bytesWritten = write(mine->fd, buff, length);
+ if (bytesWritten <= 0) {
+ if (errno == EINTR)
+ continue;
+ archive_set_error(a, errno, "Write error");
+ return (-1);
+ }
+ return (bytesWritten);
}
- return (bytesWritten);
}
static int
Modified: head/lib/libarchive/archive_write_open_file.c
==============================================================================
--- head/lib/libarchive/archive_write_open_file.c Sun Aug 7 20:16:46 2011 (r224699)
+++ head/lib/libarchive/archive_write_open_file.c Sun Aug 7 20:24:32 2011 (r224700)
@@ -86,12 +86,16 @@ file_write(struct archive *a, void *clie
size_t bytesWritten;
mine = client_data;
- bytesWritten = fwrite(buff, 1, length, mine->f);
- if (bytesWritten < length) {
- archive_set_error(a, errno, "Write error");
- return (-1);
+ for (;;) {
+ bytesWritten = fwrite(buff, 1, length, mine->f);
+ if (bytesWritten <= 0) {
+ if (errno == EINTR)
+ continue;
+ archive_set_error(a, errno, "Write error");
+ return (-1);
+ }
+ return (bytesWritten);
}
- return (bytesWritten);
}
static int
Modified: head/lib/libarchive/archive_write_open_filename.c
==============================================================================
--- head/lib/libarchive/archive_write_open_filename.c Sun Aug 7 20:16:46 2011 (r224699)
+++ head/lib/libarchive/archive_write_open_filename.c Sun Aug 7 20:24:32 2011 (r224700)
@@ -142,12 +142,16 @@ file_write(struct archive *a, void *clie
ssize_t bytesWritten;
mine = (struct write_file_data *)client_data;
- bytesWritten = write(mine->fd, buff, length);
- if (bytesWritten <= 0) {
- archive_set_error(a, errno, "Write error");
- return (-1);
+ for (;;) {
+ bytesWritten = write(mine->fd, buff, length);
+ if (bytesWritten <= 0) {
+ if (errno == EINTR)
+ continue;
+ archive_set_error(a, errno, "Write error");
+ return (-1);
+ }
+ return (bytesWritten);
}
- return (bytesWritten);
}
static int
More information about the svn-src-head
mailing list