filemon

Monitor what is modifiying your files

Files | Log | Commits | Refs | README


6672db4

Author: SM

Date: 2025-08-30

Subject: figured i could write this more clever - even removing code! great.

Diff

commit 6672db47acbb6de9573898e2918964c3669977b3
Author: SM <seb.michalk@gmail.com>
Date:   Sat Aug 30 20:24:11 2025 +0200

    figured i could write this more clever - even removing code! great.

diff --git a/main.c b/main.c
index 4f23a0c..727eac4 100644
--- a/main.c
+++ b/main.c
@@ -53,7 +53,6 @@ static int state = STATE_INIT;
 static int nlfd = -1;
 static int ifd = -1;
 static int efd = -1;
-static FILE *out = NULL;
 static Process procs[MAX_PROCS];
 static int nprocs = 0;
 static char dir[MAX_PATH];
@@ -97,7 +96,7 @@ die(const char *fmt, ...)
 static void
 usage(void)
 {
-	die("usage: who [-o output] directory\n");
+	die("usage: who directory\n");
 }
 
 static void
@@ -203,39 +202,25 @@ handleproc(void)
 static Process *
 findproc(pid_t pid)
 {
-	int i;
+	Process *p = procs;
 
-	for (i = 0; i < nprocs; i++) {
-		if (procs[i].active && procs[i].pid == pid)
-			return &procs[i];
-	}
-	return NULL;
+	for (; p < procs + MAX_PROCS && (p->pid != pid || !p->active); ++p);
+	return p < procs + MAX_PROCS ? p : NULL;
 }
 
 static void
 addproc(pid_t pid, pid_t ppid, const char *comm)
 {
-	Process *proc;
-	int i;
-
-	proc = findproc(pid);
+	Process *proc = findproc(pid);
+	
 	if (!proc) {
-		for (i = 0; i < MAX_PROCS; i++) {
-			if (!procs[i].active) {
-				proc = &procs[i];
-				nprocs++;
-				break;
-			}
-		}
+		for (proc = procs; proc < procs + MAX_PROCS && proc->active; ++proc);
+		if (proc >= procs + MAX_PROCS)
+			return;
+		nprocs++;
 	}
 
-	if (!proc)
-		return;
-
-	proc->pid = pid;
-	proc->ppid = ppid;
-	proc->active = 1;
-	proc->start = time(NULL);
+	*proc = (Process){pid, ppid, 0, 0, "", "", time(NULL), 1};
 	strncpy(proc->comm, comm, sizeof(proc->comm) - 1);
 	proc->comm[sizeof(proc->comm) - 1] = '\0';
 
@@ -245,13 +230,9 @@ addproc(pid_t pid, pid_t ppid, const char *comm)
 static void
 rmproc(pid_t pid)
 {
-	Process *proc;
-
-	proc = findproc(pid);
-	if (proc) {
-		proc->active = 0;
-		nprocs--;
-	}
+	Process *proc = findproc(pid);
+	
+	(proc && (proc->active = 0, nprocs--, 0));
 }
 
 static int
@@ -298,8 +279,8 @@ addwatch(int fd, const char *path)
 		return -1;
 
 	while ((entry = readdir(dir)) != NULL) {
-		if (strcmp(entry->d_name, ".") == 0 ||
-		    strcmp(entry->d_name, "..") == 0)
+		if (entry->d_name[0] == '.' && (!entry->d_name[1] || 
+		    (entry->d_name[1] == '.' && !entry->d_name[2])))
 			continue;
 
 		if (snprintf(fullpath, sizeof(fullpath), "%s/%s",
@@ -400,18 +381,13 @@ correlate(const char *path, time_t ts)
 {
 	Process *best, *proc;
 	time_t bestdiff, diff;
-	int i;
 
 	best = NULL;
 	bestdiff = LONG_MAX;
 
-	for (i = 0; i < MAX_PROCS; i++) {
-		proc = &procs[i];
-
-		if (!proc->active || proc->start > ts)
-			continue;
-
-		if (proc->pid < 100 || ts - proc->start > 86400 || 
+	for (proc = procs; proc < procs + MAX_PROCS; ++proc) {
+		if (!proc->active || proc->start > ts ||
+		    proc->pid < 100 || ts - proc->start > 86400 || 
 		    strstr(proc->comm, "kworker") || strstr(proc->comm, "ksoftirqd") ||
 		    strstr(proc->comm, "migration") || proc->comm[0] == '[')
 			continue;
@@ -463,24 +439,21 @@ logchange(const char *path, Process *proc, uint32_t mask)
 	strftime(ts, sizeof(ts), "%Y-%m-%d %H:%M:%S", tm);
 
 	if (proc) {
-		fprintf(out, "%s %s %s pid=%d user=%s gid=%d comm=%s cwd=%s\n",
-		        ts, maskstr(mask), path,
-		        proc->pid, uidname(proc->uid), proc->gid, proc->comm, proc->cwd);
+		printf("%s %s %s pid=%d user=%s gid=%d comm=%s cwd=%s\n",
+		       ts, maskstr(mask), path,
+		       proc->pid, uidname(proc->uid), proc->gid, proc->comm, proc->cwd);
 	} else {
-		fprintf(out, "%s %s %s pid=? user=? gid=? comm=? cwd=?\n",
-		        ts, maskstr(mask), path);
+		printf("%s %s %s pid=? user=? gid=? comm=? cwd=?\n",
+		       ts, maskstr(mask), path);
 	}
 
-	fflush(out);
+	fflush(stdout);
 }
 
 static void
 cleanup(void)
 {
-	if (out) {
-		fprintf(out, "# Who - shutdown\n");
-		fclose(out);
-	}
+	printf("# Who - shutdown\n");
 	if (nlfd != -1)
 		close(nlfd);
 	if (ifd != -1)
@@ -501,50 +474,33 @@ scanprocs(void)
 	if (!proc_dir)
 		return;
 
-	while ((entry = readdir(proc_dir)) != NULL) {
+	while ((entry = readdir(proc_dir))) {
 		pid = strtol(entry->d_name, &endptr, 10);
-		if (*endptr != '\0' || pid <= 0)
-			continue;
-
-		addproc(pid, 0, "existing");
+		if (!(*endptr || pid <= 0))
+			addproc(pid, 0, "existing");
 	}
 
 	closedir(proc_dir);
 }
 
 int
-main(int argc, char *argv[])
+main(int argc, char **argv)
 {
-	const char *outpath;
-	int opt, nfds;
+	(void)argc;
+	int nfds;
 	struct epoll_event events[MAX_EVENTS];
 
-	outpath = "who.log";
-
-	while ((opt = getopt(argc, argv, "o:")) != -1) {
-		switch (opt) {
-		case 'o':
-			outpath = optarg;
-			break;
-		default:
-			usage();
-		}
-	}
-
-	if (optind >= argc)
+	if (!*++argv)
 		usage();
 
-	if (strlen(argv[optind]) >= MAX_PATH)
+	if (strlen(*argv) >= MAX_PATH)
 		die("directory path too long");
 
-	strcpy(dir, argv[optind]);
+	strcpy(dir, *argv);
 
 	signal(SIGINT, sighandler);
 	signal(SIGTERM, sighandler);
 
-	out = fopen(outpath, "w");
-	if (!out)
-		die("fopen %s:", outpath);
 
 	efd = epoll_create1(EPOLL_CLOEXEC);
 	if (efd < 0)
@@ -556,12 +512,11 @@ main(int argc, char *argv[])
 	uidinit();
 	scanprocs();
 
-	state = STATE_MONITORING;
-	fprintf(out, "# Who - started monitoring %s\n", dir);
-	fprintf(out, "# Active processes: %d\n", nprocs);
-	fflush(out);
+	printf("who - started monitoring %s\n", dir);
+	printf("active processes: %d\n", nprocs);
+	fflush(stdout);
 
-	while (state == STATE_MONITORING) {
+  for (;;) {
 		nfds = epoll_wait(efd, events, MAX_EVENTS, -1);
 		if (nfds < 0) {
 			if (errno == EINTR)
@@ -569,13 +524,8 @@ main(int argc, char *argv[])
 			die("epoll_wait:");
 		}
 
-		for (int i = 0; i < nfds; i++) {
-			if (events[i].data.fd == nlfd) {
-				handleproc();
-			} else if (events[i].data.fd == ifd) {
-				handlefile();
-			}
-		}
+		for (struct epoll_event *ev = events; ev < events + nfds; ++ev)
+			(ev->data.fd == nlfd) ? handleproc() : handlefile();
 	}
 
 	cleanup();