/** * @internal * wrapper */ static int _mfd_dot11ConfTotalTrapGroupTable_post_request(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *agtreq_info, netsnmp_request_info *requests) { dot11ConfTotalTrapGroupTable_rowreq_ctx *rowreq_ctx; int rc = dot11ConfTotalTrapGroupTable_post_request(dot11ConfTotalTrapGroupTable_if_ctx.user_ctx); if (MFD_SUCCESS != rc) { /* * nothing we can do about it but log it */ DEBUGMSGTL(("internal:dot11ConfTotalTrapGroupTable","error %d from " "dot11ConfTotalTrapGroupTable_post_request\n", rc)); } /* * if there are no errors, check for and handle row creation/deletion */ rc = netsnmp_check_requests_error(requests); if ((SNMP_ERR_NOERROR == rc) && (NULL != (rowreq_ctx = netsnmp_container_table_row_extract(requests)))) { if (rowreq_ctx->rowreq_flags & MFD_ROW_CREATED) { rowreq_ctx->rowreq_flags &= ~MFD_ROW_CREATED; CONTAINER_INSERT(dot11ConfTotalTrapGroupTable_if_ctx.container, rowreq_ctx); } else if (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED) { CONTAINER_REMOVE(dot11ConfTotalTrapGroupTable_if_ctx.container, rowreq_ctx); dot11ConfTotalTrapGroupTable_release_rowreq_ctx(rowreq_ctx); } } return SNMP_ERR_NOERROR; } /* _mfd_dot11ConfTotalTrapGroupTable_post_request */
/** @internal Implements the baby_steps handler */ static int _baby_steps_helper(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests) { netsnmp_baby_steps_modes *bs_modes; int save_mode, i, rc = SNMP_ERR_NOERROR; u_short *mode_map_ptr; DEBUGMSGTL(("baby_steps", "Got request, mode %s\n", se_find_label_in_slist("agent_mode",reqinfo->mode))); bs_modes = handler->myvoid; netsnmp_assert(NULL != bs_modes); switch (reqinfo->mode) { case MODE_SET_RESERVE1: /* * clear completed modes * xxx-rks: this will break for pdus with set requests to different * rows in the same table when the handler is set up to use the row * merge helper as well (or if requests are serialized). */ bs_modes->completed = 0; /** fall through */ case MODE_SET_RESERVE2: case MODE_SET_ACTION: case MODE_SET_COMMIT: case MODE_SET_FREE: case MODE_SET_UNDO: mode_map_ptr = set_mode_map[reqinfo->mode]; break; default: /* * clear completed modes */ bs_modes->completed = 0; mode_map_ptr = get_mode_map; } /* * NOTE: if you update this chart, please update the versions in * local/mib2c-conf.d/parent-set.m2i * agent/mibgroup/helpers/baby_steps.c * while you're at it. */ /* *********************************************************************** * Baby Steps Flow Chart (2004.06.05) * * * * +--------------+ +================+ U = unconditional path * * |optional state| ||required state|| S = path for success * * +--------------+ +================+ E = path for error * *********************************************************************** * * +--------------+ * | pre | * | request | * +--------------+ * | U * +-------------+ +==============+ * | row |f|<-------|| object || * | create |1| E || lookup || * +-------------+ +==============+ * E | | S | S * | +------------------>| * | +==============+ * | E || check || * |<---------------|| values || * | +==============+ * | | S * | +==============+ * | +<-------|| undo || * | | E || setup || * | | +==============+ * | | | S * | | +==============+ * | | || set ||-------------------------->+ * | | || value || E | * | | +==============+ | * | | | S | * | | +--------------+ | * | | | check |-------------------------->| * | | | consistency | E | * | | +--------------+ | * | | | S | * | | +==============+ +==============+ | * | | || commit ||-------->|| undo || | * | | || || E || commit || | * | | +==============+ +==============+ | * | | | S U |<--------+ * | | +--------------+ +==============+ * | | | irreversible | || undo || * | | | commit | || set || * | | +--------------+ +==============+ * | | | U U | * | +-------------->|<------------------------+ * | +==============+ * | || undo || * | || cleanup || * | +==============+ * +---------------------->| U * | * (err && f1)------------------->+ * | | * +--------------+ +--------------+ * | post |<--------| row | * | request | U | release | * +--------------+ +--------------+ * */ /* * save original mode */ save_mode = reqinfo->mode; for(i = 0; i < BABY_STEPS_PER_MODE_MAX; ++i ) { /* * break if we run out of baby steps for this mode */ if(mode_map_ptr[i] == BABY_STEP_NONE) break; DEBUGMSGTL(("baby_steps", " baby step mode %s\n", se_find_label_in_slist("babystep_mode",mode_map_ptr[i]))); /* * skip modes the handler didn't register for */ if (BSTEP_USE_ORIGINAL != mode_map_ptr[i]) { u_int mode_flag; /* * skip undo commit if commit wasn't hit, and * undo_cleanup if undo_setup wasn't hit. */ if((MODE_SET_UNDO == save_mode) && (MODE_BSTEP_UNDO_COMMIT == mode_map_ptr[i]) && !(BABY_STEP_COMMIT & bs_modes->completed)) { DEBUGMSGTL(("baby_steps", " skipping commit undo (no commit)\n")); continue; } else if((MODE_SET_FREE == save_mode) && (MODE_BSTEP_UNDO_CLEANUP == mode_map_ptr[i]) && !(BABY_STEP_UNDO_SETUP & bs_modes->completed)) { DEBUGMSGTL(("baby_steps", " skipping undo cleanup (no undo setup)\n")); continue; } reqinfo->mode = mode_map_ptr[i]; mode_flag = netsnmp_baby_step_mode2flag( mode_map_ptr[i] ); if((mode_flag & bs_modes->registered)) bs_modes->completed |= mode_flag; else { DEBUGMSGTL(("baby_steps", " skipping mode (not registered)\n")); continue; } } else { reqinfo->mode = save_mode; } #ifdef BABY_STEPS_NEXT_MODE /* * I can't remember why I wanted the next mode in the request, * but it's not used anywhere, so don't use this code. saved, * in case I remember why I thought needed it. - rstory 040911 */ if((BABY_STEPS_PER_MODE_MAX - 1) == i) reqinfo->next_mode_ok = BABY_STEP_NONE; else { if(BSTEP_USE_ORIGINAL == mode_map_ptr[i+1]) reqinfo->next_mode_ok = save_mode; else reqinfo->next_mode_ok = mode_map_ptr[i+1]; } #endif /* * call handlers for baby step */ rc = netsnmp_call_next_handler(handler, reginfo, reqinfo, requests); /* * check for error calling handler (unlikely, but...) */ if(rc) { DEBUGMSGTL(("baby_steps", " ERROR:handler error\n")); break; } /* * check for errors in any of the requests for GET-like, reserve1, * reserve2 and action. (there is no recovery from errors * in commit, free or undo.) */ if (MODE_IS_GET(save_mode) || (save_mode < SNMP_MSG_INTERNAL_SET_COMMIT)) { rc = netsnmp_check_requests_error(requests); if(rc) { DEBUGMSGTL(("baby_steps", " ERROR:request error\n")); break; } } } /* * restore original mode */ reqinfo->mode = save_mode; return rc; }