diff options
Diffstat (limited to 'agent/mibgroup/host/data_access/swrun_procinfo.c')
-rw-r--r-- | agent/mibgroup/host/data_access/swrun_procinfo.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/agent/mibgroup/host/data_access/swrun_procinfo.c b/agent/mibgroup/host/data_access/swrun_procinfo.c new file mode 100644 index 0000000..20caee6 --- /dev/null +++ b/agent/mibgroup/host/data_access/swrun_procinfo.c @@ -0,0 +1,130 @@ +/* + * swrun_procinfo.c: + * hrSWRunTable data access: + * getprocs() interface - AIX + */ +#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 <procinfo.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> + +int avail = 1024; /* Size of table to allocate */ + +/* --------------------------------------------------------------------- + */ +void +netsnmp_arch_swrun_init(void) +{ + /* Nothing to do */ + return; +} + +/* --------------------------------------------------------------------- + */ +int +netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags) +{ + struct procsinfo *proc_table; + pid_t proc_index = 0; + int nprocs, rc, i; + char pentry[128], *ppentry, fullpath[128]; + netsnmp_swrun_entry *entry; + + /* + * Create a buffer for the process table, based on the size of + * the table the last time we loaded this information. + * If this isn't big enough, keep increasing the size of the + * table until we can retrieve the whole thing. + */ + proc_table = (struct procsinfo *) malloc(avail*(sizeof(struct procsinfo))); + while ( avail == (nprocs = getprocs(proc_table, sizeof(struct procsinfo), + 0, sizeof(struct fdsinfo), + &proc_index, avail))) { + avail += 1024; + free( proc_table ); + proc_table = (struct procsinfo *) malloc(avail*(sizeof(struct procsinfo))); + } + + for ( i=0 ; i<nprocs; i++ ) { + if (0 == proc_table[i].pi_state) + continue; /* Skip unused entries */ + entry = netsnmp_swrun_entry_create(proc_table[i].pi_pid); + if (NULL == entry) + continue; /* error already logged by function */ + rc = CONTAINER_INSERT(container, entry); + + memset(pentry, 0, sizeof(pentry)); /* Empty each time */ + if(!(SKPROC & proc_table[i].pi_flags)) { /* Remove kernel processes */ + getargs(&proc_table[i], sizeof(struct procsinfo), pentry, sizeof(pentry)); /* Call getargs() */ + for(ppentry = pentry; !((*ppentry == '\0') && (*(ppentry+1) == '\0')); ppentry++) { /* Process until 0x00 0x00 */ + if((*ppentry == '\0') && (!(*(ppentry+1) == '\0'))) /* if 0x00 !0x00 */ + *ppentry = ' '; /* change to 0x20 !0x00 */ + } + snprintf(fullpath, sizeof(fullpath)-1, "%.*s", (int)(strchr(pentry, ' ')-pentry), pentry); + + entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath, + sizeof(entry->hrSWRunPath), "%s", fullpath); + ppentry = strrchr(fullpath, '/'); + if(ppentry == NULL) { + entry->hrSWRunName_len = snprintf(entry->hrSWRunName, + sizeof(entry->hrSWRunName), "%s", fullpath); + } + else { + entry->hrSWRunName_len = snprintf(entry->hrSWRunName, + sizeof(entry->hrSWRunName), "%s", ppentry + 1); + } + + ppentry = strchr(pentry, ' '); + entry->hrSWRunParameters_len = snprintf(entry->hrSWRunParameters, + sizeof(entry->hrSWRunParameters), "%.*s", (int)(pentry - ppentry), ppentry + 1); + } + + entry->hrSWRunType = (SKPROC & proc_table[i].pi_flags) + ? 2 /* kernel process */ + : 4 /* application */ + ; + + switch (proc_table[i].pi_state) { + case SACTIVE: + case SRUN: 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_table[i].pi_ru.ru_utime.tv_sec * 100); + entry->hrSWRunPerfCPU += (proc_table[i].pi_ru.ru_utime.tv_usec / 10000000); + entry->hrSWRunPerfCPU += (proc_table[i].pi_ru.ru_stime.tv_sec * 100); + entry->hrSWRunPerfCPU += (proc_table[i].pi_ru.ru_stime.tv_usec / 10000000); + entry->hrSWRunPerfMem = proc_table[i].pi_size; + entry->hrSWRunPerfMem *= (getpagesize()/1024); /* in kB */ + } + free(proc_table); + + DEBUGMSGTL(("swrun:load:arch"," loaded %d entries\n", + CONTAINER_SIZE(container))); + + return 0; +} |