| // Copyright 2015 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| #include <errno.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <time.h> |
| #include <unistd.h> |
| |
| #define fd (30) |
| |
| // Tests libgo2.so, which does not export any functions. |
| // Read a string from the file descriptor and print it. |
| int main(void) { |
| int i; |
| ssize_t n; |
| char buf[20]; |
| struct timespec ts; |
| |
| // The descriptor will be initialized in a thread, so we have to |
| // give a chance to get opened. |
| for (i = 0; i < 1000; i++) { |
| n = read(fd, buf, sizeof buf); |
| if (n >= 0) |
| break; |
| if (errno != EBADF && errno != EINVAL) { |
| fprintf(stderr, "BUG: read: %s\n", strerror(errno)); |
| return 2; |
| } |
| |
| // An EBADF error means that the shared library has not opened the |
| // descriptor yet. |
| ts.tv_sec = 0; |
| ts.tv_nsec = 1000000; |
| nanosleep(&ts, NULL); |
| } |
| |
| if (n < 0) { |
| fprintf(stderr, "BUG: failed to read any data from pipe\n"); |
| return 2; |
| } |
| |
| if (n == 0) { |
| fprintf(stderr, "BUG: unexpected EOF\n"); |
| return 2; |
| } |
| |
| if (n == sizeof buf) { |
| n--; |
| } |
| buf[n] = '\0'; |
| printf("%s\n", buf); |
| return 0; |
| } |