diff options
Diffstat (limited to 'src/process_iterator_freebsd.c')
-rw-r--r-- | src/process_iterator_freebsd.c | 54 |
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; } |