blob: 5db6c9c95119876357d2081f501097f7b0988d8e [file] [log] [blame]
/*
* 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;
}