Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Simple poll on a file.
4 *
5 * Copyright (c) 2024 Google LLC.
6 */
7
8#include <errno.h>
9#include <fcntl.h>
10#include <poll.h>
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <unistd.h>
15
16#define BUFSIZE 4096
17
18/*
19 * Usage:
20 * poll [-I|-P] [-t timeout] FILE
21 */
22int main(int argc, char *argv[])
23{
24 struct pollfd pfd = {.events = POLLIN};
25 char buf[BUFSIZE];
26 int timeout = -1;
27 int ret, opt;
28
29 while ((opt = getopt(argc, argv, "IPt:")) != -1) {
30 switch (opt) {
31 case 'I':
32 pfd.events = POLLIN;
33 break;
34 case 'P':
35 pfd.events = POLLPRI;
36 break;
37 case 't':
38 timeout = atoi(optarg);
39 break;
40 default:
41 fprintf(stderr, "Usage: %s [-I|-P] [-t timeout] FILE\n",
42 argv[0]);
43 return -1;
44 }
45 }
46 if (optind >= argc) {
47 fprintf(stderr, "Error: Polling file is not specified\n");
48 return -1;
49 }
50
51 pfd.fd = open(argv[optind], O_RDONLY);
52 if (pfd.fd < 0) {
53 fprintf(stderr, "failed to open %s", argv[optind]);
54 perror("open");
55 return -1;
56 }
57
58 /* Reset poll by read if POLLIN is specified. */
59 if (pfd.events & POLLIN)
60 do {} while (read(pfd.fd, buf, BUFSIZE) == BUFSIZE);
61
62 ret = poll(&pfd, 1, timeout);
63 if (ret < 0 && errno != EINTR) {
64 perror("poll");
65 return -1;
66 }
67 close(pfd.fd);
68
69 /* If timeout happned (ret == 0), exit code is 1 */
70 if (ret == 0)
71 return 1;
72
73 return 0;
74}