88 lines
1.6 KiB
C
88 lines
1.6 KiB
C
|
// 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;
|
||
|
}
|