| Index: src/xz/file_io.c
 | 
| ===================================================================
 | 
| --- src/xz/file_io.c	(revision 233270)
 | 
| +++ src/xz/file_io.c	(working copy)
 | 
| @@ -41,9 +41,10 @@
 | 
|  static bool try_sparse = true;
 | 
|  
 | 
|  #ifndef TUKLIB_DOSLIKE
 | 
| -/// File status flags of standard output. This is used by io_open_dest()
 | 
| -/// and io_close_dest().
 | 
| -static int stdout_flags = 0;
 | 
| +/// Original file status flags of standard output. This is used by
 | 
| +/// io_open_dest() and io_close_dest() to save and restore the flags.
 | 
| +static int stdout_flags;
 | 
| +static bool restore_stdout_flags = false;
 | 
|  #endif
 | 
|  
 | 
|  
 | 
| @@ -397,10 +398,6 @@
 | 
|  			was_symlink = true;
 | 
|  
 | 
|  #	elif defined(__NetBSD__)
 | 
| -		// As of 2010-09-05, NetBSD doesn't document what errno is
 | 
| -		// used with O_NOFOLLOW. It is EFTYPE though, and I
 | 
| -		// understood that is very unlikely to change even though
 | 
| -		// it is undocumented.
 | 
|  		if (errno == EFTYPE)
 | 
|  			was_symlink = true;
 | 
|  
 | 
| @@ -441,7 +438,7 @@
 | 
|  
 | 
|  		flags &= ~O_NONBLOCK;
 | 
|  
 | 
| -		if (fcntl(pair->src_fd, F_SETFL, flags))
 | 
| +		if (fcntl(pair->src_fd, F_SETFL, flags) == -1)
 | 
|  			goto error_msg;
 | 
|  	}
 | 
|  #endif
 | 
| @@ -634,11 +631,11 @@
 | 
|  			if (!S_ISREG(pair->dest_st.st_mode))
 | 
|  				return false;
 | 
|  
 | 
| -			const int flags = fcntl(STDOUT_FILENO, F_GETFL);
 | 
| -			if (flags == -1)
 | 
| +			stdout_flags = fcntl(STDOUT_FILENO, F_GETFL);
 | 
| +			if (stdout_flags == -1)
 | 
|  				return false;
 | 
|  
 | 
| -			if (flags & O_APPEND) {
 | 
| +			if (stdout_flags & O_APPEND) {
 | 
|  				// Creating a sparse file is not possible
 | 
|  				// when O_APPEND is active (it's used by
 | 
|  				// shell's >> redirection). As I understand
 | 
| @@ -657,12 +654,14 @@
 | 
|  					return false;
 | 
|  
 | 
|  				if (fcntl(STDOUT_FILENO, F_SETFL,
 | 
| -						stdout_flags & ~O_APPEND))
 | 
| +						stdout_flags & ~O_APPEND)
 | 
| +						== -1)
 | 
|  					return false;
 | 
|  
 | 
| -				// Remember the flags so that io_close_dest()
 | 
| -				// can restore them.
 | 
| -				stdout_flags = flags;
 | 
| +				// Disabling O_APPEND succeeded. Mark
 | 
| +				// that the flags should be restored
 | 
| +				// in io_close_dest().
 | 
| +				restore_stdout_flags = true;
 | 
|  
 | 
|  			} else if (lseek(STDOUT_FILENO, 0, SEEK_CUR)
 | 
|  					!= pair->dest_st.st_size) {
 | 
| @@ -703,13 +702,12 @@
 | 
|  {
 | 
|  #ifndef TUKLIB_DOSLIKE
 | 
|  	// If io_open_dest() has disabled O_APPEND, restore it here.
 | 
| -	if (stdout_flags != 0) {
 | 
| +	if (restore_stdout_flags) {
 | 
|  		assert(pair->dest_fd == STDOUT_FILENO);
 | 
|  
 | 
| -		const int fail = fcntl(STDOUT_FILENO, F_SETFL, stdout_flags);
 | 
| -		stdout_flags = 0;
 | 
| +		restore_stdout_flags = false;
 | 
|  
 | 
| -		if (fail) {
 | 
| +		if (fcntl(STDOUT_FILENO, F_SETFL, stdout_flags) == -1) {
 | 
|  			message_error(_("Error restoring the O_APPEND flag "
 | 
|  					"to standard output: %s"),
 | 
|  					strerror(errno));
 | 
| @@ -882,7 +880,7 @@
 | 
|  		if (amount == -1) {
 | 
|  			if (errno == EINTR) {
 | 
|  				if (user_abort)
 | 
| -					return -1;
 | 
| +					return true;
 | 
|  
 | 
|  				continue;
 | 
|  			}
 | 
| 
 |