/** Registers an old API set into the mib tree. Functionally this * mimics the old register_mib_context() function (and in fact the new * register_mib_context() function merely calls this new old_api one). */ int netsnmp_register_old_api(const char *moduleName, struct variable *var, size_t varsize, size_t numvars, oid * mibloc, size_t mibloclen, int priority, int range_subid, oid range_ubound, netsnmp_session * ss, const char *context, int timeout, int flags) { unsigned int i; /* * register all subtree nodes */ for (i = 0; i < numvars; i++) { struct variable *vp; netsnmp_handler_registration *reginfo = SNMP_MALLOC_TYPEDEF(netsnmp_handler_registration); memdup((void *) &vp, (void *) (struct variable *) ((char *) var + varsize * i), varsize); reginfo->handler = get_old_api_handler(); reginfo->handlerName = strdup(moduleName); reginfo->rootoid_len = (mibloclen + vp->namelen); reginfo->rootoid = (oid *) malloc(reginfo->rootoid_len * sizeof(oid)); memcpy(reginfo->rootoid, mibloc, mibloclen * sizeof(oid)); memcpy(reginfo->rootoid + mibloclen, vp->name, vp->namelen * sizeof(oid)); reginfo->handler->myvoid = (void *) vp; reginfo->priority = priority; reginfo->range_subid = range_subid; reginfo->range_ubound = range_ubound; reginfo->timeout = timeout; reginfo->contextName = (context) ? strdup(context) : NULL; reginfo->modes = HANDLER_CAN_RWRITE; /* * register ourselves in the mib tree */ if (netsnmp_register_handler(reginfo) != MIB_REGISTERED_OK) { /** netsnmp_handler_registration_free(reginfo); already freed */ SNMP_FREE(vp); } } return SNMPERR_SUCCESS; }
/** registers a row within a mib table */ int netsnmp_register_mib_table_row(const char *moduleName, struct variable *var, size_t varsize, size_t numvars, oid * mibloc, size_t mibloclen, int priority, int var_subid, netsnmp_session * ss, const char *context, int timeout, int flags) { unsigned int i = 0, rc = 0; oid ubound = 0; for (i = 0; i < numvars; i++) { struct variable *vr = (struct variable *) ((char *) var + (i * varsize)); netsnmp_handler_registration *r; if ( var_subid > (int)mibloclen ) { break; /* doesn't make sense */ } r = SNMP_MALLOC_TYPEDEF(netsnmp_handler_registration); if (r == NULL) { /* * Unregister whatever we have registered so far, and * return an error. */ rc = MIB_REGISTRATION_FAILED; break; } memset(r, 0, sizeof(netsnmp_handler_registration)); r->handler = get_old_api_handler(); r->handlerName = strdup(moduleName); if (r->handlerName == NULL) { netsnmp_handler_registration_free(r); break; } r->rootoid_len = mibloclen; r->rootoid = (oid *) malloc(r->rootoid_len * sizeof(oid)); if (r->rootoid == NULL) { netsnmp_handler_registration_free(r); rc = MIB_REGISTRATION_FAILED; break; } memcpy(r->rootoid, mibloc, mibloclen * sizeof(oid)); memcpy((u_char *) (r->rootoid + (var_subid - vr->namelen)), vr->name, vr->namelen * sizeof(oid)); DEBUGMSGTL(("netsnmp_register_mib_table_row", "rootoid ")); DEBUGMSGOID(("netsnmp_register_mib_table_row", r->rootoid, r->rootoid_len)); DEBUGMSG(("netsnmp_register_mib_table_row", "(%d)\n", (var_subid - vr->namelen))); r->handler->myvoid = netsnmp_duplicate_variable(vr); r->handler->data_clone = (void *(*)(void *))netsnmp_duplicate_variable; r->handler->data_free = free; if (r->handler->myvoid == NULL) { netsnmp_handler_registration_free(r); rc = MIB_REGISTRATION_FAILED; break; } r->contextName = (context) ? strdup(context) : NULL; if (context != NULL && r->contextName == NULL) { netsnmp_handler_registration_free(r); rc = MIB_REGISTRATION_FAILED; break; } r->priority = priority; r->range_subid = 0; /* var_subid; */ r->range_ubound = 0; /* range_ubound; */ r->timeout = timeout; r->modes = HANDLER_CAN_RWRITE; /* * Register this column and row */ if ((rc = netsnmp_register_handler_nocallback(r)) != MIB_REGISTERED_OK) { DEBUGMSGTL(("netsnmp_register_mib_table_row", "register failed %d\n", rc)); netsnmp_handler_registration_free(r); break; } if (vr->namelen > 0) { if (vr->name[vr->namelen - 1] > ubound) { ubound = vr->name[vr->namelen - 1]; } } } if (rc == MIB_REGISTERED_OK) { struct register_parameters reg_parms; reg_parms.name = mibloc; reg_parms.namelen = mibloclen; reg_parms.priority = priority; reg_parms.flags = (u_char) flags; reg_parms.range_subid = var_subid; reg_parms.range_ubound = ubound; reg_parms.timeout = timeout; reg_parms.contextName = context; rc = snmp_call_callbacks(SNMP_CALLBACK_APPLICATION, SNMPD_CALLBACK_REGISTER_OID, ®_parms); } return rc; }