From 23c11479b3ad787adc7a651ee0c4347839e47723 Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Sun, 22 Sep 2013 07:04:10 +0000 Subject: Imported from /home/lorry/working-area/delta_m4-tarball/m4-1.4.17.tar.xz. --- tests/test-sigpipe.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/test-sigpipe.c (limited to 'tests/test-sigpipe.c') diff --git a/tests/test-sigpipe.c b/tests/test-sigpipe.c new file mode 100644 index 0000000..e09294a --- /dev/null +++ b/tests/test-sigpipe.c @@ -0,0 +1,68 @@ +/* Test of SIGPIPE handling. + Copyright (C) 2008-2013 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, see . */ + +#include + +#include + +/* Check that SIGPIPE is defined. */ +int s = SIGPIPE; + +#include +#include +#include +#include + +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); + } + } + } +} -- cgit v1.2.1