posix-modules: Ignore backup files of documentation files.
[gnulib.git] / tests / test-sigpipe.c
1 /* Test of SIGPIPE handling.
2    Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software Foundation,
16    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18 #include <config.h>
19
20 #include <signal.h>
21
22 /* Check that SIGPIPE is defined.  */
23 int s = SIGPIPE;
24
25 #include <errno.h>
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <unistd.h>
29
30 static void
31 handler (int sig)
32 {
33   exit (0);
34 }
35
36 int
37 main (int argc, char **argv)
38 {
39   char mode = argv[1][0];
40
41   switch (mode)
42     {
43     case 'A': signal (SIGPIPE, SIG_DFL); break;
44     case 'B': signal (SIGPIPE, SIG_IGN); break;
45     case 'C': signal (SIGPIPE, handler); break;
46     }
47
48   /* Produce infinite output.  Since it is piped into "head -1", the writes
49      must ultimately fail.  */
50   for (;;)
51     {
52       char c[2] = { 'y', '\n' };
53       int ret = write (1, c, sizeof (c));
54       if (ret <= 0)
55         {
56           switch (mode)
57             {
58             case 'B': /* The write() call should have failed with EPIPE.  */
59               if (ret < 0 && errno == EPIPE)
60                 exit (0);
61               /*FALLTHROUGH*/
62             case 'A': /* The process should silently die.  */
63             case 'C': /* The handler should have been called.  */
64               fprintf (stderr, "write() returned %d with error %d.\n", ret, errno);
65               exit (1);
66             }
67         }
68     }
69 }