00001 #include <net-snmp/net-snmp-config.h>
00002
00003 #include <net-snmp/net-snmp-includes.h>
00004 #include <net-snmp/agent/net-snmp-agent-includes.h>
00005
00006 #include <net-snmp/agent/stash_to_next.h>
00007
00008 #include <net-snmp/agent/stash_cache.h>
00009
00022 netsnmp_mib_handler *
00023 netsnmp_get_stash_to_next_handler(void)
00024 {
00025 netsnmp_mib_handler *handler =
00026 netsnmp_create_handler("stash_to_next",
00027 netsnmp_stash_to_next_helper);
00028
00029 if (NULL != handler)
00030 handler->flags |= MIB_HANDLER_AUTO_NEXT;
00031
00032 return handler;
00033 }
00034
00036 int
00037 netsnmp_stash_to_next_helper(netsnmp_mib_handler *handler,
00038 netsnmp_handler_registration *reginfo,
00039 netsnmp_agent_request_info *reqinfo,
00040 netsnmp_request_info *requests)
00041 {
00042
00043 int ret = SNMP_ERR_NOERROR;
00044 int namelen;
00045 int finished = 0;
00046 netsnmp_oid_stash_node **cinfo;
00047 netsnmp_variable_list *vb;
00048 netsnmp_request_info *reqtmp;
00049
00050
00051
00052
00053 netsnmp_assert(handler->flags & MIB_HANDLER_AUTO_NEXT);
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 if (MODE_GET_STASH == reqinfo->mode) {
00070 if ( reginfo->modes & HANDLER_CAN_STASH ) {
00071 return ret;
00072 }
00073 cinfo = netsnmp_extract_stash_cache( reqinfo );
00074 reqtmp = SNMP_MALLOC_TYPEDEF(netsnmp_request_info);
00075 vb = reqtmp->requestvb = SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );
00076 vb->type = ASN_NULL;
00077 snmp_set_var_objid( vb, reginfo->rootoid, reginfo->rootoid_len );
00078
00079 reqinfo->mode = MODE_GETNEXT;
00080 while (!finished) {
00081 ret = netsnmp_call_next_handler(handler, reginfo, reqinfo, reqtmp);
00082 namelen = SNMP_MIN(vb->name_length, reginfo->rootoid_len);
00083 if ( !snmp_oid_compare( reginfo->rootoid, reginfo->rootoid_len,
00084 vb->name, namelen) &&
00085 vb->type != ASN_NULL && vb->type != SNMP_ENDOFMIBVIEW ) {
00086
00087
00088
00089
00090 netsnmp_oid_stash_add_data( cinfo, vb->name, vb->name_length,
00091 snmp_clone_varbind( vb ));
00092
00093
00094
00095
00096 netsnmp_free_all_list_data(reqtmp->parent_data);
00097 reqtmp->parent_data = NULL;
00098 reqtmp->processed = 0;
00099 vb->type = ASN_NULL;
00100 } else {
00101 finished = 1;
00102 }
00103 }
00104 reqinfo->mode = MODE_GET_STASH;
00105
00106
00107
00108
00109
00110 handler->flags |= MIB_HANDLER_AUTO_NEXT_OVERRIDE_ONCE;
00111 }
00112
00113 return ret;
00114 }