Ondrej Vasik 4d6a38
diff -urNp coreutils-6.10-orig/src/dd.c coreutils-6.10/src/dd.c
Ondrej Vasik 4d6a38
--- coreutils-6.10-orig/src/dd.c	2007-12-06 14:22:42.000000000 +0100
Ondrej Vasik 4d6a38
+++ coreutils-6.10/src/dd.c	2008-03-11 12:48:12.000000000 +0100
Ondrej Vasik 4d6a38
@@ -391,6 +391,25 @@ static char const ebcdic_to_ascii[] =
Ondrej Vasik 4d6a38
   '\070', '\071', '\372', '\373', '\374', '\375', '\376', '\377'
Ondrej Vasik 4d6a38
 };
Ondrej Vasik 4d6a38
 
Ondrej Vasik 4d6a38
+/* True if we need to close the standard output *stream*.  */
Ondrej Vasik 4d6a38
+static bool close_stdout_required = true;
Ondrej Vasik 4d6a38
+
Ondrej Vasik 4d6a38
+/* The only reason to close the standard output *stream* is if
Ondrej Vasik 4d6a38
+   parse_long_options fails (as it does for --help or --version).
Ondrej Vasik 4d6a38
+   In any other case, dd uses only the STDOUT_FILENO file descriptor,
Ondrej Vasik 4d6a38
+   and the "cleanup" function calls "close (STDOUT_FILENO)".
Ondrej Vasik 4d6a38
+   Closing the file descriptor and then letting the usual atexit-run
Ondrej Vasik 4d6a38
+   close_stdout function call "fclose (stdout)" would result in a
Ondrej Vasik 4d6a38
+   harmless failure of the close syscall (with errno EBADF).
Ondrej Vasik 4d6a38
+   This function serves solely to avoid the unnecessary close_stdout
Ondrej Vasik 4d6a38
+   call, once parse_long_options has succeeded.  */
Ondrej Vasik 4d6a38
+static void
Ondrej Vasik 4d6a38
+maybe_close_stdout (void)
Ondrej Vasik 4d6a38
+{
Ondrej Vasik 4d6a38
+  if (close_stdout_required)
Ondrej Vasik 4d6a38
+    close_stdout ();
Ondrej Vasik 4d6a38
+}
Ondrej Vasik 4d6a38
+
Ondrej Vasik 4d6a38
 void
Ondrej Vasik 4d6a38
 usage (int status)
Ondrej Vasik 4d6a38
 {
Ondrej Vasik 4d6a38
@@ -1639,12 +1658,14 @@ main (int argc, char **argv)
Ondrej Vasik 4d6a38
   textdomain (PACKAGE);
Ondrej Vasik 4d6a38
 
Ondrej Vasik 4d6a38
   /* Arrange to close stdout if parse_long_options exits.  */
Ondrej Vasik 4d6a38
-  atexit (close_stdout);
Ondrej Vasik 4d6a38
+  atexit (maybe_close_stdout);
Ondrej Vasik 4d6a38
 
Ondrej Vasik 4d6a38
   page_size = getpagesize ();
Ondrej Vasik 4d6a38
 
Ondrej Vasik 4d6a38
   parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, VERSION,
Ondrej Vasik 4d6a38
 		      usage, AUTHORS, (char const *) NULL);
Ondrej Vasik 4d6a38
+  close_stdout_required = false;
Ondrej Vasik 4d6a38
+
Ondrej Vasik 4d6a38
   if (getopt_long (argc, argv, "", NULL, NULL) != -1)
Ondrej Vasik 4d6a38
     usage (EXIT_FAILURE);
Ondrej Vasik 4d6a38