123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Wait until an inotify event on the given cgroup file.
- */
- #include <linux/limits.h>
- #include <sys/inotify.h>
- #include <sys/mman.h>
- #include <sys/ptrace.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <poll.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- static const char usage[] = "Usage: %s [-v] <cgroup_file>\n";
- static char *file;
- static int verbose;
- static inline void fail_message(char *msg)
- {
- fprintf(stderr, msg, file);
- exit(1);
- }
- int main(int argc, char *argv[])
- {
- char *cmd = argv[0];
- int c, fd;
- struct pollfd fds = { .events = POLLIN, };
- while ((c = getopt(argc, argv, "v")) != -1) {
- switch (c) {
- case 'v':
- verbose++;
- break;
- }
- argv++, argc--;
- }
- if (argc != 2) {
- fprintf(stderr, usage, cmd);
- return -1;
- }
- file = argv[1];
- fd = open(file, O_RDONLY);
- if (fd < 0)
- fail_message("Cgroup file %s not found!\n");
- close(fd);
- fd = inotify_init();
- if (fd < 0)
- fail_message("inotify_init() fails on %s!\n");
- if (inotify_add_watch(fd, file, IN_MODIFY) < 0)
- fail_message("inotify_add_watch() fails on %s!\n");
- fds.fd = fd;
- /*
- * poll waiting loop
- */
- for (;;) {
- int ret = poll(&fds, 1, 10000);
- if (ret < 0) {
- if (errno == EINTR)
- continue;
- perror("poll");
- exit(1);
- }
- if ((ret > 0) && (fds.revents & POLLIN))
- break;
- }
- if (verbose) {
- struct inotify_event events[10];
- long len;
- usleep(1000);
- len = read(fd, events, sizeof(events));
- printf("Number of events read = %ld\n",
- len/sizeof(struct inotify_event));
- }
- close(fd);
- return 0;
- }
|