Monitor what is modifiying your files
Files | Log | Commits | Refs | README
Author: SM
Date: 2025-08-30
Subject: figured i could write this more clever - even removing code! great.
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();