diff options
Diffstat (limited to 'gnulib/tests/test-sigpipe.c')
m--------- | gnulib | 0 | ||||
-rw-r--r-- | gnulib/tests/test-sigpipe.c | 69 |
2 files changed, 69 insertions, 0 deletions
diff --git a/gnulib b/gnulib deleted file mode 160000 -Subproject 443bc5ffcf7429e557f4a371b0661abe98ddbc1 diff --git a/gnulib/tests/test-sigpipe.c b/gnulib/tests/test-sigpipe.c new file mode 100644 index 0000000..6a6c78b --- /dev/null +++ b/gnulib/tests/test-sigpipe.c @@ -0,0 +1,69 @@ +/* Test of SIGPIPE handling. + Copyright (C) 2008-2011 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + +#include <config.h> + +#include <signal.h> + +/* Check that SIGPIPE is defined. */ +int s = SIGPIPE; + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +static void +handler (int sig) +{ + exit (0); +} + +int +main (int argc, char **argv) +{ + char mode = argv[1][0]; + + switch (mode) + { + case 'A': signal (SIGPIPE, SIG_DFL); break; + case 'B': signal (SIGPIPE, SIG_IGN); break; + case 'C': signal (SIGPIPE, handler); break; + } + + /* Produce infinite output. Since it is piped into "head -1", the writes + must ultimately fail. */ + for (;;) + { + char c[2] = { 'y', '\n' }; + int ret = write (1, c, sizeof (c)); + if (ret <= 0) + { + switch (mode) + { + case 'B': /* The write() call should have failed with EPIPE. */ + if (ret < 0 && errno == EPIPE) + exit (0); + /*FALLTHROUGH*/ + case 'A': /* The process should silently die. */ + case 'C': /* The handler should have been called. */ + fprintf (stderr, "write() returned %d with error %d.\n", ret, errno); + exit (1); + } + } + } +} |