m4-patches
[Top][All Lists]
Advanced

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

Re: fseeko use


From: Eric Blake
Subject: Re: fseeko use
Date: Thu, 24 May 2007 17:20:20 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Eric Blake <ebb9 <at> byu.net> writes:

> I'm installing this to both branch and head, now that gnulib guarantees
> fseeko will work (beforehand, it was possible for fseek to fail
> unnecessarily at 2gb on platforms with larger off_t).

And now that gnulib supports fflush on mingw, I'm installing this to branch and 
head.

2007-05-24  Eric Blake  <address@hidden>

        Support POSIX flush semantics on all platforms.
        * m4/gnulib-cache.m4: Remove closout, and augment with
        'gnulib-tool --import closein fflush'.
        * src/m4.h (includes): Use closein, not closeout.
        * src/m4.c (main): Ensure stdin is flushed when not all input is
        consumed.
        (process_file): No return needed.
        * src/debug.c (debug_flush_files): Rely on gnulib module, rather
        than excluding mingw.
        * NEWS: Document this change.

Index: NEWS
===================================================================
RCS file: /sources/m4/m4/NEWS,v
retrieving revision 1.1.1.1.2.99
diff -u -p -r1.1.1.1.2.99 NEWS
--- NEWS        25 Apr 2007 14:04:13 -0000      1.1.1.1.2.99
+++ NEWS        24 May 2007 17:18:56 -0000
@@ -6,6 +6,9 @@ Version 1.4.10 - ?? ??? 2007, by ????  (
 
 * Fix regression introduced in 1.4.9 in the `eval' builtin when performing
   division.
+* Work around a number of corner-case POSIX compliance bugs in various
+  broken stdio libraries.  In particular, the `syscmd' builtin behaves
+  more predictably when stdin is seekable.
 
 Version 1.4.9 - 23 Mar 2007, by Eric Blake  (CVS version 1.4.8c)
 
Index: m4/gnulib-cache.m4
===================================================================
RCS file: /sources/m4/m4/m4/Attic/gnulib-cache.m4,v
retrieving revision 1.1.2.24
diff -u -p -r1.1.2.24 gnulib-cache.m4
--- m4/gnulib-cache.m4  24 May 2007 11:58:20 -0000      1.1.2.24
+++ m4/gnulib-cache.m4  24 May 2007 17:18:56 -0000
@@ -15,11 +15,11 @@
 
 
 # Specification in the form of a command-line invocation:
-#   gnulib-tool --import --dir=. --lib=libm4 --source-base=lib --m4-base=m4 --
doc-base=doc --aux-dir=. --no-libtool --macro-prefix=M4 avltree-oset binary-io 
clean-temp cloexec close-stream closeout config-h error fdl fopen-safer free 
fseeko gendocs getopt gnupload mkstemp obstack regex stdbool stdint stdlib-
safer strtol unlocked-io verror version-etc-fsf xalloc xvasprintf
+#   gnulib-tool --import --dir=. --lib=libm4 --source-base=lib --m4-base=m4 --
doc-base=doc --aux-dir=. --no-libtool --macro-prefix=M4 avltree-oset binary-io 
clean-temp cloexec close-stream closein config-h error fdl fflush fopen-safer 
free fseeko gendocs getopt gnupload mkstemp obstack regex stdbool stdint stdlib-
safer strtol unlocked-io verror version-etc-fsf xalloc xvasprintf
 
 # Specification in the form of a few gnulib-tool.m4 macro invocations:
 gl_LOCAL_DIR([])
-gl_MODULES([avltree-oset binary-io clean-temp cloexec close-stream closeout 
config-h error fdl fopen-safer free fseeko gendocs getopt gnupload mkstemp 
obstack regex stdbool stdint stdlib-safer strtol unlocked-io verror version-etc-
fsf xalloc xvasprintf])
+gl_MODULES([avltree-oset binary-io clean-temp cloexec close-stream closein 
config-h error fdl fflush fopen-safer free fseeko gendocs getopt gnupload 
mkstemp obstack regex stdbool stdint stdlib-safer strtol unlocked-io verror 
version-etc-fsf xalloc xvasprintf])
 gl_AVOID([])
 gl_SOURCE_BASE([lib])
 gl_M4_BASE([m4])
Index: src/debug.c
===================================================================
RCS file: /sources/m4/m4/src/Attic/debug.c,v
retrieving revision 1.1.1.1.2.12
diff -u -p -r1.1.1.1.2.12 debug.c
--- src/debug.c 24 May 2007 11:58:20 -0000      1.1.1.1.2.12
+++ src/debug.c 24 May 2007 17:18:56 -0000
@@ -180,22 +180,19 @@ debug_flush_files (void)
      next character on exit (but places no restrictions on the file
      pointer location on a non-seekable file).  It also requires that
      fflush() followed by fseeko() on an input file set the underlying
-     file pointer.  However, fflush() on a non-seekable file can lose
-     buffered data, which we might otherwise want to process after
-     syscmd.  Hence, we must check whether stdin is seekable.  We must
-     also be tolerant of operating with stdin closed, so we don't
-     report any failures in this attempt.  The stdio-safer module and
-     friends are essential, so that if stdin was closed, this lseek is
-     not on some other file that we have since opened.  Mingw has bugs
-     when using fseek on text files, so we only strive for POSIX
-     behavior when we detect a UNIX environment, until gnulib is improved.  */
-#if UNIX
+     file pointer, and gnulib guarantees these semantics.  However,
+     fflush() on a non-seekable file can lose buffered data, which we
+     might otherwise want to process after syscmd.  Hence, we must
+     check whether stdin is seekable.  We must also be tolerant of
+     operating with stdin closed, so we don't report any failures in
+     this attempt.  The stdio-safer module and friends are essential,
+     so that if stdin was closed, this lseek is not on some other file
+     that we have since opened.  */
   if (lseek (STDIN_FILENO, 0, SEEK_CUR) >= 0
       && fflush (stdin) == 0)
     {
       fseeko (stdin, 0, SEEK_CUR);
     }
-#endif /* UNIX */
 }
 
 /*-------------------------------------------------------------------------.
Index: src/m4.c
===================================================================
RCS file: /sources/m4/m4/src/Attic/m4.c,v
retrieving revision 1.1.1.1.2.46
diff -u -p -r1.1.1.1.2.46 m4.c
--- src/m4.c    28 Feb 2007 13:48:19 -0000      1.1.1.1.2.46
+++ src/m4.c    24 May 2007 17:18:56 -0000
@@ -278,10 +278,9 @@ static const struct option long_options[
 
 /* Process a command line file NAME, and return true only if it was
    stdin.  */
-static bool
+static void
 process_file (const char *name)
 {
-  bool result = false;
   if (strcmp (name, "-") == 0)
     {
       /* If stdin is a terminal, we want to allow 'm4 - file -'
@@ -289,7 +288,6 @@ process_file (const char *name)
         there is no point closing stdin before wrapped text, to
         minimize bugs in syscmd called from wrapped text.  */
       push_file (stdin, "stdin", false);
-      result = true;
     }
   else
     {
@@ -301,13 +299,12 @@ process_file (const char *name)
          /* Set the status to EXIT_FAILURE, even though we
             continue to process files after a missing file.  */
          retcode = EXIT_FAILURE;
-         return false;
+         return;
        }
       push_file (fp, full_name, true);
       free (full_name);
     }
   expand_input ();
-  return result;
 }
 
 /* POSIX requires only -D, -U, and -s; and says that the first two
@@ -330,7 +327,6 @@ main (int argc, char *const *argv, char 
   int optchar;                 /* option character */
 
   macro_definition *defines;
-  bool read_stdin = false;
   bool interactive = false;
   bool seen_file = false;
   const char *debugfile = NULL;
@@ -340,7 +336,7 @@ main (int argc, char *const *argv, char 
 
   program_name = argv[0];
   retcode = EXIT_SUCCESS;
-  atexit (close_stdout);
+  atexit (close_stdin);
 
   include_init ();
   debug_init ();
@@ -554,8 +550,7 @@ main (int argc, char *const *argv, char 
 
        case '\1':
          seen_file = true;
-         if (process_file (defines->arg))
-           read_stdin = true;
+          process_file (defines->arg);
          break;
 
        default:
@@ -572,10 +567,10 @@ main (int argc, char *const *argv, char 
      and the input read.  Wrapup text is handled separately later.  */
 
   if (optind == argc && !seen_file)
-    read_stdin = process_file ("-");
+    process_file ("-");
   else
     for (; optind < argc; optind++)
-      read_stdin |= process_file (argv[optind]);
+      process_file (argv[optind]);
 
   /* Now handle wrapup text.  */
 
@@ -583,14 +578,9 @@ main (int argc, char *const *argv, char 
     expand_input ();
 
   /* Change debug stream back to stderr, to force flushing the debug
-     stream and detect any errors it might have encountered.  Close
-     stdin if we read from it, to detect any errors.  */
+     stream and detect any errors it might have encountered.  The
+     three standard streams are closed by close_stdin.  */
   debug_set_output (NULL);
-  if (read_stdin && close_stream (stdin) == EOF)
-    {
-      M4ERROR ((warning_status, errno, "error reading stdin"));
-      retcode = EXIT_FAILURE;
-    }
 
   if (frozen_file_to_write)
     produce_frozen_state (frozen_file_to_write);
Index: src/m4.h
===================================================================
RCS file: /sources/m4/m4/src/m4.h,v
retrieving revision 1.1.1.1.2.41
diff -u -p -r1.1.1.1.2.41 m4.h
--- src/m4.h    28 Feb 2007 13:48:19 -0000      1.1.1.1.2.41
+++ src/m4.h    24 May 2007 17:18:56 -0000
@@ -36,7 +36,7 @@
 #include "clean-temp.h"
 #include "cloexec.h"
 #include "close-stream.h"
-#include "closeout.h"
+#include "closein.h"
 #include "error.h"
 #include "exitfail.h"
 #include "obstack.h"






reply via email to

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