2
* Template MIB group implementation - sysORTable.c
5
#include <net-snmp/net-snmp-config.h>
10
#if TIME_WITH_SYS_TIME
12
# include <sys/timeb.h>
14
# include <sys/time.h>
19
# include <sys/time.h>
34
#include <netinet/in.h>
41
#include <net-snmp/net-snmp-includes.h>
42
#include <net-snmp/agent/net-snmp-agent-includes.h>
43
#include <net-snmp/agent/agent_callbacks.h>
46
#include "util_funcs.h"
47
#include "sysORTable.h"
50
#ifdef USING_AGENTX_SUBAGENT_MODULE
51
#include "agentx/subagent.h"
52
#include "agentx/client.h"
56
struct timeval sysOR_lastchange;
57
static struct sysORTable *table = NULL;
58
static int numEntries = 0;
61
* define the structure we're going to ask the agent to register our
64
struct variable1 sysORTable_variables[] = {
65
{SYSORTABLEID, ASN_OBJECT_ID, RONLY, var_sysORTable, 1, {2}},
66
{SYSORTABLEDESCR, ASN_OCTET_STR, RONLY, var_sysORTable, 1, {3}},
67
{SYSORTABLEUPTIME, ASN_TIMETICKS, RONLY, var_sysORTable, 1, {4}}
71
* Define the OID pointer to the top of the mib tree that we're
72
* registering underneath
74
oid sysORTable_variables_oid[] = { SNMP_OID_MIB2, 1, 9, 1 };
75
#ifdef USING_MIBII_SYSTEM_MIB_MODULE
76
extern oid system_module_oid[];
77
extern int system_module_oid_len;
78
extern int system_module_count;
85
* register ourselves with the agent to handle our mib tree
88
#ifdef USING_AGENTX_SUBAGENT_MODULE
89
if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE) == MASTER_AGENT)
90
(void) register_mib_priority("mibII/sysORTable",
93
sizeof(struct variable1),
94
sizeof(sysORTable_variables) /
95
sizeof(struct variable1),
96
sysORTable_variables_oid,
97
sizeof(sysORTable_variables_oid) /
101
REGISTER_MIB("mibII/sysORTable", sysORTable_variables, variable1,
102
sysORTable_variables_oid);
104
#ifdef USING_MIBII_SYSTEM_MIB_MODULE
105
if (++system_module_count == 3)
106
REGISTER_SYSOR_TABLE(system_module_oid, system_module_oid_len,
107
"The MIB module for SNMPv2 entities");
110
gettimeofday(&sysOR_lastchange, NULL);
113
/*********************
115
* System specific implementation functions
117
*********************/
120
var_sysORTable(struct variable *vp,
123
int exact, size_t * var_len, WriteMethod ** write_method)
126
static unsigned long ret;
127
struct sysORTable *ptr = table;
129
if (header_simple_table
130
(vp, name, length, exact, var_len, write_method, numEntries))
133
for (i = 1; ptr != NULL && i < name[*length - 1]; ptr = ptr->next, i++) {
134
DEBUGMSGTL(("mibII/sysORTable", "sysORTable -- %lu != %lu\n",
135
i, name[*length - 1]));
138
DEBUGMSGTL(("mibII/sysORTable", "sysORTable -- no match: %lu\n",
142
DEBUGMSGTL(("mibII/sysORTable", "sysORTable -- match: %lu\n", i));
146
*var_len = ptr->OR_oidlen * sizeof(ptr->OR_oid[0]);
147
return (u_char *) ptr->OR_oid;
149
case SYSORTABLEDESCR:
150
*var_len = strlen(ptr->OR_descr);
151
return (u_char *) ptr->OR_descr;
153
case SYSORTABLEUPTIME:
154
ret = netsnmp_timeval_uptime(&ptr->OR_uptime);
155
return (u_char *) & ret;
158
DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_sysORTable\n",
166
register_sysORTable_sess(oid * oidin,
168
const char *descr, netsnmp_session * ss)
170
struct sysORTable *ptr, **nptr;
171
struct register_sysOR_parameters reg_sysOR_parms;
173
DEBUGMSGTL(("mibII/sysORTable", "sysORTable registering: "));
174
DEBUGMSGOID(("mibII/sysORTable", oidin, oidlen));
175
DEBUGMSG(("mibII/sysORTable", "\n"));
177
ptr = (struct sysORTable *) malloc(sizeof(struct sysORTable));
179
return SYS_ORTABLE_REGISTRATION_FAILED;
181
ptr->OR_descr = (char *) strdup(descr);
182
if (ptr->OR_descr == NULL) {
184
return SYS_ORTABLE_REGISTRATION_FAILED;
186
ptr->OR_oidlen = oidlen;
187
ptr->OR_oid = (oid *) malloc(sizeof(oid) * oidlen);
188
if (ptr->OR_oid == NULL) {
191
return SYS_ORTABLE_REGISTRATION_FAILED;
193
memcpy(ptr->OR_oid, oidin, sizeof(oid) * oidlen);
194
gettimeofday(&(ptr->OR_uptime), NULL);
195
gettimeofday(&(sysOR_lastchange), NULL);
200
/* add this entry to the end of the chained list */
202
while (*nptr != NULL)
203
nptr = &((*nptr)->next);
206
reg_sysOR_parms.name = oidin;
207
reg_sysOR_parms.namelen = oidlen;
208
reg_sysOR_parms.descr = descr;
209
snmp_call_callbacks(SNMP_CALLBACK_APPLICATION,
210
SNMPD_CALLBACK_REG_SYSOR, ®_sysOR_parms);
212
return SYS_ORTABLE_REGISTERED_OK;
216
register_sysORTable(oid * oidin, size_t oidlen, const char *descr)
218
return register_sysORTable_sess(oidin, oidlen, descr, NULL);
224
unregister_sysORTable_sess(oid * oidin,
225
size_t oidlen, netsnmp_session * ss)
227
struct sysORTable *ptr, *prev = NULL, *next;
228
int found = SYS_ORTABLE_NO_SUCH_REGISTRATION;
229
struct register_sysOR_parameters reg_sysOR_parms;
231
DEBUGMSGTL(("mibII/sysORTable", "sysORTable unregistering: "));
232
DEBUGMSGOID(("mibII/sysORTable", oidin, oidlen));
233
DEBUGMSG(("mibII/sysORTable", "\n"));
235
for (ptr = table; ptr; ptr = next)
238
if (ptr->OR_sess == ss &&
239
(snmp_oid_compare(oidin, oidlen, ptr->OR_oid, ptr->OR_oidlen) == 0))
244
prev->next = ptr->next;
250
gettimeofday(&(sysOR_lastchange), NULL);
251
found = SYS_ORTABLE_UNREGISTERED_OK;
257
reg_sysOR_parms.name = oidin;
258
reg_sysOR_parms.namelen = oidlen;
259
snmp_call_callbacks(SNMP_CALLBACK_APPLICATION,
260
SNMPD_CALLBACK_UNREG_SYSOR, ®_sysOR_parms);
267
unregister_sysORTable(oid * oidin, size_t oidlen)
269
return unregister_sysORTable_sess(oidin, oidlen, NULL);
273
unregister_sysORTable_by_session(netsnmp_session * ss)
275
struct sysORTable *ptr, *prev = NULL, *next;
277
for (ptr = table; ptr; ptr = next)
280
if (((ss->flags & SNMP_FLAGS_SUBSESSION) && ptr->OR_sess == ss) ||
281
(!(ss->flags & SNMP_FLAGS_SUBSESSION) && ptr->OR_sess &&
282
ptr->OR_sess->subsession == ss)) {
291
gettimeofday(&(sysOR_lastchange), NULL);