|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* swrun_nlist.c:
|
|
Packit |
fcad23 |
* hrSWRunTable data access:
|
|
Packit |
fcad23 |
* nlist() interface
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <stdio.h>
|
|
Packit |
fcad23 |
#ifdef HAVE_STDLIB_H
|
|
Packit |
fcad23 |
#include <stdlib.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#ifdef HAVE_UNISTD_H
|
|
Packit |
fcad23 |
#include <unistd.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#ifdef HAVE_SYS_TYPES_H
|
|
Packit |
fcad23 |
#include <sys/types.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/agent/auto_nlist.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/agent/net-snmp-agent-includes.h>
|
|
Packit |
fcad23 |
#include <net-snmp/library/container.h>
|
|
Packit |
fcad23 |
#include <net-snmp/library/snmp_debug.h>
|
|
Packit |
fcad23 |
#include <net-snmp/data_access/swrun.h>
|
|
Packit |
fcad23 |
#include "swrun_private.h"
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/* ---------------------------------------------------------------------
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
netsnmp_arch_swrun_init(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
extern int _swrun_max;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
auto_nlist( PROC_SYMBOL, 0, 0);
|
|
Packit |
fcad23 |
auto_nlist( NPROC_SYMBOL, (char *)&_swrun_max, sizeof(int));
|
|
Packit |
fcad23 |
return;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/* ---------------------------------------------------------------------
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
struct proc *proc_table;
|
|
Packit |
fcad23 |
int proc_type_base;
|
|
Packit |
fcad23 |
int nproc, i, rc;
|
|
Packit |
fcad23 |
netsnmp_swrun_entry *entry;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
auto_nlist( NPROC_SYMBOL, (char *)&nproc, sizeof(int));
|
|
Packit |
fcad23 |
proc_table = (struct proc *) malloc(nproc*(sizeof(struct proc)));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
auto_nlist( PROC_SYMBOL, (char *)&proc_table_base, sizeof(int));
|
|
Packit |
fcad23 |
NETSNMP_KLOOKUP(proc_table_base, (char *)proc_table,
|
|
Packit |
fcad23 |
nproc*(sizeof(struct proc)));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
for ( i=0 ; i
|
|
Packit |
fcad23 |
if (0 == proc_table[i].p_stat)
|
|
Packit |
fcad23 |
continue; /* Skip unused entries */
|
|
Packit |
fcad23 |
entry = netsnmp_swrun_entry_create(proc_table[i].p_pid);
|
|
Packit |
fcad23 |
if (NULL == entry)
|
|
Packit |
fcad23 |
continue; /* error already logged by function */
|
|
Packit |
fcad23 |
rc = CONTAINER_INSERT(container, entry);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* XXX - What information does 'struct proc' contain?
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
Apparently no process name/argument information
|
|
Packit |
fcad23 |
entry->hrSWRunName_len = snprintf(entry->hrSWRunName,
|
|
Packit |
fcad23 |
sizeof(entry->hrSWRunName)-1,
|
|
Packit |
fcad23 |
"%s", proc_table[i].???);
|
|
Packit |
fcad23 |
entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath,
|
|
Packit |
fcad23 |
sizeof(entry->hrSWRunPath)-1,
|
|
Packit |
fcad23 |
"%s", proc_table[i].???);
|
|
Packit |
fcad23 |
entry->hrSWRunParameters_len = snprintf(entry->hrSWRunParameters,
|
|
Packit |
fcad23 |
sizeof(entry->hrSWRunParameters)-1,
|
|
Packit |
fcad23 |
"%s", ???);
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
switch (proc_table[i].p_stat) {
|
|
Packit |
fcad23 |
/* XXX - which names to use ?? */
|
|
Packit |
fcad23 |
case SACTIVE:
|
|
Packit |
fcad23 |
case SRUN:
|
|
Packit |
fcad23 |
case SONPROC: entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNING;
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
case SSWAP:
|
|
Packit |
fcad23 |
case SSLEEP:
|
|
Packit |
fcad23 |
case SWAIT: entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNABLE;
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
case SSTOP: entry->hrSWRunStatus = HRSWRUNSTATUS_NOTRUNNABLE;
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
case SIDL:
|
|
Packit |
fcad23 |
case SZOMB:
|
|
Packit |
fcad23 |
default: entry->hrSWRunStatus = HRSWRUNSTATUS_INVALID;
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry->hrSWRunPerfCPU = (proc_table[i].p_utime.tv_sec * 100);
|
|
Packit |
fcad23 |
entry->hrSWRunPerfCPU += (proc_table[i].p_utime.tv_usec / 10000);
|
|
Packit |
fcad23 |
entry->hrSWRunPerfCPU += (proc_table[i].p_stime.tv_sec * 100);
|
|
Packit |
fcad23 |
entry->hrSWRunPerfCPU += (proc_table[i].p_stime.tv_usec / 10000);
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
or entry->hrSWRunPerfCPU = proc_table[i].p_time;
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
free(proc_table);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
DEBUGMSGTL(("swrun:load:arch"," loaded %d entries\n",
|
|
Packit |
fcad23 |
CONTAINER_SIZE(container)));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|