diff options
Diffstat (limited to 'src/process_iterator.c')
-rw-r--r-- | src/process_iterator.c | 70 |
1 files changed, 60 insertions, 10 deletions
diff --git a/src/process_iterator.c b/src/process_iterator.c index eb34d62..ff13035 100644 --- a/src/process_iterator.c +++ b/src/process_iterator.c @@ -108,7 +108,7 @@ static int is_child_of(pid_t child_pid, pid_t parent_pid) return ppid == parent_pid; } -int read_next_process(struct process_iterator *it, struct process *p) +int get_next_process(struct process_iterator *it, struct process *p) { if (it->dip == NULL) { @@ -181,17 +181,67 @@ int init_process_iterator(struct process_iterator *it, struct process_filter *fi return 0; } -int read_next_process(struct process_iterator *it, struct process *p) { - if (it->i == it->count) return -1; - p->pid = it->procs[it->i].ki_pid; - p->ppid = it->procs[it->i].ki_ppid; - p->cputime = it->procs[it->i].ki_runtime / 1000; - p->starttime = it->procs[it->i].ki_start.tv_sec; - it->i++; - if (it->i == it->count) return -1; +static void kproc2proc(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; +} + +static int get_single_process(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)); + return -1; + } + kproc2proc(kproc, process); return 0; } +int get_next_process(struct process_iterator *it, struct process *p) { + if (it->i == it->count) + { + return -1; + } + if (it->filter->pid > 0 && !it->filter->include_children) + { + get_single_process(it->filter->pid, p); + it->i = it->count = 1; + return 0; + } + while (it->i < it->count) + { + if (it->filter->pid > 0 && it->filter->include_children) + { + kproc2proc(&(it->procs[it->i]), p); + it->i++; + if (p->pid != it->filter->pid && p->ppid != it->filter->pid) + continue; + return 0; + } + else if (it->filter->pid == 0) + { + kproc2proc(&(it->procs[it->i]), p); + it->i++; + return 0; + } + } + return -1; +} + int close_process_iterator(struct process_iterator *it) { return 0; } @@ -202,7 +252,7 @@ int init_process_iterator(struct process_iterator *it) { return 0; } -int read_next_process(struct process_iterator *it, struct process *p) { +int get_next_process(struct process_iterator *it, struct process *p) { return -1; } |