68 |
|
#include <tools.h> |
69 |
|
#endif |
70 |
|
#include <unistd.h> |
71 |
+ |
#ifdef NETBSD2 |
72 |
+ |
#include <sys/lwp.h> |
73 |
|
#endif |
74 |
+ |
#endif |
75 |
|
|
76 |
|
static void proc_state_init(sg_process_stats *s) { |
77 |
|
s->process_name = NULL; |
102 |
|
long buflen; |
103 |
|
char *p; |
104 |
|
#endif |
105 |
+ |
#ifdef NETBSD2 |
106 |
+ |
int lwps; |
107 |
+ |
struct kinfo_lwp *kl_stats; |
108 |
|
#endif |
109 |
+ |
#endif |
110 |
|
#if defined(SOLARIS) || defined(LINUX) |
111 |
|
DIR *proc_dir; |
112 |
|
struct dirent *dir_entry; |
285 |
|
for (i = 0; i < procs; i++) { |
286 |
|
const char *name; |
287 |
|
|
288 |
+ |
#ifdef FREEBSD5 |
289 |
|
if (kp_stats[i].ki_stat == 0) { |
290 |
+ |
#else |
291 |
+ |
if (kp_stats[i].kp_proc.p_stat == 0) { |
292 |
+ |
#endif |
293 |
|
/* FreeBSD 5 deliberately overallocates the array that |
294 |
|
* the sysctl returns, so we'll get a few junk |
295 |
|
* processes on the end that we have to ignore. (Search |
464 |
|
proc_state_ptr->nice = kp_stats[i].kp_proc.p_nice; |
465 |
|
#endif |
466 |
|
|
467 |
+ |
#ifdef NETBSD2 |
468 |
+ |
{ |
469 |
+ |
size_t size; |
470 |
+ |
int mib[5]; |
471 |
+ |
|
472 |
+ |
mib[0] = CTL_KERN; |
473 |
+ |
mib[1] = KERN_LWP; |
474 |
+ |
mib[2] = kp_stats[i].kp_proc.p_pid; |
475 |
+ |
mib[3] = sizeof(struct kinfo_lwp); |
476 |
+ |
mib[4] = 0; |
477 |
+ |
|
478 |
+ |
if(sysctl(mib, 5, NULL, &size, NULL, 0) < 0) { |
479 |
+ |
return NULL; |
480 |
+ |
} |
481 |
+ |
|
482 |
+ |
lwps = size / sizeof(struct kinfo_lwp); |
483 |
+ |
mib[4] = lwps; |
484 |
+ |
|
485 |
+ |
kl_stats = malloc(size); |
486 |
+ |
if(kl_stats == NULL) { |
487 |
+ |
return NULL; |
488 |
+ |
} |
489 |
+ |
|
490 |
+ |
if(sysctl(mib, 5, kl_stats, &size, NULL, 0) < 0) { |
491 |
+ |
return NULL; |
492 |
+ |
} |
493 |
+ |
} |
494 |
+ |
|
495 |
+ |
switch(kp_stats[i].kp_proc.p_stat) { |
496 |
+ |
case SIDL: |
497 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_RUNNING; |
498 |
+ |
break; |
499 |
+ |
case SACTIVE: |
500 |
+ |
{ |
501 |
+ |
int i; |
502 |
+ |
|
503 |
+ |
for(i = 0; i < lwps; i++) { |
504 |
+ |
switch(kl_stats[i].l_stat) { |
505 |
+ |
case LSONPROC: |
506 |
+ |
case LSRUN: |
507 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_RUNNING; |
508 |
+ |
goto end; |
509 |
+ |
case LSSLEEP: |
510 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_SLEEPING; |
511 |
+ |
goto end; |
512 |
+ |
case LSSTOP: |
513 |
+ |
case LSSUSPENDED: |
514 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_STOPPED; |
515 |
+ |
goto end; |
516 |
+ |
} |
517 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN; |
518 |
+ |
} |
519 |
+ |
end: ; |
520 |
+ |
} |
521 |
+ |
break; |
522 |
+ |
case SSTOP: |
523 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_STOPPED; |
524 |
+ |
break; |
525 |
+ |
case SZOMB: |
526 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_ZOMBIE; |
527 |
+ |
break; |
528 |
+ |
default: |
529 |
+ |
proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN; |
530 |
+ |
break; |
531 |
+ |
} |
532 |
+ |
#else |
533 |
|
#ifdef FREEBSD5 |
534 |
|
switch (kp_stats[i].ki_stat) { |
535 |
|
#else |
564 |
|
proc_state_ptr->state = SG_PROCESS_STATE_UNKNOWN; |
565 |
|
break; |
566 |
|
} |
567 |
+ |
#endif |
568 |
|
proc_state_size++; |
569 |
|
} |
570 |
|
|