diff options
author | Jim Meyering <jim@meyering.net> | 2002-08-26 07:23:37 +0000 |
---|---|---|
committer | Jim Meyering <jim@meyering.net> | 2002-08-26 07:23:37 +0000 |
commit | 234cd4e3fe544d57562eb83d3856c625ec8efccd (patch) | |
tree | 23f9f4ca286bd57cf6d7f9f48c44d7a76978e54b /src | |
parent | 6d1c743816611be8f72deb5d4c18f1761a2c7688 (diff) | |
download | coreutils-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')
-rw-r--r-- | src/cat.c | 23 |
1 files changed, 21 insertions, 2 deletions
@@ -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); } |