Home | History | Annotate | Download | only in testcshared
      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 (100)
     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 < 1000; 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 = 1000000;
     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 }
     57