57 |
|
#else |
58 |
|
#include <sys/proc.h> |
59 |
|
#endif |
60 |
+ |
#include <string.h> |
61 |
+ |
#include <paths.h> |
62 |
+ |
#include <fcntl.h> |
63 |
+ |
#include <limits.h> |
64 |
+ |
#include <kvm.h> |
65 |
|
#endif |
66 |
|
|
67 |
|
int get_proc_snapshot(proc_state_t **ps){ |
72 |
|
int mib[3]; |
73 |
|
size_t size; |
74 |
|
struct kinfo_proc *kp_stats; |
75 |
< |
int procs, i; |
75 |
> |
int procs, i, alloc; |
76 |
> |
static kvm_t *kvmd; |
77 |
> |
char **args; |
78 |
> |
char *proctitle; |
79 |
|
#endif |
80 |
|
#if defined(SOLARIS) || defined(LINUX) |
81 |
|
DIR *proc_dir; |
207 |
|
#endif |
208 |
|
|
209 |
|
#ifdef ALLBSD |
210 |
< |
mib[0] = CTL_KERN; |
203 |
< |
mib[1] = KERN_PROC; |
204 |
< |
mib[2] = KERN_PROC_ALL; |
210 |
> |
kvmd = kvm_openfiles(_PATH_DEVNULL, _PATH_DEVNULL, NULL, O_RDONLY, NULL); |
211 |
|
|
212 |
< |
if (sysctl(mib, 3, NULL, &size, NULL, 0) < 0) { |
207 |
< |
return NULL; |
208 |
< |
} |
212 |
> |
if(kvmd == NULL) return NULL; |
213 |
|
|
214 |
< |
procs = size / sizeof(struct kinfo_proc); |
214 |
> |
kp_stats = kvm_getprocs(kvmd, KERN_PROC_ALL, 0, &procs); |
215 |
|
|
216 |
< |
kp_stats = malloc(size); |
213 |
< |
if (kp_stats == NULL) { |
216 |
> |
if (kp_stats == NULL || procs < 0) { |
217 |
|
return NULL; |
218 |
|
} |
219 |
|
|
217 |
– |
if (sysctl(mib, 3, kp_stats, &size, NULL, 0) < 0) { |
218 |
– |
free(kp_stats); |
219 |
– |
return NULL; |
220 |
– |
} |
221 |
– |
|
220 |
|
for (i = 0; i < procs; i++) { |
221 |
+ |
/* replace with something more sensible */ |
222 |
|
proc_state = realloc(proc_state, (1+proc_state_size)*sizeof(proc_state_t)); |
223 |
+ |
if(proc_state == NULL ) { |
224 |
+ |
return NULL; |
225 |
+ |
} |
226 |
|
proc_state_ptr = proc_state+proc_state_size; |
227 |
|
|
228 |
|
proc_state_ptr->process_name = strdup(kp_stats[i].ki_comm); |
229 |
< |
/* Seems we don't have access to that bit of memory */ |
230 |
< |
/*proc_state_ptr->proctitle = strdup(kp_stats[i].ki_args->ar_args);*/ |
231 |
< |
proc_state_ptr->proctitle = NULL; |
229 |
> |
|
230 |
> |
args = kvm_getargv(kvmd, &(kp_stats[i]), 0); |
231 |
> |
if(args != NULL) { |
232 |
> |
alloc = 1; |
233 |
> |
proctitle = malloc(alloc); |
234 |
> |
if(proctitle == NULL) { |
235 |
> |
return NULL; |
236 |
> |
} |
237 |
> |
while(*args != NULL) { |
238 |
> |
if(strlen(proctitle) + strlen(*args) >= alloc) { |
239 |
> |
alloc = (alloc + strlen(*args)) << 1; |
240 |
> |
proctitle = realloc(proctitle, alloc); |
241 |
> |
if(proctitle == NULL) { |
242 |
> |
return NULL; |
243 |
> |
} |
244 |
> |
} |
245 |
> |
strncat(proctitle, *args, strlen(*args)); |
246 |
> |
strncat(proctitle, " ", 1); |
247 |
> |
args++; |
248 |
> |
} |
249 |
> |
/* remove trailing space */ |
250 |
> |
proctitle[strlen(proctitle)-1] = NULL; |
251 |
> |
proc_state_ptr->proctitle = proctitle; |
252 |
> |
} |
253 |
> |
else { |
254 |
> |
proc_state_ptr->proctitle = malloc(strlen(kp_stats[i].ki_comm)+4); |
255 |
> |
if(proc_state_ptr->proctitle == NULL) { |
256 |
> |
return NULL; |
257 |
> |
} |
258 |
> |
sprintf(proc_state_ptr->proctitle, " (%s)", kp_stats[i].ki_comm); |
259 |
> |
} |
260 |
|
|
261 |
|
proc_state_ptr->pid = kp_stats[i].ki_pid; |
262 |
|
proc_state_ptr->parent = kp_stats[i].ki_ppid; |