| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| #include <config.h> |
| #include <glibtop.h> |
| #include <glibtop/error.h> |
| #include <glibtop/procstate.h> |
| |
| #include <glibtop_suid.h> |
| |
| #if !defined(__OpenBSD__) |
| |
| #include <sys/user.h> |
| #endif |
| |
| static const unsigned long _glibtop_sysdeps_proc_state = |
| (1L << GLIBTOP_PROC_STATE_CMD) + (1L << GLIBTOP_PROC_STATE_UID) + |
| (1L << GLIBTOP_PROC_STATE_GID); |
| |
| static const unsigned long _glibtop_sysdeps_proc_state_new = |
| 0; |
| |
| |
| |
| void |
| _glibtop_init_proc_state_p (glibtop *server) |
| { |
| server->sysdeps.proc_state = _glibtop_sysdeps_proc_state | |
| _glibtop_sysdeps_proc_state_new; |
| } |
| |
| |
| |
| void |
| glibtop_get_proc_state_p (glibtop *server, |
| glibtop_proc_state *buf, |
| pid_t pid) |
| { |
| struct kinfo_proc *pinfo; |
| int count = 0; |
| |
| glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_PROC_STATE), 0); |
| |
| memset (buf, 0, sizeof (glibtop_proc_state)); |
| |
| |
| if (pid == 0) return; |
| |
| |
| pinfo = kvm_getprocs (server->machine->kd, KERN_PROC_PID, pid, &count); |
| if ((pinfo == NULL) || (count != 1)) { |
| glibtop_warn_io_r (server, "kvm_getprocs (%d)", pid); |
| return; |
| } |
| |
| #if (defined(__FreeBSD__) && (__FreeBSD_version >= 500013)) || defined(__FreeBSD_kernel__) |
| #define PROC_COMM ki_comm |
| #define PROC_SVUID ki_svuid |
| #define PROC_SVGID ki_svgid |
| #define PROC_RUID ki_ruid |
| #define PROC_RGID ki_rgid |
| #define PROC_STAT ki_stat |
| |
| #else |
| #define PROC_COMM kp_proc.p_comm |
| #define PROC_SVUID kp_eproc.e_pcred.p_svuid |
| #define PROC_SVGID kp_eproc.e_pcred.p_svgid |
| #define PROC_RUID kp_eproc.e_pcred.p_ruid |
| #define PROC_RGID kp_eproc.e_pcred.p_rgid |
| #define PROC_STAT kp_proc.p_stat |
| |
| #endif |
| |
| g_strlcpy (buf->cmd, pinfo [0].PROC_COMM, sizeof buf->cmd); |
| |
| buf->uid = pinfo [0].PROC_SVUID; |
| buf->gid = pinfo [0].PROC_SVGID; |
| |
| |
| buf->flags = _glibtop_sysdeps_proc_state | |
| _glibtop_sysdeps_proc_state_new; |
| |
| #if LIBGTOP_VERSION_CODE >= 1001000 |
| switch (pinfo [0].PROC_STAT) { |
| case SIDL: |
| buf->state = 0; |
| break; |
| case SRUN: |
| buf->state = GLIBTOP_PROCESS_RUNNING; |
| break; |
| #ifdef SSLEEP |
| case SSLEEP: |
| buf->state = GLIBTOP_PROCESS_INTERRUPTIBLE; |
| break; |
| #endif |
| case SSTOP: |
| buf->state = GLIBTOP_PROCESS_STOPPED; |
| break; |
| case SZOMB: |
| buf->state = GLIBTOP_PROCESS_ZOMBIE; |
| break; |
| default: |
| return; |
| } |
| #else |
| switch (pinfo [0].PROC_STAT) { |
| case SIDL: |
| buf->state = 'D'; |
| break; |
| case SRUN: |
| buf->state = 'R'; |
| break; |
| #ifdef SSLEEP |
| case SSLEEP: |
| buf->state = 'S'; |
| break; |
| #endif |
| case SSTOP: |
| buf->state = 'T'; |
| break; |
| case SZOMB: |
| buf->state = 'Z'; |
| break; |
| default: |
| return; |
| } |
| #endif |
| |
| buf->flags |= (1L << GLIBTOP_PROC_STATE_STATE); |
| } |