1 #include <net-snmp/net-snmp-config.h>
10 #include <net-snmp/net-snmp-includes.h>
11 #include <net-snmp/agent/net-snmp-agent-includes.h>
13 #include <net-snmp/agent/instance.h>
14 #include <net-snmp/agent/serialize.h>
15 #include <net-snmp/agent/read_only.h>
21 /** @defgroup instance instance: process scalars and other instances easily.
26 netsnmp_get_instance_handler(void)
28 return netsnmp_create_handler("instance",
29 netsnmp_instance_helper_handler);
33 netsnmp_register_instance(netsnmp_handler_registration *reginfo)
35 netsnmp_inject_handler(reginfo, netsnmp_get_instance_handler());
36 return netsnmp_register_serialize(reginfo);
40 netsnmp_register_read_only_instance(netsnmp_handler_registration *reginfo)
42 netsnmp_inject_handler(reginfo, netsnmp_get_instance_handler());
43 netsnmp_inject_handler(reginfo, netsnmp_get_read_only_handler());
44 return netsnmp_register_serialize(reginfo);
48 netsnmp_handler_registration *
49 get_reg(const char *name,
51 oid * reg_oid, size_t reg_oid_len,
54 Netsnmp_Node_Handler * scalarh, Netsnmp_Node_Handler * subhandler)
56 netsnmp_handler_registration *myreg;
57 netsnmp_mib_handler *myhandler;
61 netsnmp_create_handler_registration(name,
65 myhandler = netsnmp_create_handler(ourname, scalarh);
66 myhandler->myvoid = (void *) it;
67 netsnmp_inject_handler(myreg, myhandler);
70 netsnmp_create_handler_registration(name,
74 myreg->handler->myvoid = (void *) it;
80 netsnmp_register_read_only_ulong_instance(const char *name,
82 size_t reg_oid_len, u_long * it,
83 Netsnmp_Node_Handler *
86 netsnmp_handler_registration *myreg;
88 myreg = get_reg(name, "ulong_handler", reg_oid, reg_oid_len, it,
89 HANDLER_CAN_RONLY, netsnmp_instance_ulong_handler,
91 return netsnmp_register_read_only_instance(myreg);
95 netsnmp_register_ulong_instance(const char *name,
96 oid * reg_oid, size_t reg_oid_len,
98 Netsnmp_Node_Handler * subhandler)
100 netsnmp_handler_registration *myreg;
102 myreg = get_reg(name, "ulong_handler", reg_oid, reg_oid_len, it,
103 HANDLER_CAN_RWRITE, netsnmp_instance_ulong_handler,
105 return netsnmp_register_instance(myreg);
109 netsnmp_register_read_only_counter32_instance(const char *name,
113 Netsnmp_Node_Handler *
116 netsnmp_handler_registration *myreg;
118 myreg = get_reg(name, "counter32_handler", reg_oid, reg_oid_len, it,
119 HANDLER_CAN_RWRITE, netsnmp_instance_counter32_handler,
121 return netsnmp_register_read_only_instance(myreg);
125 netsnmp_register_read_only_long_instance(const char *name,
126 oid * reg_oid, size_t reg_oid_len,
128 Netsnmp_Node_Handler * subhandler)
130 netsnmp_handler_registration *myreg;
132 myreg = get_reg(name, "long_handler", reg_oid, reg_oid_len, it,
133 HANDLER_CAN_RONLY, netsnmp_instance_long_handler,
135 return netsnmp_register_read_only_instance(myreg);
139 netsnmp_register_long_instance(const char *name,
140 oid * reg_oid, size_t reg_oid_len,
141 long *it, Netsnmp_Node_Handler * subhandler)
143 netsnmp_handler_registration *myreg;
145 myreg = get_reg(name, "long_handler", reg_oid, reg_oid_len, it,
146 HANDLER_CAN_RWRITE, netsnmp_instance_long_handler,
148 return netsnmp_register_instance(myreg);
152 netsnmp_register_read_only_int_instance(const char *name,
153 oid * reg_oid, size_t reg_oid_len,
154 int *it, Netsnmp_Node_Handler * subhandler)
156 netsnmp_handler_registration *myreg;
158 myreg = get_reg(name, "int_handler", reg_oid, reg_oid_len, it,
159 HANDLER_CAN_RONLY, netsnmp_instance_int_handler,
161 return netsnmp_register_read_only_instance(myreg);
165 * Compatibility with earlier (inconsistently named) routine
168 register_read_only_int_instance(const char *name,
169 oid * reg_oid, size_t reg_oid_len,
170 int *it, Netsnmp_Node_Handler * subhandler)
172 return netsnmp_register_read_only_int_instance(name,
173 reg_oid, reg_oid_len,
178 netsnmp_register_int_instance(const char *name,
179 oid * reg_oid, size_t reg_oid_len,
180 int *it, Netsnmp_Node_Handler * subhandler)
182 netsnmp_handler_registration *myreg;
184 myreg = get_reg(name, "int_handler", reg_oid, reg_oid_len, it,
185 HANDLER_CAN_RWRITE, netsnmp_instance_int_handler,
187 return netsnmp_register_instance(myreg);
191 netsnmp_instance_ulong_handler(netsnmp_mib_handler *handler,
192 netsnmp_handler_registration *reginfo,
193 netsnmp_agent_request_info *reqinfo,
194 netsnmp_request_info *requests)
197 u_long *it = (u_long *) handler->myvoid;
200 DEBUGMSGTL(("netsnmp_instance_ulong_handler", "Got request: %d\n",
203 switch (reqinfo->mode) {
208 snmp_set_var_typed_value(requests->requestvb, ASN_UNSIGNED,
209 (u_char *) it, sizeof(*it));
213 * SET requests. Should only get here if registered RWRITE
215 case MODE_SET_RESERVE1:
216 if (requests->requestvb->type != ASN_UNSIGNED)
217 netsnmp_set_request_error(reqinfo, requests,
221 case MODE_SET_RESERVE2:
223 * store old info for undo later
225 memdup((u_char **) & it_save, (u_char *) it, sizeof(u_long));
226 if (it_save == NULL) {
227 netsnmp_set_request_error(reqinfo, requests,
228 SNMP_ERR_RESOURCEUNAVAILABLE);
229 return SNMP_ERR_NOERROR;
231 netsnmp_request_add_list_data(requests,
232 netsnmp_create_data_list
233 (INSTANCE_HANDLER_NAME, it_save,
237 case MODE_SET_ACTION:
241 DEBUGMSGTL(("testhandler", "updated u_long %ul -> %ul\n", *it,
242 *(requests->requestvb->val.integer)));
243 *it = *(requests->requestvb->val.integer);
248 *((u_long *) netsnmp_request_get_list_data(requests,
249 INSTANCE_HANDLER_NAME));
252 case MODE_SET_COMMIT:
260 if (handler->next && handler->next->access_method)
261 return netsnmp_call_next_handler(handler, reginfo, reqinfo,
264 return SNMP_ERR_NOERROR;
268 netsnmp_instance_counter32_handler(netsnmp_mib_handler *handler,
269 netsnmp_handler_registration *reginfo,
270 netsnmp_agent_request_info *reqinfo,
271 netsnmp_request_info *requests)
274 u_long *it = (u_long *) handler->myvoid;
276 DEBUGMSGTL(("netsnmp_instance_counter32_handler",
277 "Got request: %d\n", reqinfo->mode));
279 switch (reqinfo->mode) {
284 snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER,
285 (u_char *) it, sizeof(*it));
289 * SET requests. Should only get here if registered RWRITE
293 "netsnmp_instance_counter32_handler: illegal mode\n");
294 netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_GENERR);
295 return SNMP_ERR_NOERROR;
297 if (handler->next && handler->next->access_method)
298 return netsnmp_call_next_handler(handler, reginfo, reqinfo,
300 return SNMP_ERR_NOERROR;
304 netsnmp_instance_long_handler(netsnmp_mib_handler *handler,
305 netsnmp_handler_registration *reginfo,
306 netsnmp_agent_request_info *reqinfo,
307 netsnmp_request_info *requests)
310 long *it = (u_long *) handler->myvoid;
313 DEBUGMSGTL(("netsnmp_instance_long_handler", "Got request: %d\n",
316 switch (reqinfo->mode) {
321 snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
322 (u_char *) it, sizeof(*it));
326 * SET requests. Should only get here if registered RWRITE
328 case MODE_SET_RESERVE1:
329 if (requests->requestvb->type != ASN_INTEGER)
330 netsnmp_set_request_error(reqinfo, requests,
334 case MODE_SET_RESERVE2:
336 * store old info for undo later
338 memdup((u_char **) & it_save, (u_char *) it, sizeof(u_long));
339 if (it_save == NULL) {
340 netsnmp_set_request_error(reqinfo, requests,
341 SNMP_ERR_RESOURCEUNAVAILABLE);
342 return SNMP_ERR_NOERROR;
344 netsnmp_request_add_list_data(requests,
345 netsnmp_create_data_list
346 (INSTANCE_HANDLER_NAME, it_save,
350 case MODE_SET_ACTION:
354 DEBUGMSGTL(("testhandler", "updated u_long %ul -> %ul\n", *it,
355 *(requests->requestvb->val.integer)));
356 *it = *(requests->requestvb->val.integer);
361 *((u_long *) netsnmp_request_get_list_data(requests,
362 INSTANCE_HANDLER_NAME));
365 case MODE_SET_COMMIT:
372 if (handler->next && handler->next->access_method)
373 return netsnmp_call_next_handler(handler, reginfo, reqinfo,
375 return SNMP_ERR_NOERROR;
379 netsnmp_instance_int_handler(netsnmp_mib_handler *handler,
380 netsnmp_handler_registration *reginfo,
381 netsnmp_agent_request_info *reqinfo,
382 netsnmp_request_info *requests)
385 int *it = (u_int *) handler->myvoid;
388 DEBUGMSGTL(("netsnmp_instance_int_handler", "Got request: %d\n",
391 switch (reqinfo->mode) {
396 snmp_set_var_typed_value(requests->requestvb, ASN_INTEGER,
397 (u_char *) it, sizeof(*it));
401 * SET requests. Should only get here if registered RWRITE
403 case MODE_SET_RESERVE1:
404 if (requests->requestvb->type != ASN_INTEGER)
405 netsnmp_set_request_error(reqinfo, requests,
409 case MODE_SET_RESERVE2:
411 * store old info for undo later
413 memdup((u_char **) & it_save, (u_char *) it, sizeof(u_long));
414 if (it_save == NULL) {
415 netsnmp_set_request_error(reqinfo, requests,
416 SNMP_ERR_RESOURCEUNAVAILABLE);
417 return SNMP_ERR_NOERROR;
419 netsnmp_request_add_list_data(requests,
420 netsnmp_create_data_list
421 (INSTANCE_HANDLER_NAME, it_save,
425 case MODE_SET_ACTION:
429 DEBUGMSGTL(("testhandler", "updated int %d -> %l\n", *it,
430 *(requests->requestvb->val.integer)));
431 *it = (int) *(requests->requestvb->val.integer);
436 *((u_int *) netsnmp_request_get_list_data(requests,
437 INSTANCE_HANDLER_NAME));
440 case MODE_SET_COMMIT:
447 if (handler->next && handler->next->access_method)
448 return netsnmp_call_next_handler(handler, reginfo, reqinfo,
450 return SNMP_ERR_NOERROR;
454 netsnmp_instance_helper_handler(netsnmp_mib_handler *handler,
455 netsnmp_handler_registration *reginfo,
456 netsnmp_agent_request_info *reqinfo,
457 netsnmp_request_info *requests)
460 netsnmp_variable_list *var = requests->requestvb;
464 DEBUGMSGTL(("helper:instance", "Got request:\n"));
465 cmp = snmp_oid_compare(requests->requestvb->name,
466 requests->requestvb->name_length,
467 reginfo->rootoid, reginfo->rootoid_len);
469 DEBUGMSGTL(("helper:instance", " oid:", cmp));
470 DEBUGMSGOID(("helper:instance", var->name, var->name_length));
471 DEBUGMSG(("helper:instance", "\n"));
473 switch (reqinfo->mode) {
476 netsnmp_set_request_error(reqinfo, requests,
477 SNMP_NOSUCHINSTANCE);
478 return SNMP_ERR_NOERROR;
480 return netsnmp_call_next_handler(handler, reginfo, reqinfo,
485 case MODE_SET_RESERVE1:
486 case MODE_SET_RESERVE2:
487 case MODE_SET_ACTION:
488 case MODE_SET_COMMIT:
492 netsnmp_set_request_error(reqinfo, requests,
493 SNMP_ERR_NOCREATION);
494 return SNMP_ERR_NOERROR;
496 return netsnmp_call_next_handler(handler, reginfo, reqinfo,
502 if (cmp < 0 || (cmp == 0 && requests->inclusive)) {
503 reqinfo->mode = MODE_GET;
504 snmp_set_var_objid(requests->requestvb, reginfo->rootoid,
505 reginfo->rootoid_len);
507 netsnmp_call_next_handler(handler, reginfo, reqinfo,
509 reqinfo->mode = MODE_GETNEXT;
512 return SNMP_ERR_NOERROR;
517 * got here only if illegal mode found
519 return SNMP_ERR_GENERR;