diff options
Diffstat (limited to 'agent/mibgroup/host/data_access/swrun_nlist.c')
-rw-r--r-- | agent/mibgroup/host/data_access/swrun_nlist.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/agent/mibgroup/host/data_access/swrun_nlist.c b/agent/mibgroup/host/data_access/swrun_nlist.c new file mode 100644 index 0000000..5db6c9c --- /dev/null +++ b/agent/mibgroup/host/data_access/swrun_nlist.c @@ -0,0 +1,114 @@ +/* + * swrun_nlist.c: + * hrSWRunTable data access: + * nlist() interface + */ +#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 + +#include <net-snmp/agent/auto_nlist.h> + +#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> + +/* --------------------------------------------------------------------- + */ +void +netsnmp_arch_swrun_init(void) +{ + extern int _swrun_max; + + auto_nlist( PROC_SYMBOL, 0, 0); + auto_nlist( NPROC_SYMBOL, (char *)&_swrun_max, sizeof(int)); + return; +} + +/* --------------------------------------------------------------------- + */ +int +netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags) +{ + struct proc *proc_table; + int proc_type_base; + int nproc, i, rc; + netsnmp_swrun_entry *entry; + + auto_nlist( NPROC_SYMBOL, (char *)&nproc, sizeof(int)); + proc_table = (struct proc *) malloc(nproc*(sizeof(struct proc))); + + auto_nlist( PROC_SYMBOL, (char *)&proc_table_base, sizeof(int)); + NETSNMP_KLOOKUP(proc_table_base, (char *)proc_table, + nproc*(sizeof(struct proc))); + + for ( i=0 ; i<nproc; i++ ) { + if (0 == proc_table[i].p_stat) + continue; /* Skip unused entries */ + entry = netsnmp_swrun_entry_create(proc_table[i].p_pid); + if (NULL == entry) + continue; /* error already logged by function */ + rc = CONTAINER_INSERT(container, entry); + + /* + * XXX - What information does 'struct proc' contain? + */ + +/* + Apparently no process name/argument information + entry->hrSWRunName_len = snprintf(entry->hrSWRunName, + sizeof(entry->hrSWRunName)-1, + "%s", proc_table[i].???); + entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath, + sizeof(entry->hrSWRunPath)-1, + "%s", proc_table[i].???); + entry->hrSWRunParameters_len = snprintf(entry->hrSWRunParameters, + sizeof(entry->hrSWRunParameters)-1, + "%s", ???); + */ + + switch (proc_table[i].p_stat) { +/* XXX - which names to use ?? */ + case SACTIVE: + case SRUN: + case SONPROC: entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNING; + break; + case SSWAP: + case SSLEEP: + case SWAIT: 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_table[i].p_utime.tv_sec * 100); + entry->hrSWRunPerfCPU += (proc_table[i].p_utime.tv_usec / 10000); + entry->hrSWRunPerfCPU += (proc_table[i].p_stime.tv_sec * 100); + entry->hrSWRunPerfCPU += (proc_table[i].p_stime.tv_usec / 10000); + /* + or entry->hrSWRunPerfCPU = proc_table[i].p_time; + */ + } + free(proc_table); + + DEBUGMSGTL(("swrun:load:arch"," loaded %d entries\n", + CONTAINER_SIZE(container))); + + return 0; +} |