summaryrefslogtreecommitdiff
path: root/libarchive/archive_write_open_file.c
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@gmail.com>2010-05-31 14:20:46 -0400
committerTim Kientzle <kientzle@gmail.com>2010-05-31 14:20:46 -0400
commit55aec9a7b8f5a2b32a8dd6faa3cb2d24f10ce05c (patch)
tree72fd39eb462cbc72f9eb4c77f61c467fab232ff0 /libarchive/archive_write_open_file.c
parent571f1fb8fc66a489e6c5a362b4085705dc53da31 (diff)
downloadlibarchive-55aec9a7b8f5a2b32a8dd6faa3cb2d24f10ce05c.tar.gz
Handle EINTR in write calls:
* In low-level writers, just retry after EINTR * In archive_write, handle short writes by generating additional writes for the remainder of the block. In particular, this fixes a problem with bsdtar failing if you try to use the SIGINT handler. SVN-Revision: 2431
Diffstat (limited to 'libarchive/archive_write_open_file.c')
-rw-r--r--libarchive/archive_write_open_file.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/libarchive/archive_write_open_file.c b/libarchive/archive_write_open_file.c
index 5c0c737f..f6b14123 100644
--- a/libarchive/archive_write_open_file.c
+++ b/libarchive/archive_write_open_file.c
@@ -86,12 +86,16 @@ file_write(struct archive *a, void *client_data, const void *buff, size_t length
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