diff options
Diffstat (limited to 'agent/mibgroup/host/data_access/swrun_kvm_proc.c')
-rw-r--r-- | agent/mibgroup/host/data_access/swrun_kvm_proc.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/agent/mibgroup/host/data_access/swrun_kvm_proc.c b/agent/mibgroup/host/data_access/swrun_kvm_proc.c new file mode 100644 index 0000000..ae6876e --- /dev/null +++ b/agent/mibgroup/host/data_access/swrun_kvm_proc.c @@ -0,0 +1,164 @@ +/* + * swrun_kvm_proc.c: + * hrSWRunTable data access: + * kvm_getproc() interface - Solaris + */ +#include <net-snmp/net-snmp-config.h> + +#include <stdio.h> +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_PARAM_H +#include <sys/param.h> +#endif +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif +#ifdef HAVE_SYS_USER_H +#define _KMEMUSER +#include <sys/user.h> +#endif +#ifdef HAVE_SYS_PROC_H +#include <sys/proc.h> +#endif + /* XXX - should really be protected */ +#include <sys/var.h> + +#ifdef HAVE_DIRENT_H +#include <dirent.h> +#endif +#ifdef HAVE_KVM_H +#include <kvm.h> +#endif +#ifdef HAVE_KSTAT_H +#include <kstat.h> +#endif + +#include <net-snmp/net-snmp-includes.h> +#include <net-snmp/agent/net-snmp-agent-includes.h> +#include <net-snmp/library/container.h> +#include <net-snmp/library/snmp_debug.h> +#include <net-snmp/data_access/swrun.h> +#include "kernel.h" +#include "kernel_sunos5.h" + +/* --------------------------------------------------------------------- + */ +void +netsnmp_arch_swrun_init(void) +{ + extern int _swrun_max; + kstat_ctl_t *ksc; + kstat_t *ks; + struct var v; + + if (NULL != (ksc = kstat_open())) { + if ((NULL != (ks = kstat_lookup(ksc, "unix", 0, "var"))) && + ( -1 != kstat_read(ksc, ks, &v ))) { + _swrun_max = v.v_proc; + } + kstat_close(ksc); + } + return; +} + +/* --------------------------------------------------------------------- + */ +int +netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags) +{ + DIR *procdir = NULL; + struct dirent *procentry_p; + struct proc *proc_buf; + int pid, rc, i; + char *cp; + netsnmp_swrun_entry *entry; + + /* + * Even if we're using kvm_proc() to retrieve information + * about a particular process, we seem to use /proc to get + * the initial list of processes to report on. + */ + procdir = opendir("/proc"); + if ( NULL == procdir ) { + snmp_log( LOG_ERR, "Failed to open /proc" ); + return -1; + } + + /* + * Walk through the list of processes in the /proc tree + */ + while ( NULL != (procentry_p = readdir( procdir ))) { + pid = atoi( procentry_p->d_name ); + if ( 0 == pid ) + continue; /* Presumably '.' or '..' */ + + entry = netsnmp_swrun_entry_create(pid); + if (NULL == entry) + continue; /* error already logged by function */ + if (NULL == (proc_buf = kvm_getproc( kd, pid))) { + /* release entry */ + continue; + } + rc = CONTAINER_INSERT(container, entry); + + entry->hrSWRunName_len = snprintf(entry->hrSWRunName, + sizeof(entry->hrSWRunName)-1, + "%s", proc_buf->p_user.u_comm); + /* + * Split u_psargs into two: + * argv[0] is hrSWRunPath + * argv[1..] is hrSWRunParameters + */ + for ( cp = proc_buf->p_user.u_psargs; ' ' == *cp; cp++ ) + ; + *cp = '\0'; /* End of argv[0] */ + entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath, + sizeof(entry->hrSWRunPath)-1, + "%s", proc_buf->p_user.u_psargs); + entry->hrSWRunParameters_len = snprintf(entry->hrSWRunParameters, + sizeof(entry->hrSWRunParameters)-1, + "%s", cp+1); + *cp = ' '; /* Restore u_psargs value */ + + /* + * check for system processes + */ + entry->hrSWRunType = (SSYS & proc_buf->p_flag) + ? 2 /* kernel process */ + : 4 /* application */ + ; + + switch (proc_buf->p_stat) { + case SRUN: + case SONPROC: entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNING; + break; + case SSLEEP: entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNABLE; + break; + case SSTOP: entry->hrSWRunStatus = HRSWRUNSTATUS_NOTRUNNABLE; + break; + case SIDL: + case SZOMB: + default: entry->hrSWRunStatus = HRSWRUNSTATUS_INVALID; + break; + } + + entry->hrSWRunPerfCPU = (proc_buf->p_utime * 100); + entry->hrSWRunPerfCPU += (proc_buf->p_stime * 100); + entry->hrSWRunPerfMem = proc_buf->p_swrss; + /* XXX - is this reported in kB? */ + } + closedir( procdir ); + + DEBUGMSGTL(("swrun:load:arch"," loaded %d entries\n", + CONTAINER_SIZE(container))); + + return 0; +} |