summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2017-02-15 15:58:08 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2017-02-15 15:59:16 -0800
commit75aababed45d0120d44baa76c5107d0ceb71fc59 (patch)
tree5b4d628544b8640e489e356d881ff72ad6ff4db1 /src
parente5cfadd6c7fa08153e56b950e72801677f7d1fe8 (diff)
downloadcoreutils-75aababed45d0120d44baa76c5107d0ceb71fc59.tar.xz
maint: use xsetmode, not xfreopen
This fixes a bug noted by Eric Blake. Code was using xfreopen to change files to binary mode, but this fails for stdout when in append mode. Such code should use xsetmode instead. This affects only the port on platforms like MS-Windows which distiguish text from binary I/O. * bootstrap.conf (gnulib_modules): Remove xfreopen and add xsetmode. Sort. * src/base64.c (main): * src/cat.c (main): * src/cksum.c (cksum): * src/head.c (head_file, main): * src/md5sum.c (digest_file): * src/od.c (open_next_file): * src/split.c (main): * src/sum.c (bsd_sum_file, sysv_sum_file): * src/tac.c (tac_file, main): * src/tail.c (tail_file): * src/tee.c (tee_files): * src/tr.c (main): * src/wc.c (wc_file): Use xsetmode, not xfreopen.
Diffstat (limited to 'src')
-rw-r--r--src/base64.c5
-rw-r--r--src/cat.c9
-rw-r--r--src/cksum.c5
-rw-r--r--src/head.c8
-rw-r--r--src/md5sum.c4
-rw-r--r--src/od.c5
-rw-r--r--src/split.c5
-rw-r--r--src/sum.c8
-rw-r--r--src/tac.c8
-rw-r--r--src/tail.c8
-rw-r--r--src/tee.c9
-rw-r--r--src/tr.c9
-rw-r--r--src/wc.c5
13 files changed, 34 insertions, 54 deletions
diff --git a/src/base64.c b/src/base64.c
index 5deaec5b6..d5d75dcc3 100644
--- a/src/base64.c
+++ b/src/base64.c
@@ -31,7 +31,7 @@
#include "quote.h"
#include "xstrtol.h"
#include "xdectoint.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
#define AUTHORS proper_name ("Simon Josefsson")
@@ -320,8 +320,7 @@ main (int argc, char **argv)
if (STREQ (infile, "-"))
{
- if (O_BINARY)
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
input_fh = stdin;
}
else
diff --git a/src/cat.c b/src/cat.c
index 001408576..fba721f28 100644
--- a/src/cat.c
+++ b/src/cat.c
@@ -39,7 +39,7 @@
#include "fadvise.h"
#include "full-write.h"
#include "safe-read.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "cat"
@@ -645,8 +645,7 @@ main (int argc, char **argv)
if (! (number || show_ends || squeeze_blank))
{
file_open_mode |= O_BINARY;
- if (O_BINARY && ! isatty (STDOUT_FILENO))
- xfreopen (NULL, "wb", stdout);
+ xsetmode (STDOUT_FILENO, O_BINARY);
}
/* Check if any of the input files are the same as the output file. */
@@ -665,8 +664,8 @@ main (int argc, char **argv)
{
have_read_stdin = true;
input_desc = STDIN_FILENO;
- if ((file_open_mode & O_BINARY) && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ if (file_open_mode & O_BINARY)
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
{
diff --git a/src/cksum.c b/src/cksum.c
index 0785e727d..65702a317 100644
--- a/src/cksum.c
+++ b/src/cksum.c
@@ -44,7 +44,7 @@
#include <stdint.h>
#include "system.h"
#include "fadvise.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
#ifdef CRCTAB
@@ -194,8 +194,7 @@ cksum (const char *file, bool print_name)
{
fp = stdin;
have_read_stdin = true;
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
{
diff --git a/src/head.c b/src/head.c
index 7639ab974..49c942fea 100644
--- a/src/head.c
+++ b/src/head.c
@@ -37,8 +37,8 @@
#include "quote.h"
#include "safe-read.h"
#include "stat-size.h"
-#include "xfreopen.h"
#include "xdectoint.h"
+#include "xsetmode.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "head"
@@ -878,8 +878,7 @@ head_file (const char *filename, uintmax_t n_units, bool count_lines,
have_read_stdin = true;
fd = STDIN_FILENO;
filename = _("standard input");
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
{
@@ -1083,8 +1082,7 @@ main (int argc, char **argv)
? (char const *const *) &argv[optind]
: default_file_list);
- if (O_BINARY && ! isatty (STDOUT_FILENO))
- xfreopen (NULL, "wb", stdout);
+ xsetmode (STDOUT_FILENO, O_BINARY);
for (i = 0; file_list[i]; ++i)
ok &= head_file (file_list[i], n_units, count_lines, elide_from_end);
diff --git a/src/md5sum.c b/src/md5sum.c
index ffcf74302..19dac0861 100644
--- a/src/md5sum.c
+++ b/src/md5sum.c
@@ -46,7 +46,7 @@
#include "error.h"
#include "fadvise.h"
#include "stdio--.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
/* The official name of this program (e.g., no 'g' prefix). */
#if HASH_ALGO_MD5
@@ -598,7 +598,7 @@ digest_file (const char *filename, int *binary, unsigned char *bin_result,
if (*binary < 0)
*binary = ! isatty (STDIN_FILENO);
if (*binary)
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
}
else
diff --git a/src/od.c b/src/od.c
index 04736bf8f..0da85dae5 100644
--- a/src/od.c
+++ b/src/od.c
@@ -29,8 +29,8 @@
#include "ftoastr.h"
#include "quote.h"
#include "stat-size.h"
-#include "xfreopen.h"
#include "xprintf.h"
+#include "xsetmode.h"
#include "xstrtol.h"
/* The official name of this program (e.g., no 'g' prefix). */
@@ -914,8 +914,7 @@ open_next_file (void)
input_filename = _("standard input");
in_stream = stdin;
have_read_stdin = true;
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
{
diff --git a/src/split.c b/src/split.c
index 316387b1a..8bed1d38a 100644
--- a/src/split.c
+++ b/src/split.c
@@ -38,8 +38,8 @@
#include "quote.h"
#include "safe-read.h"
#include "sig2str.h"
-#include "xfreopen.h"
#include "xdectoint.h"
+#include "xsetmode.h"
#include "xstrtol.h"
/* The official name of this program (e.g., no 'g' prefix). */
@@ -1553,8 +1553,7 @@ main (int argc, char **argv)
quoteaf (infile));
/* Binary I/O is safer when byte counts are used. */
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
/* Get the optimal block size of input device and make a buffer. */
diff --git a/src/sum.c b/src/sum.c
index 91af738dd..7a13abe01 100644
--- a/src/sum.c
+++ b/src/sum.c
@@ -29,7 +29,7 @@
#include "fadvise.h"
#include "human.h"
#include "safe-read.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "sum"
@@ -98,8 +98,7 @@ bsd_sum_file (const char *file, int print_name)
{
fp = stdin;
have_read_stdin = true;
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
{
@@ -168,8 +167,7 @@ sysv_sum_file (const char *file, int print_name)
{
fd = STDIN_FILENO;
have_read_stdin = true;
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
{
diff --git a/src/tac.c b/src/tac.c
index 5c1b3e8a2..41c4f998a 100644
--- a/src/tac.c
+++ b/src/tac.c
@@ -48,7 +48,7 @@ tac -r -s '.\|
#include "filenamecat.h"
#include "safe-read.h"
#include "stdlib--.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "tac"
@@ -572,8 +572,7 @@ tac_file (const char *filename)
have_read_stdin = true;
fd = STDIN_FILENO;
filename = _("standard input");
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
{
@@ -688,8 +687,7 @@ main (int argc, char **argv)
? (char const *const *) &argv[optind]
: default_file_list);
- if (O_BINARY && ! isatty (STDOUT_FILENO))
- xfreopen (NULL, "wb", stdout);
+ xsetmode (STDOUT_FILENO, O_BINARY);
{
size_t i;
diff --git a/src/tail.c b/src/tail.c
index b24757f3d..dbd210458 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -43,9 +43,9 @@
#include "safe-read.h"
#include "stat-size.h"
#include "stat-time.h"
-#include "xfreopen.h"
#include "xnanosleep.h"
#include "xdectoint.h"
+#include "xsetmode.h"
#include "xstrtol.h"
#include "xstrtod.h"
@@ -1894,8 +1894,7 @@ tail_file (struct File_spec *f, uintmax_t n_units)
{
have_read_stdin = true;
fd = STDIN_FILENO;
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
}
else
fd = open (f->name, O_RDONLY | O_BINARY);
@@ -2324,8 +2323,7 @@ main (int argc, char **argv)
|| (header_mode == multiple_files && n_files > 1))
print_headers = true;
- if (O_BINARY && ! isatty (STDOUT_FILENO))
- xfreopen (NULL, "wb", stdout);
+ xsetmode (STDOUT_FILENO, O_BINARY);
for (i = 0; i < n_files; i++)
ok &= tail_file (&F[i], n_units);
diff --git a/src/tee.c b/src/tee.c
index 74477cb7e..5f04bfc86 100644
--- a/src/tee.c
+++ b/src/tee.c
@@ -27,7 +27,7 @@
#include "error.h"
#include "fadvise.h"
#include "stdio--.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "tee"
@@ -194,11 +194,8 @@ tee_files (int nfiles, char **files)
? (append ? "ab" : "wb")
: (append ? "a" : "w"));
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
- if (O_BINARY && ! isatty (STDOUT_FILENO))
- xfreopen (NULL, "wb", stdout);
-
+ xsetmode (STDIN_FILENO, O_BINARY);
+ xsetmode (STDOUT_FILENO, O_BINARY);
fadvise (stdin, FADVISE_SEQUENTIAL);
/* Set up FILES[0 .. NFILES] and DESCRIPTORS[0 .. NFILES].
diff --git a/src/tr.c b/src/tr.c
index bb86a8939..724297c9b 100644
--- a/src/tr.c
+++ b/src/tr.c
@@ -29,7 +29,7 @@
#include "fadvise.h"
#include "quote.h"
#include "safe-read.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
#include "xstrtol.h"
/* The official name of this program (e.g., no 'g' prefix). */
@@ -1786,11 +1786,8 @@ main (int argc, char **argv)
/* Use binary I/O, since 'tr' is sometimes used to transliterate
non-printable characters, or characters which are stripped away
by text-mode reads (like CR and ^Z). */
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
- if (O_BINARY && ! isatty (STDOUT_FILENO))
- xfreopen (NULL, "wb", stdout);
-
+ xsetmode (STDIN_FILENO, O_BINARY);
+ xsetmode (STDOUT_FILENO, O_BINARY);
fadvise (stdin, FADVISE_SEQUENTIAL);
if (squeeze_repeats && non_option_args == 1)
diff --git a/src/wc.c b/src/wc.c
index 40fce685d..a587b2ca4 100644
--- a/src/wc.c
+++ b/src/wc.c
@@ -36,7 +36,7 @@
#include "readtokens0.h"
#include "safe-read.h"
#include "stat-size.h"
-#include "xfreopen.h"
+#include "xsetmode.h"
#if !defined iswspace && !HAVE_ISWSPACE
# define iswspace(wc) \
@@ -556,8 +556,7 @@ wc_file (char const *file, struct fstatus *fstatus)
if (! file || STREQ (file, "-"))
{
have_read_stdin = true;
- if (O_BINARY && ! isatty (STDIN_FILENO))
- xfreopen (NULL, "rb", stdin);
+ xsetmode (STDIN_FILENO, O_BINARY);
return wc (STDIN_FILENO, file, fstatus, -1);
}
else