aboutsummaryrefslogtreecommitdiffstats
path: root/src/process_iterator_freebsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/process_iterator_freebsd.c')
-rw-r--r--src/process_iterator_freebsd.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/src/process_iterator_freebsd.c b/src/process_iterator_freebsd.c
index e840968..eb6cfaa 100644
--- a/src/process_iterator_freebsd.c
+++ b/src/process_iterator_freebsd.c
@@ -4,55 +4,46 @@
#include <paths.h>
int init_process_iterator(struct process_iterator *it, struct process_filter *filter) {
- kvm_t *kd;
char errbuf[_POSIX2_LINE_MAX];
it->i = 0;
/* Open the kvm interface, get a descriptor */
- if ((kd = kvm_openfiles(NULL, _PATH_DEVNULL, NULL, O_RDONLY, errbuf)) == NULL) {
- /* fprintf(stderr, "kvm_open: %s\n", errbuf); */
- fprintf(stderr, "kvm_open: %s", errbuf);
+ if ((it->kd = kvm_openfiles(NULL, _PATH_DEVNULL, NULL, O_RDONLY, errbuf)) == NULL) {
+ fprintf(stderr, "kvm_open: %s\n", errbuf);
return -1;
}
/* Get the list of processes. */
- if ((it->procs = kvm_getprocs(kd, KERN_PROC_PROC, 0, &it->count)) == NULL) {
- kvm_close(kd);
- /* fprintf(stderr, "kvm_getprocs: %s\n", kvm_geterr(kd)); */
- fprintf(stderr, "kvm_getprocs: %s", kvm_geterr(kd));
+ if ((it->procs = kvm_getprocs(it->kd, KERN_PROC_PROC, 0, &it->count)) == NULL) {
+ kvm_close(it->kd);
+ fprintf(stderr, "kvm_getprocs: %s\n", kvm_geterr(it->kd));
return -1;
}
- kvm_close(kd);
it->filter = filter;
return 0;
}
-static void kproc2proc(struct kinfo_proc *kproc, struct process *proc)
+static void kproc2proc(kvm_t *kd, struct kinfo_proc *kproc, struct process *proc)
{
proc->pid = kproc->ki_pid;
proc->ppid = kproc->ki_ppid;
proc->cputime = kproc->ki_runtime / 1000;
proc->starttime = kproc->ki_start.tv_sec;
- memcpy(proc->command, kproc->ki_comm, strlen(kproc->ki_comm));
+ char **args = kvm_getargv(kd, kproc, sizeof(proc->command));
+ if (args != NULL)
+ {
+ memcpy(proc->command, args[0], strlen(args[0]) + 1);
+ }
}
-static int get_single_process(pid_t pid, struct process *process)
+static int get_single_process(kvm_t *kd, pid_t pid, struct process *process)
{
- kvm_t *kd;
int count;
- char errbuf[_POSIX2_LINE_MAX];
- /* Open the kvm interface, get a descriptor */
- if ((kd = kvm_openfiles(NULL, _PATH_DEVNULL, NULL, O_RDONLY, errbuf)) == NULL) {
- /* fprintf(stderr, "kvm_open: %s\n", errbuf); */
- fprintf(stderr, "kvm_open: %s", errbuf);
- return -1;
- }
struct kinfo_proc *kproc = kvm_getprocs(kd, KERN_PROC_PID, pid, &count);
- kvm_close(kd);
if (count == 0 || kproc == NULL)
{
- fprintf(stderr, "kvm_getprocs: %s", kvm_geterr(kd));
+ fprintf(stderr, "kvm_getprocs: %s\n", kvm_geterr(kd));
return -1;
}
- kproc2proc(kproc, process);
+ kproc2proc(kd, kproc, process);
return 0;
}
@@ -63,15 +54,22 @@ int get_next_process(struct process_iterator *it, struct process *p) {
}
if (it->filter->pid > 0 && !it->filter->include_children)
{
- get_single_process(it->filter->pid, p);
+ get_single_process(it->kd, it->filter->pid, p);
it->i = it->count = 1;
return 0;
}
while (it->i < it->count)
{
+ struct kinfo_proc *kproc = &(it->procs[it->i]);
+ if (kproc->ki_flag & P_SYSTEM)
+ {
+ // skip system processes
+ it->i++;
+ continue;
+ }
if (it->filter->pid > 0 && it->filter->include_children)
{
- kproc2proc(&(it->procs[it->i]), p);
+ kproc2proc(it->kd, kproc, p);
it->i++;
if (p->pid != it->filter->pid && p->ppid != it->filter->pid)
continue;
@@ -79,7 +77,7 @@ int get_next_process(struct process_iterator *it, struct process *p) {
}
else if (it->filter->pid == 0)
{
- kproc2proc(&(it->procs[it->i]), p);
+ kproc2proc(it->kd, kproc, p);
it->i++;
return 0;
}
@@ -88,6 +86,10 @@ int get_next_process(struct process_iterator *it, struct process *p) {
}
int close_process_iterator(struct process_iterator *it) {
+ if (kvm_close(it->kd) == -1) {
+ fprintf(stderr, "kvm_getprocs: %s\n", kvm_geterr(it->kd));
+ return -1;
+ }
return 0;
}
Un proyecto texto-plano.xyz