From f26e6eeba5d0e963bad156d7c070a99303a00b40 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Wed, 5 Jul 2017 21:57:16 +0200
Subject: priod: initialize properly
---
priod.c | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/priod.c b/priod.c
index 07d2de0..dcce2ff 100644
--- a/priod.c
+++ b/priod.c
@@ -319,6 +319,27 @@ on_exec (struct app_context *ctx, int pid)
str_free (&cmdline);
}
+static void
+preapply_rules (struct app_context *ctx)
+{
+ DIR *dir = opendir ("/proc");
+ if (!dir)
+ {
+ print_error ("opendir: %s: %s", "/proc", strerror (errno));
+ return;
+ }
+
+ // We don't care about processes deleted or created during this loop
+ struct dirent *iter;
+ while ((errno = 0, iter = readdir (dir)))
+ {
+ int pid = atoi (iter->d_name);
+ if (pid && (iter->d_type == DT_UNKNOWN || iter->d_type == DT_DIR))
+ on_exec (ctx, pid);
+ }
+ closedir (dir);
+}
+
static void
on_netlink_message (struct app_context *ctx, struct nlmsghdr *mh)
{
@@ -522,7 +543,11 @@ main (int argc, char *argv[])
ctx.proc_event.user_data = &ctx;
poller_fd_set (&ctx.proc_event, POLLIN);
- // TODO: iterate through current /proc processes and apply politics
+ // While new events are being queued, we can apply rules to already
+ // existing processes, so that we don't miss anything except for obvious
+ // cases when a process re-execs to something else after a match.
+ // It would inherit the same values anyway, so it seems to be mostly okay.
+ preapply_rules (&ctx);
ctx.polling = true;
while (ctx.polling)
--
cgit v1.2.3-70-g09d2