// reader1 - non-blocking FIFO reader example #include "yadda.h" int main(int argc, char *argv[]) { char buf[MSG_MAX + 1], *fname; int fd; ssize_t amount; if (argc != 2 || !argv[1] || !argv[1][0]) { fputs("Usage: reader1 fifo-name\n", stderr); exit(1); } fname = argv[1]; #ifdef __OpenBSD__ if (pledge("dpath stdio rpath unveil", NULL) == -1) err(1, "pledge"); if (unveil(fname, "crw") == -1) err(1, "unveil"); if (unveil(NULL, NULL) == -1) err(1, "unveil"); #endif if (mkfifo(fname, 0600) == -1 && errno != EEXIST) err(1, "mkfifo '%s'", fname); fd = open(fname, O_RDONLY | O_NDELAY); if (fd == -1) err(1, "open '%s'", fname); while (1) { if ((amount = read(fd, buf, MSG_MAX)) == -1) { if (errno != EAGAIN) warn("read"); } else if (amount > 0) { buf[amount] = '\0'; fprintf(stderr, "%ld %s\n", amount, buf); continue; } // KLUGE pretend to be doing other things sleep(10); } }