00001 #include <net-snmp/net-snmp-config.h> 00002 00003 #if HAVE_STRING_H 00004 #include <string.h> 00005 #else 00006 #include <strings.h> 00007 #endif 00008 00009 #include <net-snmp/net-snmp-includes.h> 00010 #include <net-snmp/agent/net-snmp-agent-includes.h> 00011 00012 #include <net-snmp/agent/stash_cache.h> 00013 #include <net-snmp/agent/stash_to_next.h> 00014 00015 extern NetsnmpCacheLoad _netsnmp_stash_cache_load; 00016 extern NetsnmpCacheFree _netsnmp_stash_cache_free; 00017 00028 netsnmp_stash_cache_info * 00029 netsnmp_get_new_stash_cache(void) 00030 { 00031 netsnmp_stash_cache_info *cinfo; 00032 00033 cinfo = SNMP_MALLOC_TYPEDEF(netsnmp_stash_cache_info); 00034 cinfo->cache_length = 30; 00035 return cinfo; 00036 } 00037 00042 netsnmp_mib_handler * 00043 netsnmp_get_timed_bare_stash_cache_handler(int timeout, oid *rootoid, size_t rootoid_len) 00044 { 00045 netsnmp_mib_handler *handler; 00046 netsnmp_cache *cinfo; 00047 00048 cinfo = netsnmp_cache_create( timeout, _netsnmp_stash_cache_load, 00049 _netsnmp_stash_cache_free, rootoid, rootoid_len ); 00050 00051 if (!cinfo) 00052 return NULL; 00053 00054 handler = netsnmp_cache_handler_get( cinfo ); 00055 if (!handler) { 00056 free(cinfo); 00057 return NULL; 00058 } 00059 00060 handler->next = netsnmp_create_handler("stash_cache", netsnmp_stash_cache_helper); 00061 if (!handler->next) { 00062 free(cinfo); 00063 return NULL; 00064 } 00065 00066 handler->myvoid = cinfo; 00067 00068 return handler; 00069 } 00070 00075 netsnmp_mib_handler * 00076 netsnmp_get_bare_stash_cache_handler(void) 00077 { 00078 return netsnmp_get_timed_bare_stash_cache_handler( 30, NULL, 0 ); 00079 } 00080 00084 netsnmp_mib_handler * 00085 netsnmp_get_stash_cache_handler(void) 00086 { 00087 netsnmp_mib_handler *handler = netsnmp_get_bare_stash_cache_handler(); 00088 if (handler && handler->next) { 00089 handler->next->next = netsnmp_get_stash_to_next_handler(); 00090 } 00091 return handler; 00092 } 00093 00097 netsnmp_mib_handler * 00098 netsnmp_get_timed_stash_cache_handler(int timeout, oid *rootoid, size_t rootoid_len) 00099 { 00100 netsnmp_mib_handler *handler = 00101 netsnmp_get_timed_bare_stash_cache_handler(timeout, rootoid, rootoid_len); 00102 if (handler && handler->next) { 00103 handler->next->next = netsnmp_get_stash_to_next_handler(); 00104 } 00105 return handler; 00106 } 00107 00109 netsnmp_oid_stash_node ** 00110 netsnmp_extract_stash_cache(netsnmp_agent_request_info *reqinfo) 00111 { 00112 return netsnmp_agent_get_list_data(reqinfo, STASH_CACHE_NAME); 00113 } 00114 00115 00117 int 00118 netsnmp_stash_cache_helper(netsnmp_mib_handler *handler, 00119 netsnmp_handler_registration *reginfo, 00120 netsnmp_agent_request_info *reqinfo, 00121 netsnmp_request_info *requests) 00122 { 00123 netsnmp_cache *cache; 00124 netsnmp_stash_cache_info *cinfo; 00125 netsnmp_oid_stash_node *cnode; 00126 netsnmp_variable_list *cdata; 00127 netsnmp_request_info *request; 00128 00129 DEBUGMSGTL(("helper:stash_cache", "Got request\n")); 00130 00131 cache = netsnmp_cache_reqinfo_extract( reqinfo, reginfo->handlerName ); 00132 cinfo = (netsnmp_stash_cache_info *) cache->magic; 00133 00134 switch (reqinfo->mode) { 00135 00136 case MODE_GET: 00137 DEBUGMSGTL(("helper:stash_cache", "Processing GET request\n")); 00138 for(request = requests; request; request = request->next) { 00139 cdata = 00140 netsnmp_oid_stash_get_data(cinfo->cache, 00141 requests->requestvb->name, 00142 requests->requestvb->name_length); 00143 if (cdata && cdata->val.string && cdata->val_len) { 00144 DEBUGMSGTL(("helper:stash_cache", "Found cached GET varbind\n")); 00145 DEBUGMSGOID(("helper:stash_cache", cdata->name, cdata->name_length)); 00146 DEBUGMSG(("helper:stash_cache", "\n")); 00147 snmp_set_var_typed_value(request->requestvb, cdata->type, 00148 cdata->val.string, cdata->val_len); 00149 } 00150 } 00151 return SNMP_ERR_NOERROR; 00152 break; 00153 00154 case MODE_GETNEXT: 00155 DEBUGMSGTL(("helper:stash_cache", "Processing GETNEXT request\n")); 00156 for(request = requests; request; request = request->next) { 00157 cnode = 00158 netsnmp_oid_stash_getnext_node(cinfo->cache, 00159 requests->requestvb->name, 00160 requests->requestvb->name_length); 00161 if (cnode && cnode->thedata) { 00162 cdata = cnode->thedata; 00163 if (cdata->val.string && cdata->name && cdata->name_length) { 00164 DEBUGMSGTL(("helper:stash_cache", "Found cached GETNEXT varbind\n")); 00165 DEBUGMSGOID(("helper:stash_cache", cdata->name, cdata->name_length)); 00166 DEBUGMSG(("helper:stash_cache", "\n")); 00167 snmp_set_var_typed_value(request->requestvb, cdata->type, 00168 cdata->val.string, cdata->val_len); 00169 snmp_set_var_objid(request->requestvb, cdata->name, 00170 cdata->name_length); 00171 } 00172 } 00173 } 00174 return SNMP_ERR_NOERROR; 00175 break; 00176 00177 default: 00178 cinfo->cache_valid = 0; 00179 return netsnmp_call_next_handler(handler, reginfo, reqinfo, 00180 requests); 00181 } 00182 return SNMP_ERR_GENERR; /* should never get here */ 00183 } 00184 00187 int 00188 _netsnmp_stash_cache_load( netsnmp_cache *cache, void *magic ) 00189 { 00190 netsnmp_mib_handler *handler = cache->cache_hint->handler; 00191 netsnmp_handler_registration *reginfo = cache->cache_hint->reginfo; 00192 netsnmp_agent_request_info *reqinfo = cache->cache_hint->reqinfo; 00193 netsnmp_request_info *requests = cache->cache_hint->requests; 00194 netsnmp_stash_cache_info *cinfo = (netsnmp_stash_cache_info*) magic; 00195 int old_mode; 00196 int ret; 00197 00198 if (!cinfo) { 00199 cinfo = netsnmp_get_new_stash_cache(); 00200 cache->magic = cinfo; 00201 } 00202 00203 /* change modes to the GET_STASH mode */ 00204 old_mode = reqinfo->mode; 00205 reqinfo->mode = MODE_GET_STASH; 00206 netsnmp_agent_add_list_data(reqinfo, 00207 netsnmp_create_data_list(STASH_CACHE_NAME, 00208 &cinfo->cache, NULL)); 00209 00210 /* have the next handler fill stuff in and switch modes back */ 00211 ret = netsnmp_call_next_handler(handler->next, reginfo, reqinfo, requests); 00212 reqinfo->mode = old_mode; 00213 00214 return ret; 00215 } 00216 00217 void 00218 _netsnmp_stash_cache_free( netsnmp_cache *cache, void *magic ) 00219 { 00220 netsnmp_stash_cache_info *cinfo = (netsnmp_stash_cache_info*) magic; 00221 netsnmp_oid_stash_free(&cinfo->cache, 00222 (NetSNMPStashFreeNode *) snmp_free_var); 00223 return; 00224 } 00225 00230 void 00231 netsnmp_init_stash_cache_helper(void) 00232 { 00233 netsnmp_register_handler_by_name("stash_cache", 00234 netsnmp_get_stash_cache_handler()); 00235 }
1.3.9.1
Last modified: Thursday, 01-Mar-2007 16:20:10 PST
For questions regarding web content and site functionality, please write to the net-snmp-users mail list.