/** updates a given cache depending on whether it needs to or not. */ int _netsnmp_stash_cache_load( netsnmp_cache *cache, void *magic ) { netsnmp_mib_handler *handler = cache->cache_hint->handler; netsnmp_handler_registration *reginfo = cache->cache_hint->reginfo; netsnmp_agent_request_info *reqinfo = cache->cache_hint->reqinfo; netsnmp_request_info *requests = cache->cache_hint->requests; netsnmp_stash_cache_info *cinfo = (netsnmp_stash_cache_info*) magic; int old_mode; int ret; if (!cinfo) { cinfo = netsnmp_get_new_stash_cache(); cache->magic = cinfo; } /* change modes to the GET_STASH mode */ old_mode = reqinfo->mode; reqinfo->mode = MODE_GET_STASH; netsnmp_agent_add_list_data(reqinfo, netsnmp_create_data_list(STASH_CACHE_NAME, &cinfo->cache, NULL)); /* have the next handler fill stuff in and switch modes back */ ret = netsnmp_call_next_handler(handler->next, reginfo, reqinfo, requests); reqinfo->mode = old_mode; return ret; }
/** Insert the cache information for a given request (PDU) */ void netsnmp_cache_reqinfo_insert(netsnmp_cache* cache, netsnmp_agent_request_info * reqinfo, const char *name) { char *cache_name = _build_cache_name(name); if (NULL == netsnmp_agent_get_list_data(reqinfo, cache_name)) { DEBUGMSGTL(("verbose:helper:cache_handler", " adding '%s' to %p\n", cache_name, reqinfo)); netsnmp_agent_add_list_data(reqinfo, netsnmp_create_data_list(cache_name, cache, NULL)); } SNMP_FREE(cache_name); }
int process_set_requests(netsnmp_agent_request_info *agtreq_info, netsnmp_request_info *requests, table_container_data * tad, char *handler_name) { set_context context; netsnmp_container *request_group; /* * create and save structure for set info */ request_group = (netsnmp_container*) netsnmp_agent_get_list_data (agtreq_info, handler_name); if (request_group == NULL) { netsnmp_data_list *tmp; request_group = netsnmp_container_find("request_group:" "table_container"); request_group->compare = netsnmp_compare_netsnmp_index; request_group->ncompare = netsnmp_ncompare_netsnmp_index; DEBUGMSGTL(("table_array", "Grouping requests by oid\n")); tmp = netsnmp_create_data_list(handler_name, request_group, release_netsnmp_request_groups); netsnmp_agent_add_list_data(agtreq_info, tmp); /* * group requests. */ group_requests(agtreq_info, requests, request_group, tad); } /* * process each group one at a time */ context.agtreq_info = agtreq_info; context.tad = tad; context.status = SNMP_ERR_NOERROR; CONTAINER_FOR_EACH(request_group, (netsnmp_container_obj_func*)process_set_group, &context); return context.status; }