| 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; |