// SPDX-License-Identifier: GPL-2.0 /* * Simple poll on a file. * * Copyright (c) 2024 Google LLC. */ #include #include #include #include #include #include #include #define BUFSIZE 4096 /* * Usage: * poll [-I|-P] [-t timeout] FILE */ int main(int argc, char *argv[]) { struct pollfd pfd = {.events = POLLIN}; char buf[BUFSIZE]; int timeout = -1; int ret, opt; while ((opt = getopt(argc, argv, "IPt:")) != -1) { switch (opt) { case 'I': pfd.events = POLLIN; break; case 'P': pfd.events = POLLPRI; break; case 't': timeout = atoi(optarg); break; default: fprintf(stderr, "Usage: %s [-I|-P] [-t timeout] FILE\n", argv[0]); return -1; } } if (optind >= argc) { fprintf(stderr, "Error: Polling file is not specified\n"); return -1; } pfd.fd = open(argv[optind], O_RDONLY); if (pfd.fd < 0) { fprintf(stderr, "failed to open %s", argv[optind]); perror("open"); return -1; } /* Reset poll by read if POLLIN is specified. */ if (pfd.events & POLLIN) do {} while (read(pfd.fd, buf, BUFSIZE) == BUFSIZE); ret = poll(&pfd, 1, timeout); if (ret < 0 && errno != EINTR) { perror("poll"); return -1; } close(pfd.fd); /* If timeout happned (ret == 0), exit code is 1 */ if (ret == 0) return 1; return 0; }