aboutsummaryrefslogtreecommitdiff
path: root/priod.c
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2017-07-05 21:57:16 +0200
committerPřemysl Janouch <p.janouch@gmail.com>2017-07-05 22:05:07 +0200
commitf26e6eeba5d0e963bad156d7c070a99303a00b40 (patch)
tree590be34a4d964d0e141f63dd1d65a0679f4d2403 /priod.c
parent1fa6f95135cfec036d7f3104816ff2c00208f54c (diff)
downloaddesktop-tools-f26e6eeba5d0e963bad156d7c070a99303a00b40.tar.gz
desktop-tools-f26e6eeba5d0e963bad156d7c070a99303a00b40.tar.xz
desktop-tools-f26e6eeba5d0e963bad156d7c070a99303a00b40.zip
priod: initialize properly
Diffstat (limited to 'priod.c')
-rw-r--r--priod.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/priod.c b/priod.c
index 07d2de0..dcce2ff 100644
--- a/priod.c
+++ b/priod.c
@@ -320,6 +320,27 @@ on_exec (struct app_context *ctx, int pid)
}
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)
{
// In practice the kernel connector never sends multipart messages
@@ -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)