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