|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
#if HAVE_STDLIB_H
|
|
Packit |
fcad23 |
#include <stdlib.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_STRING_H
|
|
Packit |
fcad23 |
#include <string.h>
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
#include <strings.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#include <stddef.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/agent/agent_callbacks.h>
|
|
Packit |
fcad23 |
#include <net-snmp/agent/agent_sysORTable.h>
|
|
Packit |
fcad23 |
#include <net-snmp/agent/sysORTable.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
typedef struct data_node_s {
|
|
Packit |
fcad23 |
struct sysORTable data;
|
|
Packit |
fcad23 |
struct data_node_s* next;
|
|
Packit |
fcad23 |
struct data_node_s* prev;
|
|
Packit |
fcad23 |
}* data_node;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static data_node table = NULL;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static void
|
|
Packit |
fcad23 |
erase(data_node entry)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
entry->data.OR_uptime = netsnmp_get_agent_uptime();
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "UNREG_SYSOR %p\n", &entry->data));
|
|
Packit |
fcad23 |
snmp_call_callbacks(SNMP_CALLBACK_APPLICATION, SNMPD_CALLBACK_UNREG_SYSOR,
|
|
Packit |
fcad23 |
&entry->data);
|
|
Packit |
fcad23 |
free(entry->data.OR_oid);
|
|
Packit |
fcad23 |
free(entry->data.OR_descr);
|
|
Packit |
fcad23 |
if (entry->next == entry)
|
|
Packit |
fcad23 |
table = NULL;
|
|
Packit |
fcad23 |
else {
|
|
Packit |
fcad23 |
entry->next->prev = entry->prev;
|
|
Packit |
fcad23 |
entry->prev->next = entry->next;
|
|
Packit |
fcad23 |
if (entry == table)
|
|
Packit |
fcad23 |
table = entry->next;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
free(entry);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
netsnmp_sysORTable_foreach(void (*f)(const struct sysORTable*, void*), void* c)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "foreach(%p, %p)\n", f, c));
|
|
Packit |
fcad23 |
if(table) {
|
|
Packit |
fcad23 |
data_node run = table;
|
|
Packit |
fcad23 |
do {
|
|
Packit |
fcad23 |
data_node tmp = run;
|
|
Packit |
fcad23 |
run = run->next;
|
|
Packit |
fcad23 |
f(&tmp->data, c);
|
|
Packit |
fcad23 |
} while(table && run != table);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
register_sysORTable_sess(oid * oidin,
|
|
Packit |
fcad23 |
size_t oidlen,
|
|
Packit |
fcad23 |
const char *descr, netsnmp_session * ss)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
data_node entry;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "registering: "));
|
|
Packit |
fcad23 |
DEBUGMSGOID(("agent/sysORTable", oidin, oidlen));
|
|
Packit |
fcad23 |
DEBUGMSG(("agent/sysORTable", ", session %p\n", ss));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry = (data_node)calloc(1, sizeof(struct data_node_s));
|
|
Packit |
fcad23 |
if (entry == NULL) {
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "Failed to allocate new entry\n"));
|
|
Packit |
fcad23 |
return SYS_ORTABLE_REGISTRATION_FAILED;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry->data.OR_descr = strdup(descr);
|
|
Packit |
fcad23 |
if (entry->data.OR_descr == NULL) {
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "Failed to allocate new sysORDescr\n"));
|
|
Packit |
fcad23 |
free(entry);
|
|
Packit |
fcad23 |
return SYS_ORTABLE_REGISTRATION_FAILED;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry->data.OR_oid = (oid *) malloc(sizeof(oid) * oidlen);
|
|
Packit |
fcad23 |
if (entry->data.OR_oid == NULL) {
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "Failed to allocate new sysORID\n"));
|
|
Packit |
fcad23 |
free(entry->data.OR_descr);
|
|
Packit |
fcad23 |
free(entry);
|
|
Packit |
fcad23 |
return SYS_ORTABLE_REGISTRATION_FAILED;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
memcpy(entry->data.OR_oid, oidin, sizeof(oid) * oidlen);
|
|
Packit |
fcad23 |
entry->data.OR_oidlen = oidlen;
|
|
Packit |
fcad23 |
entry->data.OR_sess = ss;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if(table) {
|
|
Packit |
fcad23 |
entry->next = table;
|
|
Packit |
fcad23 |
entry->prev = table->prev;
|
|
Packit |
fcad23 |
table->prev->next = entry;
|
|
Packit |
fcad23 |
table->prev = entry;
|
|
Packit |
fcad23 |
} else
|
|
Packit |
fcad23 |
table = entry->next = entry->prev = entry;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
entry->data.OR_uptime = netsnmp_get_agent_uptime();
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
snmp_call_callbacks(SNMP_CALLBACK_APPLICATION,
|
|
Packit |
fcad23 |
SNMPD_CALLBACK_REG_SYSOR, &entry->data);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return SYS_ORTABLE_REGISTERED_OK;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
register_sysORTable(oid * oidin, size_t oidlen, const char *descr)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return register_sysORTable_sess(oidin, oidlen, descr, NULL);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
unregister_sysORTable_sess(oid * oidin,
|
|
Packit |
fcad23 |
size_t oidlen, netsnmp_session * ss)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int any_unregistered = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "sysORTable unregistering: "));
|
|
Packit |
fcad23 |
DEBUGMSGOID(("agent/sysORTable", oidin, oidlen));
|
|
Packit |
fcad23 |
DEBUGMSG(("agent/sysORTable", ", session %p\n", ss));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if(table) {
|
|
Packit |
fcad23 |
data_node run = table;
|
|
Packit |
fcad23 |
do {
|
|
Packit |
fcad23 |
data_node tmp = run;
|
|
Packit |
fcad23 |
run = run->next;
|
|
Packit |
fcad23 |
if (tmp->data.OR_sess == ss &&
|
|
Packit |
fcad23 |
snmp_oid_compare(oidin, oidlen,
|
|
Packit |
fcad23 |
tmp->data.OR_oid, tmp->data.OR_oidlen) == 0) {
|
|
Packit |
fcad23 |
erase(tmp);
|
|
Packit |
fcad23 |
any_unregistered = 1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} while(table && run != table);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (any_unregistered) {
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "unregistering successfull\n"));
|
|
Packit |
fcad23 |
return SYS_ORTABLE_UNREGISTERED_OK;
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "unregistering failed\n"));
|
|
Packit |
fcad23 |
return SYS_ORTABLE_NO_SUCH_REGISTRATION;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
unregister_sysORTable(oid * oidin, size_t oidlen)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return unregister_sysORTable_sess(oidin, oidlen, NULL);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
unregister_sysORTable_by_session(netsnmp_session * ss)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable",
|
|
Packit |
fcad23 |
"sysORTable unregistering session %p\n", ss));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if(table) {
|
|
Packit |
fcad23 |
data_node run = table;
|
|
Packit |
fcad23 |
do {
|
|
Packit |
fcad23 |
data_node tmp = run;
|
|
Packit |
fcad23 |
run = run->next;
|
|
Packit |
fcad23 |
if (((ss->flags & SNMP_FLAGS_SUBSESSION) &&
|
|
Packit |
fcad23 |
tmp->data.OR_sess == ss) ||
|
|
Packit |
fcad23 |
(!(ss->flags & SNMP_FLAGS_SUBSESSION) && tmp->data.OR_sess &&
|
|
Packit |
fcad23 |
tmp->data.OR_sess->subsession == ss))
|
|
Packit |
fcad23 |
erase(tmp);
|
|
Packit |
fcad23 |
} while(table && run != table);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable",
|
|
Packit |
fcad23 |
"sysORTable unregistering session %p done\n", ss));
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
register_sysOR_callback(int majorID, int minorID, void *serverarg,
|
|
Packit |
fcad23 |
void *clientarg)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
struct sysORTable *parms = (struct sysORTable *) serverarg;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return register_sysORTable_sess(parms->OR_oid, parms->OR_oidlen,
|
|
Packit |
fcad23 |
parms->OR_descr, parms->OR_sess);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
unregister_sysOR_by_session_callback(int majorID, int minorID,
|
|
Packit |
fcad23 |
void *serverarg, void *clientarg)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
netsnmp_session *session = (netsnmp_session *) serverarg;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
unregister_sysORTable_by_session(session);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int
|
|
Packit |
fcad23 |
unregister_sysOR_callback(int majorID, int minorID, void *serverarg,
|
|
Packit |
fcad23 |
void *clientarg)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
struct sysORTable *parms = (struct sysORTable *) serverarg;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return unregister_sysORTable_sess(parms->OR_oid,
|
|
Packit |
fcad23 |
parms->OR_oidlen,
|
|
Packit |
fcad23 |
parms->OR_sess);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
init_agent_sysORTable(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "init_agent_sysORTable\n"));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
snmp_register_callback(SNMP_CALLBACK_APPLICATION,
|
|
Packit |
fcad23 |
SNMPD_CALLBACK_REQ_REG_SYSOR,
|
|
Packit |
fcad23 |
register_sysOR_callback, NULL);
|
|
Packit |
fcad23 |
snmp_register_callback(SNMP_CALLBACK_APPLICATION,
|
|
Packit |
fcad23 |
SNMPD_CALLBACK_REQ_UNREG_SYSOR,
|
|
Packit |
fcad23 |
unregister_sysOR_callback, NULL);
|
|
Packit |
fcad23 |
snmp_register_callback(SNMP_CALLBACK_APPLICATION,
|
|
Packit |
fcad23 |
SNMPD_CALLBACK_REQ_UNREG_SYSOR_SESS,
|
|
Packit |
fcad23 |
unregister_sysOR_by_session_callback, NULL);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
shutdown_agent_sysORTable(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
DEBUGMSGTL(("agent/sysORTable", "shutdown_sysORTable\n"));
|
|
Packit |
fcad23 |
while(table)
|
|
Packit |
fcad23 |
erase(table);
|
|
Packit |
fcad23 |
}
|