1 #ifdef BUILD_SNMP_SYSOR_MIB
3 * Template MIB group implementation - sysORTable.c
6 #include <net-snmp/net-snmp-config.h>
10 #include <sys/types.h>
11 #if TIME_WITH_SYS_TIME
13 # include <sys/timeb.h>
15 # include <sys/time.h>
20 # include <sys/time.h>
35 #include <netinet/in.h>
42 #include <net-snmp/net-snmp-includes.h>
43 #include <net-snmp/agent/net-snmp-agent-includes.h>
44 #include <net-snmp/agent/agent_callbacks.h>
47 #include "util_funcs.h"
48 #include "sysORTable.h"
51 #ifdef USING_AGENTX_SUBAGENT_MODULE
52 #include "agentx/subagent.h"
53 #include "agentx/client.h"
57 struct timeval sysOR_lastchange;
58 static struct sysORTable *table = NULL;
59 static int numEntries = 0;
62 * define the structure we're going to ask the agent to register our
65 struct variable1 sysORTable_variables[] = {
66 {SYSORTABLEID, ASN_OBJECT_ID, RONLY, var_sysORTable, 1, {2}},
67 {SYSORTABLEDESCR, ASN_OCTET_STR, RONLY, var_sysORTable, 1, {3}},
68 {SYSORTABLEUPTIME, ASN_TIMETICKS, RONLY, var_sysORTable, 1, {4}}
72 * Define the OID pointer to the top of the mib tree that we're
73 * registering underneath
75 oid sysORTable_variables_oid[] = { SNMP_OID_MIB2, 1, 9, 1 };
76 #ifdef USING_MIBII_SYSTEM_MIB_MODULE
77 extern oid system_module_oid[];
78 extern int system_module_oid_len;
79 extern int system_module_count;
86 * register ourselves with the agent to handle our mib tree
89 #ifdef USING_AGENTX_SUBAGENT_MODULE
90 if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE) == MASTER_AGENT)
91 (void) register_mib_priority("mibII/sysORTable",
94 sizeof(struct variable1),
95 sizeof(sysORTable_variables) /
96 sizeof(struct variable1),
97 sysORTable_variables_oid,
98 sizeof(sysORTable_variables_oid) /
102 REGISTER_MIB("mibII/sysORTable", sysORTable_variables, variable1,
103 sysORTable_variables_oid);
105 #ifdef USING_MIBII_SYSTEM_MIB_MODULE
106 if (++system_module_count == 3)
107 REGISTER_SYSOR_TABLE(system_module_oid, system_module_oid_len,
108 "The MIB module for SNMPv2 entities");
111 gettimeofday(&sysOR_lastchange, NULL);
114 /*********************
116 * System specific implementation functions
118 *********************/
121 var_sysORTable(struct variable *vp,
124 int exact, size_t * var_len, WriteMethod ** write_method)
127 static unsigned long ret;
128 struct sysORTable *ptr = table;
130 if (header_simple_table
131 (vp, name, length, exact, var_len, write_method, numEntries))
134 for (i = 1; ptr != NULL && i < name[*length - 1]; ptr = ptr->next, i++) {
135 DEBUGMSGTL(("mibII/sysORTable", "sysORTable -- %lu != %lu\n",
136 i, name[*length - 1]));
139 DEBUGMSGTL(("mibII/sysORTable", "sysORTable -- no match: %lu\n",
143 DEBUGMSGTL(("mibII/sysORTable", "sysORTable -- match: %lu\n", i));
147 *var_len = ptr->OR_oidlen * sizeof(ptr->OR_oid[0]);
148 return (u_char *) ptr->OR_oid;
150 case SYSORTABLEDESCR:
151 *var_len = strlen(ptr->OR_descr);
152 return (u_char *) ptr->OR_descr;
154 case SYSORTABLEUPTIME:
155 ret = netsnmp_timeval_uptime(&ptr->OR_uptime);
156 return (u_char *) & ret;
159 DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_sysORTable\n",
167 register_sysORTable_sess(oid * oidin,
169 const char *descr, netsnmp_session * ss)
171 struct sysORTable **ptr = &table;
172 struct register_sysOR_parameters reg_sysOR_parms;
174 DEBUGMSGTL(("mibII/sysORTable", "sysORTable registering: "));
175 DEBUGMSGOID(("mibII/sysORTable", oidin, oidlen));
176 DEBUGMSG(("mibII/sysORTable", "\n"));
179 ptr = &((*ptr)->next);
180 *ptr = (struct sysORTable *) malloc(sizeof(struct sysORTable));
182 return SYS_ORTABLE_REGISTRATION_FAILED;
184 (*ptr)->OR_descr = (char *) malloc(strlen(descr) + 1);
185 if ((*ptr)->OR_descr == NULL) {
187 return SYS_ORTABLE_REGISTRATION_FAILED;
189 strcpy((*ptr)->OR_descr, descr);
190 (*ptr)->OR_oidlen = oidlen;
191 (*ptr)->OR_oid = (oid *) malloc(sizeof(oid) * oidlen);
192 if ((*ptr)->OR_oid == NULL) {
194 free((*ptr)->OR_descr);
195 return SYS_ORTABLE_REGISTRATION_FAILED;
197 memcpy((*ptr)->OR_oid, oidin, sizeof(oid) * oidlen);
198 gettimeofday(&((*ptr)->OR_uptime), NULL);
199 gettimeofday(&(sysOR_lastchange), NULL);
200 (*ptr)->OR_sess = ss;
204 reg_sysOR_parms.name = oidin;
205 reg_sysOR_parms.namelen = oidlen;
206 reg_sysOR_parms.descr = descr;
207 snmp_call_callbacks(SNMP_CALLBACK_APPLICATION,
208 SNMPD_CALLBACK_REG_SYSOR, ®_sysOR_parms);
210 return SYS_ORTABLE_REGISTERED_OK;
214 register_sysORTable(oid * oidin, size_t oidlen, const char *descr)
216 return register_sysORTable_sess(oidin, oidlen, descr, NULL);
222 unregister_sysORTable_sess(oid * oidin,
223 size_t oidlen, netsnmp_session * ss)
225 struct sysORTable **ptr = &table, *prev = NULL;
226 int found = SYS_ORTABLE_NO_SUCH_REGISTRATION;
227 struct register_sysOR_parameters reg_sysOR_parms;
229 DEBUGMSGTL(("mibII/sysORTable", "sysORTable unregistering: "));
230 DEBUGMSGOID(("mibII/sysORTable", oidin, oidlen));
231 DEBUGMSG(("mibII/sysORTable", "\n"));
233 while (*ptr != NULL) {
235 (oidin, oidlen, (*ptr)->OR_oid, (*ptr)->OR_oidlen) == 0) {
236 if ((*ptr)->OR_sess != ss)
237 continue; /* different session */
239 table = (*ptr)->next;
241 prev->next = (*ptr)->next;
243 free((*ptr)->OR_descr);
244 free((*ptr)->OR_oid);
247 gettimeofday(&(sysOR_lastchange), NULL);
248 found = SYS_ORTABLE_UNREGISTERED_OK;
252 ptr = &((*ptr)->next);
255 reg_sysOR_parms.name = oidin;
256 reg_sysOR_parms.namelen = oidlen;
257 snmp_call_callbacks(SNMP_CALLBACK_APPLICATION,
258 SNMPD_CALLBACK_UNREG_SYSOR, ®_sysOR_parms);
265 unregister_sysORTable(oid * oidin, size_t oidlen)
267 return unregister_sysORTable_sess(oidin, oidlen, NULL);
271 unregister_sysORTable_by_session(netsnmp_session * ss)
273 struct sysORTable *ptr = table, *prev = NULL, *next;
275 while (ptr != NULL) {
277 if (((ss->flags & SNMP_FLAGS_SUBSESSION) && ptr->OR_sess == ss) ||
278 (!(ss->flags & SNMP_FLAGS_SUBSESSION) && ptr->OR_sess &&
279 ptr->OR_sess->subsession == ss)) {
288 gettimeofday(&(sysOR_lastchange), NULL);
297 init_sysORTable(void)
301 #endif /* BUILD_SNMP_SYSOR_MIB */