+/* #endif KERNEL_LINUX */
+
+#elif HAVE_LIBKVM
+ int running = 0;
+ int sleeping = 0;
+ int zombies = 0;
+ int stopped = 0;
+ int blocked = 0;
+ int idle = 0;
+ int wait = 0;
+
+ kvm_t *kd;
+ char errbuf[1024];
+ char cmdline[ARG_MAX];
+ struct kinfo_proc *procs; /* array of processes */
+ char ** argv;
+ int count; /* returns number of processes */
+ int i, j;
+
+ procstat_t *ps_ptr;
+ procstat_entry_t pse;
+
+ ps_list_reset ();
+
+ /* Open the kvm interface, get a descriptor */
+ if ((kd = kvm_open(NULL, NULL, NULL, 0, errbuf)) == NULL) {
+ ERROR ("Cannot open kvm interface: %s", errbuf);
+ return (0);
+ }
+
+ /* Get the list of processes. */
+ if ((procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, &count)) == NULL) {
+ kvm_close(kd);
+ ERROR ("Cannot get kvm processes list: %s", kvm_geterr(kd));
+ return (0);
+ }
+
+ /* Iterate through the processes in kinfo_proc */
+ for (i=0; i < count; i++) {
+ // retrieve the arguments
+ *cmdline = '\0';
+ argv = kvm_getargv(kd, (const struct kinfo_proc *) &(procs[i]), 0);
+ if (argv) {
+ j = 0;
+ while (argv[j] && strlen(cmdline) <= ARG_MAX) {
+ if (j)
+ strncat(cmdline, " ", 1);
+ strncat(cmdline, argv[j], strlen(argv[j]));
+ j++;
+ }
+ }
+
+ pse.id = procs[i].ki_pid;
+ pse.age = 0;
+
+ pse.num_proc = 1;
+ pse.num_lwp = procs[i].ki_numthreads;
+
+ pse.vmem_rss = procs[i].ki_rssize * getpagesize();
+ pse.vmem_minflt = 0;
+ pse.vmem_minflt_counter = procs[i].ki_rusage.ru_minflt;
+ pse.vmem_majflt = 0;
+ pse.vmem_majflt_counter = procs[i].ki_rusage.ru_majflt;
+
+ pse.cpu_user = 0;
+ pse.cpu_user_counter = procs[i].ki_rusage.ru_utime.tv_sec*1000 + procs[i].ki_rusage.ru_utime.tv_usec;
+ pse.cpu_system = 0;
+ pse.cpu_system_counter = procs[i].ki_rusage.ru_stime.tv_sec*1000 + procs[i].ki_rusage.ru_stime.tv_usec;
+
+ switch (procs[i].ki_stat) {
+ case SSTOP: stopped++; break;
+ case SSLEEP: sleeping++; break;
+ case SRUN: running++; break;
+ case SIDL: idle++; break;
+ case SWAIT: wait++; break;
+ case SLOCK: blocked++; break;
+ case SZOMB: zombies++; break;
+ }
+
+ ps_list_add (procs[i].ki_comm, cmdline, &pse);
+ }
+
+ if (kd) kvm_close(kd);
+
+ ps_submit_state ("running", running);
+ ps_submit_state ("sleeping", sleeping);
+ ps_submit_state ("zombies", zombies);
+ ps_submit_state ("stopped", stopped);
+ ps_submit_state ("blocked", blocked);
+ ps_submit_state ("idle", idle);
+ ps_submit_state ("wait", wait);
+
+ for (ps_ptr = list_head_g; ps_ptr != NULL; ps_ptr = ps_ptr->next)
+ ps_submit_proc_list (ps_ptr);
+
+#endif /* HAVE_LIBKVM */