diff options
| author | Přemysl Janouch <p.janouch@gmail.com> | 2017-07-05 21:57:16 +0200 | 
|---|---|---|
| committer | Přemysl Janouch <p.janouch@gmail.com> | 2017-07-05 22:05:07 +0200 | 
| commit | f26e6eeba5d0e963bad156d7c070a99303a00b40 (patch) | |
| tree | 590be34a4d964d0e141f63dd1d65a0679f4d2403 | |
| parent | 1fa6f95135cfec036d7f3104816ff2c00208f54c (diff) | |
| download | desktop-tools-f26e6eeba5d0e963bad156d7c070a99303a00b40.tar.gz desktop-tools-f26e6eeba5d0e963bad156d7c070a99303a00b40.tar.xz desktop-tools-f26e6eeba5d0e963bad156d7c070a99303a00b40.zip | |
priod: initialize properly
| -rw-r--r-- | priod.c | 27 | 
1 files changed, 26 insertions, 1 deletions
| @@ -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) | 
