1 #include <net-snmp/net-snmp-config.h>
12 #include <net-snmp/net-snmp-includes.h>
13 #include <net-snmp/agent/net-snmp-agent-includes.h>
15 #include "testhandler.h"
17 #include <net-snmp/agent/table.h>
18 #include <net-snmp/agent/instance.h>
19 #include <net-snmp/agent/table_data.h>
20 #include <net-snmp/agent/table_dataset.h>
22 static oid my_test_oid[4] = { 1, 2, 3, 4 };
23 static oid my_table_oid[4] = { 1, 2, 3, 5 };
24 static oid my_instance_oid[5] = { 1, 2, 3, 6, 1 };
25 static oid my_data_table_oid[4] = { 1, 2, 3, 7 };
26 static oid my_data_table_set_oid[4] = { 1, 2, 3, 8 };
27 static oid my_data_ulong_instance[4] = { 1, 2, 3, 9 };
32 init_testhandler(void)
35 * we're registering at .1.2.3.4
37 netsnmp_handler_registration *my_test;
38 netsnmp_table_registration_info *table_info;
40 netsnmp_table_data *table;
41 netsnmp_table_data_set *table_set;
42 netsnmp_table_row *row;
44 DEBUGMSGTL(("testhandler", "initializing\n"));
49 netsnmp_register_handler(netsnmp_create_handler_registration
50 ("myTest", my_test_handler, my_test_oid, 4,
54 * instance handler test
57 netsnmp_register_instance(netsnmp_create_handler_registration
58 ("myInstance", my_test_instance_handler,
59 my_instance_oid, 5, HANDLER_CAN_RWRITE));
61 netsnmp_register_ulong_instance("myulong",
62 my_data_ulong_instance, 4,
69 my_test = netsnmp_create_handler_registration("myTable",
70 my_test_table_handler,
76 table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
78 netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, ASN_INTEGER,
80 table_info->min_column = 3;
81 table_info->max_column = 3;
82 netsnmp_register_table(my_test, table_info);
85 * data table helper test
88 * we'll construct a simple table here with two indexes: an
89 * integer and a string (why not). It'll contain only one
90 * column so the data pointer is merely the data in that
94 table = netsnmp_create_table_data("data_table_test");
96 netsnmp_table_data_add_index(table, ASN_INTEGER);
97 netsnmp_table_data_add_index(table, ASN_OCTET_STR);
100 * 1 partridge in a pear tree
102 row = netsnmp_create_table_data_row();
104 netsnmp_table_row_add_index(row, ASN_INTEGER, &ind1, sizeof(ind1));
105 netsnmp_table_row_add_index(row, ASN_OCTET_STR, "partridge",
106 strlen("partridge"));
107 row->data = (void *) "pear tree";
108 netsnmp_table_data_add_row(table, row);
113 row = netsnmp_create_table_data_row();
115 netsnmp_table_row_add_index(row, ASN_INTEGER, &ind1, sizeof(ind1));
116 netsnmp_table_row_add_index(row, ASN_OCTET_STR, "turtle",
118 row->data = (void *) "doves";
119 netsnmp_table_data_add_row(table, row);
122 * we're going to register it as a normal table too, so we get the
123 * automatically parsed column and index information
125 table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
127 netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER,
129 table_info->min_column = 3;
130 table_info->max_column = 3;
132 netsnmp_register_read_only_table_data
133 (netsnmp_create_handler_registration
134 ("12days", my_data_table_handler, my_data_table_oid, 4,
135 HANDLER_CAN_RONLY), table, table_info);
140 my_test_handler(netsnmp_mib_handler *handler,
141 netsnmp_handler_registration *reginfo,
142 netsnmp_agent_request_info *reqinfo,
143 netsnmp_request_info *requests)
146 oid myoid1[] = { 1, 2, 3, 4, 5, 6 };
147 static u_long accesses = 0;
149 DEBUGMSGTL(("testhandler", "Got request:\n"));
151 * loop through requests
154 netsnmp_variable_list *var = requests->requestvb;
156 DEBUGMSGTL(("testhandler", " oid:"));
157 DEBUGMSGOID(("testhandler", var->name, var->name_length));
158 DEBUGMSG(("testhandler", "\n"));
160 switch (reqinfo->mode) {
162 if (netsnmp_oid_equals(var->name, var->name_length, myoid1, 6)
164 snmp_set_var_typed_value(var, ASN_INTEGER,
165 (u_char *) & accesses,
167 return SNMP_ERR_NOERROR;
172 if (snmp_oid_compare(var->name, var->name_length, myoid1, 6)
174 snmp_set_var_objid(var, myoid1, 6);
175 snmp_set_var_typed_value(var, ASN_INTEGER,
176 (u_char *) & accesses,
178 return SNMP_ERR_NOERROR;
183 netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_GENERR);
187 requests = requests->next;
189 return SNMP_ERR_NOERROR;
193 * functionally this is a simply a multiplication table for 12x12
196 #define MAX_COLONE 12
197 #define MAX_COLTWO 12
198 #define RESULT_COLUMN 3
200 my_test_table_handler(netsnmp_mib_handler *handler,
201 netsnmp_handler_registration *reginfo,
202 netsnmp_agent_request_info *reqinfo,
203 netsnmp_request_info *requests)
206 netsnmp_table_registration_info
222 (netsnmp_table_registration_info *) handler->prev->myvoid;
223 netsnmp_table_request_info *table_info;
229 netsnmp_variable_list *var = requests->requestvb;
231 if (requests->processed != 0)
234 DEBUGMSGTL(("testhandler_table", "Got request:\n"));
235 DEBUGMSGTL(("testhandler_table", " oid:"));
236 DEBUGMSGOID(("testhandler_table", var->name, var->name_length));
237 DEBUGMSG(("testhandler_table", "\n"));
239 table_info = netsnmp_extract_table_info(requests);
240 if (table_info == NULL) {
241 requests = requests->next;
245 switch (reqinfo->mode) {
248 * beyond our search range?
250 if (table_info->colnum > RESULT_COLUMN)
254 * below our minimum column?
256 if (table_info->colnum < RESULT_COLUMN ||
258 * or no index specified
260 table_info->indexes->val.integer == 0) {
261 table_info->colnum = RESULT_COLUMN;
265 x = *(table_info->indexes->val.integer);
266 y = *(table_info->indexes->next_variable->val.integer);
269 if (table_info->number_indexes ==
270 handler_reg_info->number_indexes) {
271 y++; /* GETNEXT is basically just y+1 for this table */
272 if (y > MAX_COLTWO) { /* (with wrapping) */
277 if (x <= MAX_COLONE) {
280 *(table_info->indexes->val.integer) = x;
281 *(table_info->indexes->next_variable->val.integer) = y;
282 netsnmp_table_build_result(reginfo, requests,
283 table_info, ASN_INTEGER,
291 if (var->type == ASN_NULL) { /* valid request if ASN_NULL */
293 * is it the right column?
295 if (table_info->colnum == RESULT_COLUMN &&
297 * and within the max boundries?
299 *(table_info->indexes->val.integer) <= MAX_COLONE &&
300 *(table_info->indexes->next_variable->val.integer)
304 * then, the result is column1 * column2
306 result = *(table_info->indexes->val.integer) *
307 *(table_info->indexes->next_variable->val.integer);
308 snmp_set_var_typed_value(var, ASN_INTEGER,
317 requests = requests->next;
320 return SNMP_ERR_NOERROR;
323 #define TESTHANDLER_SET_NAME "my_test"
325 my_test_instance_handler(netsnmp_mib_handler *handler,
326 netsnmp_handler_registration *reginfo,
327 netsnmp_agent_request_info *reqinfo,
328 netsnmp_request_info *requests)
331 static u_long accesses = 0;
332 u_long *accesses_cache = NULL;
334 DEBUGMSGTL(("testhandler", "Got instance request:\n"));
336 switch (reqinfo->mode) {
338 snmp_set_var_typed_value(requests->requestvb, ASN_UNSIGNED,
339 (u_char *) & accesses, sizeof(accesses));
342 case MODE_SET_RESERVE1:
343 if (requests->requestvb->type != ASN_UNSIGNED)
344 netsnmp_set_request_error(reqinfo, requests,
348 case MODE_SET_RESERVE2:
350 * store old info for undo later
352 memdup((u_char **) & accesses_cache,
353 (u_char *) & accesses, sizeof(accesses));
354 if (accesses_cache == NULL) {
355 netsnmp_set_request_error(reqinfo, requests,
356 SNMP_ERR_RESOURCEUNAVAILABLE);
357 return SNMP_ERR_NOERROR;
359 netsnmp_request_add_list_data(requests,
360 netsnmp_create_data_list
361 (TESTHANDLER_SET_NAME,
362 accesses_cache, free));
365 case MODE_SET_ACTION:
369 accesses = *(requests->requestvb->val.integer);
370 DEBUGMSGTL(("testhandler", "updated accesses -> %d\n", accesses));
375 *((u_long *) netsnmp_request_get_list_data(requests,
376 TESTHANDLER_SET_NAME));
379 case MODE_SET_COMMIT:
387 return SNMP_ERR_NOERROR;
391 my_data_table_handler(netsnmp_mib_handler *handler,
392 netsnmp_handler_registration *reginfo,
393 netsnmp_agent_request_info *reqinfo,
394 netsnmp_request_info *requests)
398 netsnmp_table_request_info *table_info;
399 netsnmp_table_row *row;
402 if (requests->processed)
406 * extract our stored data and table info
408 row = netsnmp_extract_table_row(requests);
409 table_info = netsnmp_extract_table_info(requests);
411 column3 = (char *) row->data;
412 if (!row || !table_info || !column3)
416 * there's only one column, we don't need to check if it's right
418 netsnmp_table_data_build_result(reginfo, reqinfo, requests, row,
420 ASN_OCTET_STR, column3,
422 requests = requests->next;
424 return SNMP_ERR_NOERROR;