Logo
Home page Net-SNMP

Archive Search:

Require all words?

Site Search:
Google
Main Page | Modules | Data Structures | File List | Data Fields | Related Pages | Examples

stash_cache.c

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 }

Generated on Fri Dec 30 13:47:50 2005 for net-snmp by  doxygen 1.3.9.1

Valid CSS!


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.