summaryrefslogtreecommitdiff
path: root/src/cat.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2002-08-26 07:23:37 +0000
committerJim Meyering <jim@meyering.net>2002-08-26 07:23:37 +0000
commit234cd4e3fe544d57562eb83d3856c625ec8efccd (patch)
tree23f9f4ca286bd57cf6d7f9f48c44d7a76978e54b /src/cat.c
parent6d1c743816611be8f72deb5d4c18f1761a2c7688 (diff)
downloadcoreutils-234cd4e3fe544d57562eb83d3856c625ec8efccd.tar.xz
(close_stdout_wrapper): New, kludgey, function and file-scoped global.
(main): Register it with atexit. Close STDOUT_FILENO, to avoid a problem when writing to /dev/audio on at least Solaris 2.7 and 2.8 systems.
Diffstat (limited to 'src/cat.c')
-rw-r--r--src/cat.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/cat.c b/src/cat.c
index 72ec1e62c..e78b4bde9 100644
--- a/src/cat.c
+++ b/src/cat.c
@@ -482,6 +482,17 @@ cat (
}
}
+/* This is gross, but necessary, because of the way close_stdout
+ works and because this program closes STDOUT_FILENO directly. */
+static void (*closeout_func) (void) = close_stdout;
+
+static void
+close_stdout_wrapper (void)
+{
+ if (closeout_func)
+ (*closeout_func) ();
+}
+
int
main (int argc, char **argv)
{
@@ -554,7 +565,9 @@ main (int argc, char **argv)
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- atexit (close_stdout);
+ /* Arrange to close stdout if we exit via the
+ case_GETOPT_HELP_CHAR or case_GETOPT_VERSION_CHAR code. */
+ atexit (close_stdout_wrapper);
/* Parse command line options. */
@@ -641,6 +654,9 @@ main (int argc, char **argv)
}
}
+ /* Don't close stdout on exit from here on. */
+ closeout_func = NULL;
+
/* Get device, i-node number, and optimal blocksize of output. */
if (fstat (STDOUT_FILENO, &stat_buf) < 0)
@@ -833,7 +849,10 @@ main (int argc, char **argv)
while (++argind < argc);
if (have_read_stdin && close (STDIN_FILENO) < 0)
- error (EXIT_FAILURE, errno, "-");
+ error (EXIT_FAILURE, errno, _("closing standard input"));
+
+ if (close (STDOUT_FILENO) < 0)
+ error (EXIT_FAILURE, errno, _("closing standard output"));
exit (exit_status == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
}