[Top][All Lists]
[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"
- fseeko use, Eric Blake, 2007/05/24
- Re: fseeko use,
Eric Blake <=