// 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 (100) // 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; }