ipAddressTable_data_access.c
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:13k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * Note: this file originally auto-generated by mib2c using
  3.  *       version : 1.12 $ of : mfd-data-access.m2c,v $ 
  4.  *
  5.  * $Id: ipAddressTable_data_access.c,v 1.11.2.1 2005/02/08 21:58:14 nba Exp $
  6.  */
  7. /*
  8.  * standard Net-SNMP includes 
  9.  */
  10. #include <net-snmp/net-snmp-config.h>
  11. #include <net-snmp/net-snmp-includes.h>
  12. #include <net-snmp/agent/net-snmp-agent-includes.h>
  13. /*
  14.  * include our parent header 
  15.  */
  16. #include "ipAddressTable.h"
  17. #include "ipAddressTable_data_access.h"
  18. #include <sys/ioctl.h>
  19. #include <errno.h>
  20. /** @defgroup data_access data_access: Routines to access data
  21.  *
  22.  * These routines are used to locate the data used to satisfy
  23.  * requests.
  24.  * 
  25.  * @{
  26.  */
  27. /**********************************************************************
  28.  **********************************************************************
  29.  ***
  30.  *** Table ipAddressTable
  31.  ***
  32.  **********************************************************************
  33.  **********************************************************************/
  34. /*
  35.  * ipAddressTable is subid 34 of ip.
  36.  * Its status is Current.
  37.  * OID: .1.3.6.1.2.1.4.34, length: 8
  38.  */
  39. /**
  40.  * initialization for ipAddressTable data access
  41.  *
  42.  * This function is called during startup to allow you to
  43.  * allocate any resources you need for the data table.
  44.  *
  45.  * @param ipAddressTable_reg
  46.  *        Pointer to ipAddressTable_registration
  47.  *
  48.  * @retval MFD_SUCCESS : success.
  49.  * @retval MFD_ERROR   : unrecoverable error.
  50.  */
  51. int
  52. ipAddressTable_init_data(ipAddressTable_registration_ptr
  53.                          ipAddressTable_reg)
  54. {
  55.     DEBUGMSGTL(("verbose:ipAddressTable:ipAddressTable_init_data",
  56.                 "calledn"));
  57.     /*
  58.      * TODO:303:o: Initialize ipAddressTable data.
  59.      */
  60.     return MFD_SUCCESS;
  61. }                               /* ipAddressTable_init_data */
  62. /**
  63.  * container-cached overview
  64.  *
  65.  */
  66. /**
  67.  * check entry for update
  68.  */
  69. static void
  70. _clear_times(ipAddressTable_rowreq_ctx * rowreq_ctx, void *magic)
  71. {
  72.     rowreq_ctx->ipAddressLastChanged = rowreq_ctx->ipAddressCreated = 0;
  73. }
  74. /***********************************************************************
  75.  *
  76.  * cache
  77.  *
  78.  ***********************************************************************/
  79. /**
  80.  * container initialization
  81.  *
  82.  * @param container_ptr_ptr A pointer to a container pointer. If you
  83.  *        create a custom container, use this parameter to return it
  84.  *        to the MFD helper. If set to NULL, the MFD helper will
  85.  *        allocate a container for you.
  86.  * @param  cache A pointer to a cache structure. You can set the timeout
  87.  *         and other cache flags using this pointer.
  88.  *
  89.  *  This function is called at startup to allow you to customize certain
  90.  *  aspects of the access method. For the most part, it is for advanced
  91.  *  users. The default code should suffice for most cases. If no custom
  92.  *  container is allocated, the MFD code will create one for your.
  93.  *
  94.  *  This is also the place to set up cache behavior. The default, to
  95.  *  simply set the cache timeout, will work well with the default
  96.  *  container. If you are using a custom container, you may want to
  97.  *  look at the cache helper documentation to see if there are any
  98.  *  flags you want to set.
  99.  *
  100.  * @remark
  101.  *  This would also be a good place to do any initialization needed
  102.  *  for you data source. For example, opening a connection to another
  103.  *  process that will supply the data, opening a database, etc.
  104.  */
  105. void
  106. ipAddressTable_container_init(netsnmp_container ** container_ptr_ptr,
  107.                               netsnmp_cache * cache)
  108. {
  109.     DEBUGMSGTL(("verbose:ipAddressTable:ipAddressTable_container_init",
  110.                 "calledn"));
  111.     if ((NULL == cache) || (NULL == container_ptr_ptr)) {
  112.         snmp_log(LOG_ERR, "bad params to ipAddressTable_container_initn");
  113.         return;
  114.     }
  115.     /*
  116.      * For advanced users, you can use a custom container. If you
  117.      * do not create one, one will be created for you.
  118.      */
  119.     /*
  120.      * We create a custom container here so we can pre-load it, which
  121.      * will result in all new entries with last changed values. we need
  122.      * to clear those...  We also need to make sure ifIndexes have been
  123.      * assigned...
  124.      */
  125.     *container_ptr_ptr =
  126.         netsnmp_container_find("ipAddressTable:table_container");
  127.     if (NULL != *container_ptr_ptr) {
  128.         ipAddressTable_cache_load(*container_ptr_ptr);
  129.         CONTAINER_FOR_EACH(*container_ptr_ptr,
  130.                            (netsnmp_container_obj_func *) _clear_times,
  131.                            NULL);
  132.     }
  133.     /*
  134.      * TODO:345:A: Set up ipAddressTable cache properties.
  135.      *
  136.      * Also for advanced users, you can set parameters for the
  137.      * cache. Do not change the magic pointer, as it is used
  138.      * by the MFD helper.
  139.      */
  140.     cache->timeout = IPADDRESSTABLE_CACHE_TIMEOUT;      /* seconds */
  141.     /*
  142.      * basically, turn off all automatic cache handling except autoload.
  143.      */
  144.     cache->flags |=
  145.         (NETSNMP_CACHE_DONT_AUTO_RELEASE | NETSNMP_CACHE_DONT_FREE_EXPIRED
  146.          | NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD | NETSNMP_CACHE_AUTO_RELOAD
  147.          | NETSNMP_CACHE_DONT_INVALIDATE_ON_SET);
  148. }                               /* ipAddressTable_container_init */
  149. /**
  150.  * check entry for update
  151.  */
  152. static void
  153. _check_entry_for_updates(ipAddressTable_rowreq_ctx * rowreq_ctx,
  154.                          void **magic)
  155. {
  156.     netsnmp_container *ipaddress_container = magic[0];
  157.     netsnmp_container *to_delete = (netsnmp_container *) magic[1];
  158.     /*
  159.      * check for matching entry using secondary index.
  160.      */
  161.     netsnmp_ipaddress_entry *ipaddress_entry =
  162.         CONTAINER_FIND(ipaddress_container, rowreq_ctx->data);
  163.     if (NULL == ipaddress_entry) {
  164.         DEBUGMSGTL(("ipAddressTable:access", "removing missing entryn"));
  165.         if (NULL == to_delete) {
  166.             magic[1] = to_delete = netsnmp_container_find("lifo");
  167.             if (NULL == to_delete)
  168.                 snmp_log(LOG_ERR, "couldn't create delete containern");
  169.         }
  170.         if (NULL != to_delete)
  171.             CONTAINER_INSERT(to_delete, rowreq_ctx);
  172.     } else {
  173.         DEBUGMSGTL(("ipAddressTable:access", "updating existing entryn"));
  174.         /*
  175.          * Check for changes & update
  176.          */
  177.         if (netsnmp_access_ipaddress_entry_update(rowreq_ctx->data,
  178.                                                   ipaddress_entry) > 0)
  179.             rowreq_ctx->ipAddressLastChanged = netsnmp_get_agent_uptime();
  180.         /*
  181.          * remove entry from ifcontainer
  182.          */
  183.         CONTAINER_REMOVE(ipaddress_container, ipaddress_entry);
  184.         netsnmp_access_ipaddress_entry_free(ipaddress_entry);
  185.     }
  186. }
  187. /**
  188.  * add new entry
  189.  */
  190. static void
  191. _add_new_entry(netsnmp_ipaddress_entry * ipaddress_entry,
  192.                netsnmp_container * container)
  193. {
  194.     ipAddressTable_rowreq_ctx *rowreq_ctx;
  195.     DEBUGMSGTL(("ipAddressTable:access", "creating new entryn"));
  196.     netsnmp_assert(NULL != ipaddress_entry);
  197.     netsnmp_assert(NULL != container);
  198.     /*
  199.      * allocate an row context and set the index(es)
  200.      */
  201.     rowreq_ctx = ipAddressTable_allocate_rowreq_ctx(ipaddress_entry);
  202.     if ((NULL != rowreq_ctx) &&
  203.         (MFD_SUCCESS ==
  204.          ipAddressTable_indexes_set(rowreq_ctx,
  205.                                     ipaddress_entry->ia_address_len,
  206.                                     ipaddress_entry->ia_address,
  207.                                     ipaddress_entry->ia_address_len))) {
  208.         CONTAINER_INSERT(container, rowreq_ctx);
  209.         rowreq_ctx->ipAddressLastChanged =
  210.             rowreq_ctx->ipAddressCreated = netsnmp_get_agent_uptime();
  211.     } else {
  212.         if (NULL != rowreq_ctx) {
  213.             snmp_log(LOG_ERR, "error setting index while loading "
  214.                      "ipAddressTable cache.n");
  215.             ipAddressTable_release_rowreq_ctx(rowreq_ctx);
  216.         } else {
  217.             snmp_log(LOG_ERR, "memory allocation failed while loading "
  218.                      "ipAddressTable cache.n");
  219.             netsnmp_access_ipaddress_entry_free(ipaddress_entry);
  220.         }
  221.         return;
  222.     }
  223.     /*-------------------------------------------------------------------
  224.      * handle data that isn't part of the data_access ipaddress structure
  225.      */
  226.     rowreq_ctx->ipAddressRowStatus = ROWSTATUS_ACTIVE;
  227. }
  228. /**
  229.  * load cache data
  230.  *
  231.  * TODO:350:M: Implement ipAddressTable cache load
  232.  *
  233.  * @param container container to which items should be inserted
  234.  *
  235.  * @retval MFD_SUCCESS              : success.
  236.  * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
  237.  * @retval MFD_ERROR                : other error.
  238.  *
  239.  *  This function is called to cache the index(es) (and data, optionally)
  240.  *  for the every row in the data set.
  241.  *
  242.  * @remark
  243.  *  While loading the cache, the only important thing is the indexes.
  244.  *  If access to your data is cheap/fast (e.g. you have a pointer to a
  245.  *  structure in memory), it would make sense to update the data here.
  246.  *  If, however, the accessing the data invovles more work (e.g. parsing
  247.  *  some other existing data, or peforming calculations to derive the data),
  248.  *  then you can limit yourself to setting the indexes and saving any
  249.  *  information you will need later. Then use the saved information in
  250.  *  ipAddressTable_row_prep() for populating data.
  251.  *
  252.  * @note
  253.  *  If you need consistency between rows (like you want statistics
  254.  *  for each row to be from the same time frame), you should set all
  255.  *  data here.
  256.  *
  257.  */
  258. int
  259. ipAddressTable_cache_load(netsnmp_container * container)
  260. {
  261.     netsnmp_container *ipaddress_container;
  262.     void           *tmp_ptr[2];
  263.     DEBUGMSGTL(("verbose:ipAddressTable:ipAddressTable_cache_load",
  264.                 "calledn"));
  265.     /*
  266.      * TODO:351:M: |-> Load/update data in the ipAddressTable container.
  267.      * loop over your ipAddressTable data, allocate a rowreq context,
  268.      * set the index(es) [and data, optionally] and insert into
  269.      * the container.
  270.      */
  271.     ipaddress_container =
  272.         netsnmp_access_ipaddress_container_load(NULL,
  273.                                                 NETSNMP_ACCESS_IPADDRESS_INIT_ADDL_IDX_BY_ADDR);
  274.     /*
  275.      * we just got a fresh copy of interface data. compare it to
  276.      * what we've already got, and make any adjustments, saving
  277.      * missing addresses to be deleted.
  278.      */
  279.     tmp_ptr[0] = ipaddress_container->next;
  280.     tmp_ptr[1] = NULL;
  281.     CONTAINER_FOR_EACH(container, (netsnmp_container_obj_func *)
  282.                        _check_entry_for_updates, tmp_ptr);
  283.     /*
  284.      * now add any new interfaces
  285.      */
  286.     CONTAINER_FOR_EACH(ipaddress_container,
  287.                        (netsnmp_container_obj_func *) _add_new_entry,
  288.                        container);
  289.     /*
  290.      * free the container. we've either claimed each entry, or released it,
  291.      * so the access function doesn't need to clear the container.
  292.      */
  293.     netsnmp_access_ipaddress_container_free(ipaddress_container,
  294.                                             NETSNMP_ACCESS_IPADDRESS_FREE_DONT_CLEAR);
  295.     /*
  296.      * remove deleted addresses from table container
  297.      */
  298.     if (NULL != tmp_ptr[1]) {
  299.         netsnmp_container *tmp_container =
  300.             (netsnmp_container *) tmp_ptr[1];
  301.         ipAddressTable_rowreq_ctx *tmp_ctx;
  302.         /*
  303.          * this works because the tmp_container is a linked list,
  304.          * which can be used like a stack...
  305.          */
  306.         while (CONTAINER_SIZE(tmp_container)) {
  307.             /*
  308.              * get from delete list
  309.              */
  310.             tmp_ctx = CONTAINER_FIRST(tmp_container);
  311.             /*
  312.              * release context, delete from table container
  313.              */
  314.             CONTAINER_REMOVE(container, tmp_ctx);
  315.             ipAddressTable_release_rowreq_ctx(tmp_ctx);
  316.             /*
  317.              * pop off delete list
  318.              */
  319.             CONTAINER_REMOVE(tmp_container, NULL);
  320.         }
  321.     }
  322.     DEBUGMSGT(("verbose:ipAddressTable:ipAddressTable_cache_load",
  323.                "%d recordsn", CONTAINER_SIZE(container)));
  324.     return MFD_SUCCESS;
  325. }                               /* ipAddressTable_cache_load */
  326. /**
  327.  * cache clean up
  328.  *
  329.  * @param container container with all current items
  330.  *
  331.  *  This optional callback is called prior to all
  332.  *  item's being removed from the container. If you
  333.  *  need to do any processing before that, do it here.
  334.  *
  335.  * @note
  336.  *  The MFD helper will take care of releasing all the row contexts.
  337.  *
  338.  */
  339. void
  340. ipAddressTable_cache_free(netsnmp_container * container)
  341. {
  342.     DEBUGMSGTL(("verbose:ipAddressTable:ipAddressTable_cache_free",
  343.                 "calledn"));
  344.     /*
  345.      * TODO:380:M: Free ipAddressTable cache.
  346.      */
  347. }                               /* ipAddressTable_cache_free */
  348. /**
  349.  * prepare row for processing.
  350.  *
  351.  *  When the agent has located the row for a request, this function is
  352.  *  called to prepare the row for processing. If you fully populated
  353.  *  the data context during the index setup phase, you may not need to
  354.  *  do anything.
  355.  *
  356.  * @param rowreq_ctx pointer to a context.
  357.  *
  358.  * @retval MFD_SUCCESS     : success.
  359.  * @retval MFD_ERROR       : other error.
  360.  */
  361. int
  362. ipAddressTable_row_prep(ipAddressTable_rowreq_ctx * rowreq_ctx)
  363. {
  364.     DEBUGMSGTL(("verbose:ipAddressTable:ipAddressTable_row_prep",
  365.                 "calledn"));
  366.     netsnmp_assert(NULL != rowreq_ctx);
  367.     /*
  368.      * TODO:390:o: Prepare row for request.
  369.      * If populating row data was delayed, this is the place to
  370.      * fill in the row for this request.
  371.      */
  372.     return MFD_SUCCESS;
  373. }                               /* ipAddressTable_row_prep */
  374. /** @} */