summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2008-03-07 12:21:37 +0100
committerJim Meyering <meyering@redhat.com>2008-03-07 12:21:37 +0100
commit381e69eace06d863a3dcd9d9f3a8f61fb449be0b (patch)
treeef60ce64d52b4ab03e0aecc39e3e3b177bc57647 /src
parentc58c2ea3e49d3491af2a2734aa10fc059d843667 (diff)
downloadcoreutils-381e69eace06d863a3dcd9d9f3a8f61fb449be0b.tar.xz
dd: avoid unnecessary, but harmless close_stdout call.
* src/dd.c (close_stdout_required): New global. (maybe_close_stdout): New function. (main): Set the global. Reported by Ulrich Drepper in http://bugzilla.redhat.com/436368
Diffstat (limited to 'src')
-rw-r--r--src/dd.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/dd.c b/src/dd.c
index c40d0eec4..0a7b15421 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -392,6 +392,25 @@ static char const ebcdic_to_ascii[] =
'\070', '\071', '\372', '\373', '\374', '\375', '\376', '\377'
};
+/* True if we need to close the standard output *stream*. */
+static bool close_stdout_required = true;
+
+/* The only reason to close the standard output *stream* is if
+ parse_long_options fails (as it does for --help or --version).
+ In any other case, dd uses only the STDOUT_FILENO file descriptor,
+ and the "cleanup" function calls "close (STDOUT_FILENO)".
+ Closing the file descriptor and then letting the usual atexit-run
+ close_stdout function call "fclose (stdout)" would result in a
+ harmless failure of the close syscall (with errno EBADF).
+ This function serves solely to avoid the unnecessary close_stdout
+ call, once parse_long_options has succeeded. */
+static void
+maybe_close_stdout (void)
+{
+ if (close_stdout_required)
+ close_stdout ();
+}
+
void
usage (int status)
{
@@ -1655,12 +1674,14 @@ main (int argc, char **argv)
textdomain (PACKAGE);
/* Arrange to close stdout if parse_long_options exits. */
- atexit (close_stdout);
+ atexit (maybe_close_stdout);
page_size = getpagesize ();
parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, VERSION,
usage, AUTHORS, (char const *) NULL);
+ close_stdout_required = false;
+
if (getopt_long (argc, argv, "", NULL, NULL) != -1)
usage (EXIT_FAILURE);