coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 2/2] maint: use xsetmode, not xfreopen


From: Paul Eggert
Subject: [PATCH 2/2] maint: use xsetmode, not xfreopen
Date: Wed, 15 Feb 2017 15:59:31 -0800

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.
---
 bootstrap.conf | 8 ++++----
 src/base64.c   | 5 ++---
 src/cat.c      | 9 ++++-----
 src/cksum.c    | 5 ++---
 src/head.c     | 8 +++-----
 src/md5sum.c   | 4 ++--
 src/od.c       | 5 ++---
 src/split.c    | 5 ++---
 src/sum.c      | 8 +++-----
 src/tac.c      | 8 +++-----
 src/tail.c     | 8 +++-----
 src/tee.c      | 9 +++------
 src/tr.c       | 9 +++------
 src/wc.c       | 5 ++---
 14 files changed, 38 insertions(+), 58 deletions(-)

diff --git a/bootstrap.conf b/bootstrap.conf
index acec6f0..a1e3523 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -35,8 +35,8 @@ gnulib_modules="
   assert
   autobuild
   backupfile
-  base64
   base32
+  base64
   buffer-lcm
   c-strcase
   c-strtod
@@ -217,10 +217,10 @@ gnulib_modules="
   sigaction
   smack
   ssize_t
-  statat
   stat-macros
   stat-size
   stat-time
+  statat
   stdbool
   stdlib-safer
   stpcpy
@@ -269,7 +269,7 @@ gnulib_modules="
   winsz-termios
   write-any-file
   xalloc
-  xfreopen
+  xdectoint
   xfts
   xgetcwd
   xgetgroups
@@ -279,7 +279,7 @@ gnulib_modules="
   xprintf
   xprintf-posix
   xreadlink
-  xdectoint
+  xsetmode
   xstrtod
   xstrtoimax
   xstrtol
diff --git a/src/base64.c b/src/base64.c
index 5deaec5..d5d75dc 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 0014085..fba721f 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 0785e72..65702a3 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 7639ab9..49c942f 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 ffcf743..19dac08 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 04736bf..0da85da 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 316387b..8bed1d3 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 91af738..7a13abe 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 5c1b3e8..41c4f99 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 b24757f..dbd2104 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 74477cb..5f04bfc 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 bb86a89..724297c 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 40fce68..a587b2c 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
-- 
2.9.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]