aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLasse Collin <lasse.collin@tukaani.org>2015-01-07 19:08:06 +0200
committerLasse Collin <lasse.collin@tukaani.org>2015-01-07 19:08:06 +0200
commitf0f1f6c7235ffa901cf76fe18e33749e200b3eea (patch)
tree7164d82508dbebca219ea2026e034e9ee0d5b82e
parentTests: Don't hide unexpected error messages in test_files.sh. (diff)
downloadxz-f0f1f6c7235ffa901cf76fe18e33749e200b3eea.tar.xz
xz: Don't fail if stdin doesn't support O_NONBLOCK.
It's a problem at least on OpenBSD which doesn't support O_NONBLOCK on e.g. /dev/null. I'm not surprised if it's a problem on other OSes too since this behavior is allowed in POSIX-1.2008. The code relying on this behavior was committed in June 2013 and included in 5.1.3alpha released on 2013-10-26. Clearly the development releases only get limited testing.
Diffstat (limited to '')
-rw-r--r--src/xz/file_io.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/src/xz/file_io.c b/src/xz/file_io.c
index f135cf7c..bf4462d9 100644
--- a/src/xz/file_io.c
+++ b/src/xz/file_io.c
@@ -393,7 +393,10 @@ io_open_src_real(file_pair *pair)
#ifdef TUKLIB_DOSLIKE
setmode(STDIN_FILENO, O_BINARY);
#else
- // Enable O_NONBLOCK for stdin.
+ // Try to set stdout to non-blocking mode. It won't work
+ // e.g. on OpenBSD if stdout is e.g. /dev/null. In such
+ // case we proceed as if stdout were non-blocking anyway
+ // (in case of /dev/null it will be in practice).
stdin_flags = fcntl(STDIN_FILENO, F_GETFL);
if (stdin_flags == -1) {
message_error(_("Error getting the file status flags "
@@ -402,17 +405,10 @@ io_open_src_real(file_pair *pair)
return true;
}
- if ((stdin_flags & O_NONBLOCK) == 0) {
- if (fcntl(STDIN_FILENO, F_SETFL,
- stdin_flags | O_NONBLOCK) == -1) {
- message_error(_("Error setting O_NONBLOCK "
- "on standard input: %s"),
- strerror(errno));
- return true;
- }
-
+ if ((stdin_flags & O_NONBLOCK) == 0
+ && fcntl(STDIN_FILENO, F_SETFL,
+ stdin_flags | O_NONBLOCK) != -1)
restore_stdin_flags = true;
- }
#endif
#ifdef HAVE_POSIX_FADVISE
// It will fail if stdin is a pipe and that's fine.