brintos

brintos / linux-shallow public Read only

0
0
Text · 1.6 KiB · e11b431 Raw
88 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Wait until an inotify event on the given cgroup file.4 */5#include <linux/limits.h>6#include <sys/inotify.h>7#include <sys/mman.h>8#include <sys/ptrace.h>9#include <sys/stat.h>10#include <sys/types.h>11#include <errno.h>12#include <fcntl.h>13#include <poll.h>14#include <stdio.h>15#include <stdlib.h>16#include <string.h>17#include <unistd.h>18 19static const char usage[] = "Usage: %s [-v] <cgroup_file>\n";20static char *file;21static int verbose;22 23static inline void fail_message(char *msg)24{25	fprintf(stderr, msg, file);26	exit(1);27}28 29int main(int argc, char *argv[])30{31	char *cmd = argv[0];32	int c, fd;33	struct pollfd fds = { .events = POLLIN, };34 35	while ((c = getopt(argc, argv, "v")) != -1) {36		switch (c) {37		case 'v':38			verbose++;39			break;40		}41		argv++, argc--;42	}43 44	if (argc != 2) {45		fprintf(stderr, usage, cmd);46		return -1;47	}48	file = argv[1];49	fd = open(file, O_RDONLY);50	if (fd < 0)51		fail_message("Cgroup file %s not found!\n");52	close(fd);53 54	fd = inotify_init();55	if (fd < 0)56		fail_message("inotify_init() fails on %s!\n");57	if (inotify_add_watch(fd, file, IN_MODIFY) < 0)58		fail_message("inotify_add_watch() fails on %s!\n");59	fds.fd = fd;60 61	/*62	 * poll waiting loop63	 */64	for (;;) {65		int ret = poll(&fds, 1, 10000);66 67		if (ret < 0) {68			if (errno == EINTR)69				continue;70			perror("poll");71			exit(1);72		}73		if ((ret > 0) && (fds.revents & POLLIN))74			break;75	}76	if (verbose) {77		struct inotify_event events[10];78		long len;79 80		usleep(1000);81		len = read(fd, events, sizeof(events));82		printf("Number of events read = %ld\n",83			len/sizeof(struct inotify_event));84	}85	close(fd);86	return 0;87}88