annotate tests/test-sigpipe.c @ 17632:86af85d364e1 default tip

unistd: port readlink to Mac OS X 10.3.9 * lib/unistd.in.h (_GL_INCLUDING_UNISTD_H): New macro, to work around self-include problem in Mac OS X 10.3.9 when combined with readlink module. Problem reported by Klaus Zietler in <http://bugs.gnu.org/16825>.
author Paul Eggert <eggert@penguin.cs.ucla.edu>
date Tue, 25 Feb 2014 11:16:27 -0800 (2014-02-25)
parents 344018b6e5d7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10485
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
1 /* Test of SIGPIPE handling.
17587
344018b6e5d7 maint: update copyright
Eric Blake <eblake@redhat.com>
parents: 17249
diff changeset
2 Copyright (C) 2008-2014 Free Software Foundation, Inc.
10485
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
3
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
6 the Free Software Foundation; either version 3, or (at your option)
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
7 any later version.
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
8
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
12 GNU General Public License for more details.
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
13
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
16366
bb182ee4a09d maint: replace FSF snail-mail addresses with URLs
Paul Eggert <eggert@cs.ucla.edu>
parents: 16201
diff changeset
15 along with this program; if not, see <http://www.gnu.org/licenses/>. */
10485
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
16
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
17 #include <config.h>
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
18
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
19 #include <signal.h>
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
20
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
21 /* Check that SIGPIPE is defined. */
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
22 int s = SIGPIPE;
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
23
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
24 #include <errno.h>
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
25 #include <stdio.h>
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
26 #include <stdlib.h>
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
27 #include <unistd.h>
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
28
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
29 static void
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
30 handler (int sig)
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
31 {
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
32 exit (0);
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
33 }
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
34
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
35 int
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
36 main (int argc, char **argv)
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
37 {
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
38 char mode = argv[1][0];
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
39
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
40 switch (mode)
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
41 {
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
42 case 'A': signal (SIGPIPE, SIG_DFL); break;
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
43 case 'B': signal (SIGPIPE, SIG_IGN); break;
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
44 case 'C': signal (SIGPIPE, handler); break;
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
45 }
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
46
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
47 /* Produce infinite output. Since it is piped into "head -1", the writes
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
48 must ultimately fail. */
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
49 for (;;)
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
50 {
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
51 char c[2] = { 'y', '\n' };
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
52 int ret = write (1, c, sizeof (c));
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
53 if (ret <= 0)
12421
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
54 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
55 switch (mode)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
56 {
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
57 case 'B': /* The write() call should have failed with EPIPE. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
58 if (ret < 0 && errno == EPIPE)
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
59 exit (0);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
60 /*FALLTHROUGH*/
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
61 case 'A': /* The process should silently die. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
62 case 'C': /* The handler should have been called. */
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
63 fprintf (stderr, "write() returned %d with error %d.\n", ret, errno);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
64 exit (1);
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
65 }
e8d2c6fc33ad Use spaces for indentation, not tabs.
Bruno Haible <bruno@clisp.org>
parents: 10485
diff changeset
66 }
10485
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
67 }
5bf9ebbeac47 Tests for module 'sigpipe'.
Bruno Haible <bruno@clisp.org>
parents:
diff changeset
68 }