• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
main(int argc,char ** argv)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 	Noop();
33 
34 	switch (test) {
35 		case 1: {
36 			if (verbose) {
37 				printf("attempting segfault\n");
38 			}
39 
40 			*nilp = 0;
41 			break;
42 		}
43 
44 		case 2: {
45 			struct timeval tv;
46 
47 			if (verbose) {
48 				printf("attempting external signal test\n");
49 			}
50 
51 			fprintf(stderr, "OK\n");
52 			fflush(stderr);
53 
54 			// The program should be interrupted before
55 			// this sleep finishes. We use select rather
56 			// than sleep because in older versions of
57 			// glibc the sleep function does some signal
58 			// fiddling to handle SIGCHLD.  If this
59 			// program is fiddling signals just when the
60 			// test program sends the signal, the signal
61 			// may be delivered to a Go thread which will
62 			// break this test.
63 			tv.tv_sec = 60;
64 			tv.tv_usec = 0;
65 			select(0, NULL, NULL, NULL, &tv);
66 
67 			break;
68 		}
69 		case 3: {
70 			if (verbose) {
71 				printf("attempting SIGPIPE\n");
72 			}
73 
74 			int fd[2];
75 			if (pipe(fd) != 0) {
76 				printf("pipe(2) failed\n");
77 				return 0;
78 			}
79 			// Close the reading end.
80 			close(fd[0]);
81 			// Expect that write(2) fails (EPIPE)
82 			if (write(fd[1], "some data", 9) != -1) {
83 				printf("write(2) unexpectedly succeeded\n");
84 				return 0;
85 			}
86 			printf("did not receive SIGPIPE\n");
87 			return 0;
88 		}
89 		case 4: {
90 			fprintf(stderr, "OK\n");
91 			fflush(stderr);
92 
93 			if (verbose) {
94 				printf("calling Block\n");
95 			}
96 			Block();
97 		}
98 		default:
99 			printf("Unknown test: %d\n", test);
100 			return 0;
101 	}
102 
103 	printf("FAIL\n");
104 	return 0;
105 }
106