| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * Simple poll on a file. | |
| * | |
| * Copyright (c) 2024 Google LLC. | |
| */ | |
| #include <errno.h> | |
| #include <fcntl.h> | |
| #include <poll.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #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 happened (ret == 0), exit code is 1 */ | |
| if (ret == 0) | |
| return 1; | |
| return 0; | |
| } |