]> Cypherpunks.ru repositories - gostls13.git/blob - misc/cgo/testcshared/testdata/main2.c
runtime: remove crash_cgo_test CgoRaceSignal timeout
[gostls13.git] / misc / cgo / testcshared / testdata / main2.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 #include <errno.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <time.h>
10 #include <unistd.h>
11
12 #define fd (30)
13
14 // Tests libgo2.so, which does not export any functions.
15 // Read a string from the file descriptor and print it.
16 int main(void) {
17   int i;
18   ssize_t n;
19   char buf[20];
20   struct timespec ts;
21
22   // The descriptor will be initialized in a thread, so we have to
23   // give a chance to get opened.
24   for (i = 0; i < 200; i++) {
25     n = read(fd, buf, sizeof buf);
26     if (n >= 0)
27       break;
28     if (errno != EBADF && errno != EINVAL) {
29       fprintf(stderr, "BUG: read: %s\n", strerror(errno));
30       return 2;
31     }
32
33     // An EBADF error means that the shared library has not opened the
34     // descriptor yet.
35     ts.tv_sec = 0;
36     ts.tv_nsec = 10000000;
37     nanosleep(&ts, NULL);
38   }
39
40   if (n < 0) {
41     fprintf(stderr, "BUG: failed to read any data from pipe\n");
42     return 2;
43   }
44
45   if (n == 0) {
46     fprintf(stderr, "BUG: unexpected EOF\n");
47     return 2;
48   }
49
50   if (n == sizeof buf) {
51     n--;
52   }
53   buf[n] = '\0';
54   printf("%s\n", buf);
55   return 0;
56 }