]> Cypherpunks.ru repositories - gostls13.git/blob - misc/cgo/testcarchive/testdata/main5.c
Revert "misc/cgo/testcarchive: permit SIGQUIT for TestSignalForwardingExternal"
[gostls13.git] / misc / cgo / testcarchive / testdata / main5.c
1 // Copyright 2015 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 // Test for verifying that the Go runtime properly forwards
6 // signals when non-Go signals are raised.
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <sys/types.h>
12 #include <sys/time.h>
13 #include <sys/select.h>
14
15 #include "libgo2.h"
16
17 int *nilp;
18
19 int main(int argc, char** argv) {
20         int verbose;
21         int test;
22
23         if (argc < 2) {
24                 printf("Missing argument\n");
25                 return 1;
26         }
27
28         test = atoi(argv[1]);
29
30         verbose = (argc > 2);
31
32         if (verbose) {
33                 printf("calling RunGoroutines\n");
34         }
35
36         Noop();
37
38         switch (test) {
39                 case 1: {
40                         if (verbose) {
41                                 printf("attempting segfault\n");
42                         }
43
44                         *nilp = 0;
45                         break;
46                 }
47
48                 case 2: {
49                         struct timeval tv;
50
51                         if (verbose) {
52                                 printf("attempting external signal test\n");
53                         }
54
55                         fprintf(stderr, "OK\n");
56                         fflush(stderr);
57
58                         // The program should be interrupted before
59                         // this sleep finishes. We use select rather
60                         // than sleep because in older versions of
61                         // glibc the sleep function does some signal
62                         // fiddling to handle SIGCHLD.  If this
63                         // program is fiddling signals just when the
64                         // test program sends the signal, the signal
65                         // may be delivered to a Go thread which will
66                         // break this test.
67                         tv.tv_sec = 60;
68                         tv.tv_usec = 0;
69                         select(0, NULL, NULL, NULL, &tv);
70
71                         break;
72                 }
73                 case 3: {
74                         if (verbose) {
75                                 printf("attempting SIGPIPE\n");
76                         }
77
78                         int fd[2];
79                         if (pipe(fd) != 0) {
80                                 printf("pipe(2) failed\n");
81                                 return 0;
82                         }
83                         // Close the reading end.
84                         close(fd[0]);
85                         // Expect that write(2) fails (EPIPE)
86                         if (write(fd[1], "some data", 9) != -1) {
87                                 printf("write(2) unexpectedly succeeded\n");
88                                 return 0;
89                         }
90                         printf("did not receive SIGPIPE\n");
91                         return 0;
92                 }
93                 default:
94                         printf("Unknown test: %d\n", test);
95                         return 0;
96         }
97
98         printf("FAIL\n");
99         return 0;
100 }