69 |
|
proc_state_t *proc_state_ptr; |
70 |
|
int proc_state_size = 0; |
71 |
|
#ifdef ALLBSD |
72 |
< |
int mib[3]; |
72 |
> |
int mib[4]; |
73 |
|
size_t size; |
74 |
|
struct kinfo_proc *kp_stats; |
75 |
|
int procs, i, alloc; |
76 |
+ |
char *proctitle; |
77 |
+ |
#if defined(FREEBSD5) || defined(NETBSD) || defined(OPENBSD) |
78 |
+ |
long buflen; |
79 |
+ |
char *p; |
80 |
+ |
int argc; |
81 |
+ |
int j = 0; |
82 |
+ |
#else |
83 |
|
static kvm_t *kvmd; |
84 |
|
char **args; |
78 |
– |
char *proctitle; |
85 |
|
#endif |
86 |
+ |
#endif |
87 |
|
#if defined(SOLARIS) || defined(LINUX) |
88 |
|
DIR *proc_dir; |
89 |
|
struct dirent *dir_entry; |
234 |
|
return NULL; |
235 |
|
} |
236 |
|
|
237 |
< |
#if defined(NETBSD) || defined(OPENBSD) |
231 |
< |
kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL); |
232 |
< |
#else |
237 |
> |
#if (defined(FREEBSD) && !defined(FREEBSD5)) || defined(DFBSD) |
238 |
|
kvmd = kvm_openfiles(_PATH_DEVNULL, _PATH_DEVNULL, NULL, O_RDONLY, NULL); |
239 |
|
#endif |
240 |
|
|
258 |
|
strdup(kp_stats[i].kp_proc.p_comm); |
259 |
|
#endif |
260 |
|
|
261 |
< |
args = kvm_getargv(kvmd, &(kp_stats[i]), 0); |
262 |
< |
if(args != NULL) { |
263 |
< |
alloc = 1; |
264 |
< |
proctitle = malloc(alloc); |
265 |
< |
if(proctitle == NULL) { |
261 |
> |
#if defined(FREEBSD5) || defined(NETBSD) || defined(OPENBSD) |
262 |
> |
size = sizeof(buflen); |
263 |
> |
|
264 |
> |
#ifdef FREEBSD5 |
265 |
> |
if(sysctlbyname("kern.ps_arg_cache_limit", &buflen, &size, NULL, 0) < 0) { |
266 |
> |
return NULL; |
267 |
> |
} |
268 |
> |
#else |
269 |
> |
mib[1] = KERN_ARGMAX; |
270 |
> |
|
271 |
> |
if(sysctl(mib, 2, &buflen, &size, NULL, 0) < 0) { |
272 |
> |
return NULL; |
273 |
> |
} |
274 |
> |
#endif |
275 |
> |
|
276 |
> |
proctitle = malloc(buflen); |
277 |
> |
if(proctitle == NULL) { |
278 |
> |
return NULL; |
279 |
> |
} |
280 |
> |
|
281 |
> |
size = buflen; |
282 |
> |
|
283 |
> |
#ifdef FREEBSD5 |
284 |
> |
mib[2] = KERN_PROC_ARGS; |
285 |
> |
mib[3] = kp_stats[i].ki_pid; |
286 |
> |
#else |
287 |
> |
mib[1] = KERN_PROC_ARGS; |
288 |
> |
mib[2] = kp_stats[i].kp_proc.p_pid; |
289 |
> |
mib[3] = KERN_PROC_ARGV; |
290 |
> |
#endif |
291 |
> |
|
292 |
> |
if(sysctl(mib, 4, proctitle, &size, NULL, 0) < 0) { |
293 |
> |
free(proctitle); |
294 |
> |
proc_state_ptr->proctitle = NULL; |
295 |
> |
} |
296 |
> |
else if(size > 0) { |
297 |
> |
proc_state_ptr->proctitle = malloc(size); |
298 |
> |
if(proc_state_ptr->proctitle == NULL) { |
299 |
|
return NULL; |
300 |
|
} |
301 |
< |
while(*args != NULL) { |
302 |
< |
if(strlen(proctitle) + strlen(*args) >= alloc) { |
303 |
< |
alloc = (alloc + strlen(*args)) << 1; |
304 |
< |
proctitle = realloc(proctitle, alloc); |
305 |
< |
if(proctitle == NULL) { |
306 |
< |
return NULL; |
301 |
> |
p = proctitle; |
302 |
> |
proc_state_ptr->proctitle[0] = NULL; |
303 |
> |
do { |
304 |
> |
strncat(proc_state_ptr->proctitle, p, strlen(p)); |
305 |
> |
strncat(proc_state_ptr->proctitle, " ", 1); |
306 |
> |
p += strlen(p) + 1; |
307 |
> |
} while (p < proctitle + size); |
308 |
> |
free(proctitle); |
309 |
> |
proc_state_ptr->proctitle[strlen(proc_state_ptr->proctitle)-1] = NULL; |
310 |
> |
} |
311 |
> |
else { |
312 |
> |
free(proctitle); |
313 |
> |
proc_state_ptr->proctitle = NULL; |
314 |
> |
} |
315 |
> |
#else |
316 |
> |
if(kvmd != NULL) { |
317 |
> |
args = kvm_getargv(kvmd, &(kp_stats[i]), 0); |
318 |
> |
if(args != NULL) { |
319 |
> |
alloc = 1; |
320 |
> |
proctitle = malloc(alloc); |
321 |
> |
if(proctitle == NULL) { |
322 |
> |
return NULL; |
323 |
> |
} |
324 |
> |
while(*args != NULL) { |
325 |
> |
if(strlen(proctitle) + strlen(*args) >= alloc) { |
326 |
> |
alloc = (alloc + strlen(*args)) << 1; |
327 |
> |
proctitle = realloc(proctitle, alloc); |
328 |
> |
if(proctitle == NULL) { |
329 |
> |
return NULL; |
330 |
> |
} |
331 |
|
} |
332 |
+ |
strncat(proctitle, *args, strlen(*args)); |
333 |
+ |
strncat(proctitle, " ", 1); |
334 |
+ |
args++; |
335 |
|
} |
336 |
< |
strncat(proctitle, *args, strlen(*args)); |
337 |
< |
strncat(proctitle, " ", 1); |
338 |
< |
args++; |
336 |
> |
/* remove trailing space */ |
337 |
> |
proctitle[strlen(proctitle)-1] = NULL; |
338 |
> |
proc_state_ptr->proctitle = proctitle; |
339 |
|
} |
340 |
< |
/* remove trailing space */ |
341 |
< |
proctitle[strlen(proctitle)-1] = NULL; |
342 |
< |
proc_state_ptr->proctitle = proctitle; |
340 |
> |
else { |
341 |
> |
proc_state_ptr->proctitle = NULL; |
342 |
> |
} |
343 |
|
} |
344 |
|
else { |
345 |
< |
/* Should probably be returning NULL here */ |
281 |
< |
proc_state_ptr->proctitle = |
282 |
< |
malloc(strlen(proc_state_ptr->process_name)+4); |
283 |
< |
if(proc_state_ptr->proctitle == NULL) { |
284 |
< |
return NULL; |
285 |
< |
} |
286 |
< |
sprintf(proc_state_ptr->proctitle, " (%s)", |
287 |
< |
proc_state_ptr->process_name); |
345 |
> |
proc_state_ptr->proctitle = NULL; |
346 |
|
} |
347 |
+ |
#endif |
348 |
|
|
349 |
|
#ifdef FREEBSD5 |
350 |
|
proc_state_ptr->pid = kp_stats[i].ki_pid; |