Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Aug 2011 20:24:32 +0000 (UTC)
From:      Martin Matuska <mm@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r224700 - head/lib/libarchive
Message-ID:  <201108072024.p77KOWvk014911@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108072024.p77KOWvk014911>