mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
75 lines
1.3 KiB
C
75 lines
1.3 KiB
C
![]() |
// 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 happned (ret == 0), exit code is 1 */
|
||
|
if (ret == 0)
|
||
|
return 1;
|
||
|
|
||
|
return 0;
|
||
|
}
|