00001 /* 00002 * Note: this file originally auto-generated by mib2c using 00003 * : mib2c.iterate_access.conf,v 1.4 2003/07/01 00:15:11 hardaker Exp $ 00004 */ 00005 00006 #include <net-snmp/net-snmp-config.h> 00007 #include <net-snmp/net-snmp-includes.h> 00008 #include <net-snmp/agent/net-snmp-agent-includes.h> 00009 #include "netSnmpHostsTable.h" 00010 #include "netSnmpHostsTable_checkfns.h" 00011 #include "netSnmpHostsTable_access.h" 00012 00013 static netsnmp_oid_stash_node *undoStorage = NULL; 00014 static netsnmp_oid_stash_node *commitStorage = NULL; 00015 00016 struct undoInfo { 00017 void *ptr; 00018 size_t len; 00019 }; 00020 00021 struct commitInfo { 00022 void *data_context; 00023 int have_committed; 00024 int new_row; 00025 }; 00026 00027 void 00028 netSnmpHostsTable_free_undoInfo(void *vptr) 00029 { 00030 struct undoInfo *ui = vptr; 00031 if (!ui) 00032 return; 00033 SNMP_FREE(ui->ptr); 00034 SNMP_FREE(ui); 00035 } 00036 00038 void 00039 initialize_table_netSnmpHostsTable(void) 00040 { 00041 static oid netSnmpHostsTable_oid[] = 00042 { 1, 3, 6, 1, 4, 1, 8072, 2, 2, 2 }; 00043 netsnmp_table_registration_info *table_info; 00044 netsnmp_handler_registration *my_handler; 00045 netsnmp_iterator_info *iinfo; 00046 00048 table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); 00049 iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info); 00050 00053 my_handler = netsnmp_create_handler_registration("netSnmpHostsTable", 00054 netSnmpHostsTable_handler, 00055 netSnmpHostsTable_oid, 00056 OID_LENGTH 00057 (netSnmpHostsTable_oid), 00058 HANDLER_CAN_RWRITE); 00059 00060 if (!my_handler || !table_info || !iinfo) { 00061 snmp_log(LOG_ERR, 00062 "malloc failed in initialize_table_netSnmpHostsTable"); 00063 return; 00064 } 00065 00066 /*************************************************** 00067 * Setting up the table's definition 00068 */ 00069 netsnmp_table_helper_add_indexes(table_info, ASN_OCTET_STR, 00071 0); 00072 00075 table_info->min_column = 2; 00076 table_info->max_column = 5; 00077 00079 iinfo->get_first_data_point = netSnmpHostsTable_get_first_data_point; 00080 iinfo->get_next_data_point = netSnmpHostsTable_get_next_data_point; 00081 00083 iinfo->make_data_context = netSnmpHostsTable_context_convert_function; 00084 iinfo->free_data_context = netSnmpHostsTable_data_free; 00085 iinfo->free_loop_context_at_end = netSnmpHostsTable_loop_free; 00086 00088 iinfo->table_reginfo = table_info; 00089 00090 /*************************************************** 00091 * registering the table with the master agent 00092 */ 00093 DEBUGMSGTL(("initialize_table_netSnmpHostsTable", 00094 "Registering table netSnmpHostsTable as a table iterator\n")); 00095 netsnmp_register_table_iterator(my_handler, iinfo); 00096 } 00097 00099 void 00100 init_netSnmpHostsTable(void) 00101 { 00102 00104 initialize_table_netSnmpHostsTable(); 00105 } 00106 00108 int 00109 netSnmpHostsTable_handler(netsnmp_mib_handler *handler, 00110 netsnmp_handler_registration *reginfo, 00111 netsnmp_agent_request_info *reqinfo, 00112 netsnmp_request_info *requests) 00113 { 00114 00115 netsnmp_request_info *request; 00116 netsnmp_table_request_info *table_info; 00117 struct commitInfo *ci = NULL; 00118 00119 void *data_context = NULL; 00120 00121 for (request = requests; request; request = request->next) { 00122 /* column and row index encoded portion */ 00123 netsnmp_variable_list *var = request->requestvb; 00124 const oid * const suffix = var->name + reginfo->rootoid_len + 1; 00125 const size_t suffix_len = var->name_length - (reginfo->rootoid_len + 1); 00126 00127 if (request->processed != 0) 00128 continue; 00129 00130 switch (reqinfo->mode) { 00131 case MODE_GET: 00132 case MODE_SET_RESERVE1: 00133 data_context = netsnmp_extract_iterator_context(request); 00134 if (data_context == NULL) { 00135 if (reqinfo->mode == MODE_GET) { 00136 netsnmp_set_request_error(reqinfo, request, 00137 SNMP_NOSUCHINSTANCE); 00138 continue; 00139 } 00140 } 00141 break; 00142 00143 default: /* == the other SET modes */ 00144 ci = netsnmp_oid_stash_get_data(commitStorage, 00145 suffix + 1, suffix_len - 1); 00146 break; 00147 00148 } 00149 00151 table_info = netsnmp_extract_table_info(request); 00157 if (table_info == NULL) { 00158 continue; 00159 } 00160 00161 switch (reqinfo->mode) { 00162 case MODE_GET: 00163 switch (table_info->colnum) { 00164 case COLUMN_NETSNMPHOSTADDRESSTYPE: 00165 { 00166 long *retval; 00167 size_t retval_len = 0; 00168 retval = 00169 get_netSnmpHostAddressType(data_context, 00170 &retval_len); 00171 snmp_set_var_typed_value(var, ASN_INTEGER, 00172 (const u_char *) retval, 00173 retval_len); 00174 } 00175 break; 00176 00177 case COLUMN_NETSNMPHOSTADDRESS: 00178 { 00179 char *retval; 00180 size_t retval_len = 0; 00181 retval = 00182 get_netSnmpHostAddress(data_context, &retval_len); 00183 snmp_set_var_typed_value(var, ASN_OCTET_STR, 00184 (const u_char *) retval, 00185 retval_len); 00186 } 00187 break; 00188 00189 case COLUMN_NETSNMPHOSTSTORAGE: 00190 { 00191 long *retval; 00192 size_t retval_len = 0; 00193 retval = 00194 get_netSnmpHostStorage(data_context, &retval_len); 00195 snmp_set_var_typed_value(var, ASN_INTEGER, 00196 (const u_char *) retval, 00197 retval_len); 00198 } 00199 break; 00200 00201 case COLUMN_NETSNMPHOSTROWSTATUS: 00202 { 00203 long *retval; 00204 size_t retval_len = 0; 00205 retval = 00206 get_netSnmpHostRowStatus(data_context, 00207 &retval_len); 00208 snmp_set_var_typed_value(var, ASN_INTEGER, 00209 (const u_char *) retval, 00210 retval_len); 00211 } 00212 break; 00213 00214 default: 00216 snmp_log(LOG_ERR, 00217 "problem encountered in netSnmpHostsTable_handler: unknown column\n"); 00218 } 00219 break; 00220 00221 case MODE_SET_RESERVE1: 00222 ci = netsnmp_oid_stash_get_data(commitStorage, 00223 suffix + 1, suffix_len - 1); 00224 00225 if (!ci) { 00227 ci = SNMP_MALLOC_STRUCT(commitInfo); 00228 if (!data_context) { 00229 ci->data_context = 00230 netSnmpHostsTable_create_data_context(table_info-> 00231 indexes); 00232 ci->new_row = 1; 00233 } else { 00234 ci->data_context = data_context; 00235 } 00236 netsnmp_oid_stash_add_data(&commitStorage, 00237 suffix + 1, suffix_len - 1, ci); 00238 } 00239 break; 00240 00241 case MODE_SET_RESERVE2: 00242 switch (table_info->colnum) { 00243 case COLUMN_NETSNMPHOSTADDRESSTYPE: 00244 { 00245 long *retval; 00246 size_t retval_len = 0; 00247 struct undoInfo *ui = NULL; 00248 int ret; 00249 00251 retval = 00252 get_netSnmpHostAddressType(ci->data_context, 00253 &retval_len); 00254 if (retval) { 00255 ui = SNMP_MALLOC_STRUCT(undoInfo); 00256 ui->len = retval_len; 00257 memdup((u_char **) & ui->ptr, 00258 (u_char *) retval, ui->len); 00259 } 00260 00263 ret = 00264 check_netSnmpHostAddressType(request->requestvb-> 00265 type, 00266 (long *) request-> 00267 requestvb->val.string, 00268 request->requestvb-> 00269 val_len, retval, 00270 retval_len); 00271 if (ret != 0) { 00272 netsnmp_set_request_error(reqinfo, request, ret); 00273 netSnmpHostsTable_free_undoInfo(ui); 00274 } else if (ui) { 00276 netsnmp_oid_stash_add_data(&undoStorage, 00277 suffix, suffix_len, ui); 00278 } 00279 00280 } 00281 break; 00282 case COLUMN_NETSNMPHOSTADDRESS: 00283 { 00284 char *retval; 00285 size_t retval_len = 0; 00286 struct undoInfo *ui = NULL; 00287 int ret; 00288 00290 retval = 00291 get_netSnmpHostAddress(ci->data_context, 00292 &retval_len); 00293 if (retval) { 00294 ui = SNMP_MALLOC_STRUCT(undoInfo); 00295 ui->len = retval_len; 00296 memdup((u_char **) & ui->ptr, 00297 (u_char *) retval, ui->len); 00298 } 00299 00302 ret = 00303 check_netSnmpHostAddress(request->requestvb->type, 00304 (char *) request-> 00305 requestvb->val.string, 00306 request->requestvb-> 00307 val_len, retval, 00308 retval_len); 00309 if (ret != 0) { 00310 netsnmp_set_request_error(reqinfo, request, ret); 00311 netSnmpHostsTable_free_undoInfo(ui); 00312 } else if (ui) { 00314 netsnmp_oid_stash_add_data(&undoStorage, 00315 suffix, suffix_len, ui); 00316 } 00317 00318 } 00319 break; 00320 case COLUMN_NETSNMPHOSTSTORAGE: 00321 { 00322 long *retval; 00323 size_t retval_len = 0; 00324 struct undoInfo *ui = NULL; 00325 int ret; 00326 00328 retval = 00329 get_netSnmpHostStorage(ci->data_context, 00330 &retval_len); 00331 if (retval) { 00332 ui = SNMP_MALLOC_STRUCT(undoInfo); 00333 ui->len = retval_len; 00334 memdup((u_char **) & ui->ptr, 00335 (u_char *) retval, ui->len); 00336 } 00337 00340 ret = 00341 check_netSnmpHostStorage(request->requestvb->type, 00342 (long *) request-> 00343 requestvb->val.string, 00344 request->requestvb-> 00345 val_len, retval, 00346 retval_len); 00347 if (ret != 0) { 00348 netsnmp_set_request_error(reqinfo, request, ret); 00349 netSnmpHostsTable_free_undoInfo(ui); 00350 } else if (ui) { 00352 netsnmp_oid_stash_add_data(&undoStorage, 00353 suffix, suffix_len, ui); 00354 } 00355 00356 } 00357 break; 00358 case COLUMN_NETSNMPHOSTROWSTATUS: 00359 { 00360 long *retval; 00361 size_t retval_len = 0; 00362 struct undoInfo *ui = NULL; 00363 int ret; 00364 00366 retval = 00367 get_netSnmpHostRowStatus(ci->data_context, 00368 &retval_len); 00369 if (retval) { 00370 ui = SNMP_MALLOC_STRUCT(undoInfo); 00371 ui->len = retval_len; 00372 memdup((u_char **) & ui->ptr, 00373 (u_char *) retval, ui->len); 00374 } 00375 00378 ret = 00379 check_netSnmpHostRowStatus(request->requestvb-> 00380 type, 00381 (long *) request-> 00382 requestvb->val.string, 00383 request->requestvb-> 00384 val_len, retval, 00385 retval_len); 00386 if (ret != 0) { 00387 netsnmp_set_request_error(reqinfo, request, ret); 00388 netSnmpHostsTable_free_undoInfo(ui); 00389 } else if (ui) { 00391 netsnmp_oid_stash_add_data(&undoStorage, 00392 suffix, suffix_len, ui); 00393 } 00394 00395 } 00396 break; 00397 default: 00398 netsnmp_set_request_error(reqinfo, request, 00399 SNMP_ERR_NOTWRITABLE); 00400 break; 00401 } 00402 break; 00403 00404 case MODE_SET_ACTION: 00406 switch (table_info->colnum) { 00407 case COLUMN_NETSNMPHOSTADDRESSTYPE: 00408 { 00409 int ret; 00410 ret = set_netSnmpHostAddressType(ci->data_context, 00411 (long *) request-> 00412 requestvb->val.string, 00413 request->requestvb-> 00414 val_len); 00415 if (ret) { 00416 netsnmp_set_request_error(reqinfo, request, ret); 00417 } 00418 } 00419 break; 00420 case COLUMN_NETSNMPHOSTADDRESS: 00421 { 00422 int ret; 00423 ret = set_netSnmpHostAddress(ci->data_context, 00424 (char *) request-> 00425 requestvb->val.string, 00426 request->requestvb-> 00427 val_len); 00428 if (ret) { 00429 netsnmp_set_request_error(reqinfo, request, ret); 00430 } 00431 } 00432 break; 00433 case COLUMN_NETSNMPHOSTSTORAGE: 00434 { 00435 int ret; 00436 ret = set_netSnmpHostStorage(ci->data_context, 00437 (long *) request-> 00438 requestvb->val.string, 00439 request->requestvb-> 00440 val_len); 00441 if (ret) { 00442 netsnmp_set_request_error(reqinfo, request, ret); 00443 } 00444 } 00445 break; 00446 case COLUMN_NETSNMPHOSTROWSTATUS: 00447 { 00448 int ret; 00449 ret = set_netSnmpHostRowStatus(ci->data_context, 00450 (long *) request-> 00451 requestvb->val.string, 00452 request->requestvb-> 00453 val_len); 00454 if (ret) { 00455 netsnmp_set_request_error(reqinfo, request, ret); 00456 } 00457 if (*request->requestvb->val.integer == RS_DESTROY) { 00458 ci->new_row = -1; 00459 } 00460 } 00461 break; 00462 } 00463 break; 00464 00465 case MODE_SET_COMMIT: 00466 if (!ci->have_committed) { 00468 netSnmpHostsTable_commit_row(&ci->data_context, 00469 ci->new_row); 00470 ci->have_committed = 1; 00471 } 00472 break; 00473 00474 case MODE_SET_UNDO: 00476 switch (table_info->colnum) { 00477 case COLUMN_NETSNMPHOSTADDRESSTYPE: 00478 { 00479 int retval; 00480 struct undoInfo *ui; 00481 ui = netsnmp_oid_stash_get_data(undoStorage, 00482 suffix, suffix_len); 00483 retval = 00484 set_netSnmpHostAddressType(ci->data_context, 00485 ui->ptr, ui->len); 00486 if (retval) { 00487 netsnmp_set_request_error(reqinfo, request, 00488 SNMP_ERR_UNDOFAILED); 00489 } 00490 } 00491 break; 00492 case COLUMN_NETSNMPHOSTADDRESS: 00493 { 00494 int retval; 00495 struct undoInfo *ui; 00496 ui = netsnmp_oid_stash_get_data(undoStorage, 00497 suffix, suffix_len); 00498 retval = 00499 set_netSnmpHostAddress(ci->data_context, ui->ptr, 00500 ui->len); 00501 if (retval) { 00502 netsnmp_set_request_error(reqinfo, request, 00503 SNMP_ERR_UNDOFAILED); 00504 } 00505 } 00506 break; 00507 case COLUMN_NETSNMPHOSTSTORAGE: 00508 { 00509 int retval; 00510 struct undoInfo *ui; 00511 ui = netsnmp_oid_stash_get_data(undoStorage, 00512 suffix, suffix_len); 00513 retval = 00514 set_netSnmpHostStorage(ci->data_context, ui->ptr, 00515 ui->len); 00516 if (retval) { 00517 netsnmp_set_request_error(reqinfo, request, 00518 SNMP_ERR_UNDOFAILED); 00519 } 00520 } 00521 break; 00522 case COLUMN_NETSNMPHOSTROWSTATUS: 00523 { 00524 int retval; 00525 struct undoInfo *ui; 00526 ui = netsnmp_oid_stash_get_data(undoStorage, 00527 suffix, suffix_len); 00528 retval = 00529 set_netSnmpHostRowStatus(ci->data_context, ui->ptr, 00530 ui->len); 00531 if (retval) { 00532 netsnmp_set_request_error(reqinfo, request, 00533 SNMP_ERR_UNDOFAILED); 00534 } 00535 } 00536 break; 00537 } 00538 break; 00539 00540 case MODE_SET_FREE: 00541 break; 00542 00543 default: 00544 snmp_log(LOG_ERR, 00545 "problem encountered in netSnmpHostsTable_handler: unsupported mode\n"); 00546 } 00547 } 00548 00550 switch (reqinfo->mode) { 00551 case MODE_SET_UNDO: 00552 case MODE_SET_FREE: 00553 case MODE_SET_COMMIT: 00555 netsnmp_oid_stash_free(&undoStorage, 00556 netSnmpHostsTable_free_undoInfo); 00557 netsnmp_oid_stash_free(&commitStorage, netsnmp_oid_stash_no_free); 00558 } 00559 00560 00561 return SNMP_ERR_NOERROR; 00562 }
1.5.7.1
Last modified: Tuesday, 23-Dec-2025 17:22:04 UTC
For questions regarding web content and site functionality, please write to the net-snmp-users mail list.