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

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file was generated by mib2c and is intended for use as
  3.  * a mib module for the ucd-snmp snmpd agent. 
  4.  */
  5. /*
  6.  * This should always be included first before anything else 
  7.  */
  8. #include <net-snmp/net-snmp-config.h>
  9. #include <sys/types.h>
  10. #if HAVE_WINSOCK_H
  11. #include <winsock.h>
  12. #endif
  13. #if HAVE_STDLIB_H
  14. #include <stdlib.h>
  15. #endif
  16. #if HAVE_STRING_H
  17. #include <string.h>
  18. #else
  19. #include <strings.h>
  20. #endif
  21. /*
  22.  * minimal include directives 
  23.  */
  24. #include <net-snmp/net-snmp-includes.h>
  25. #include <net-snmp/agent/net-snmp-agent-includes.h>
  26. #include "header_complex.h"
  27. #include "snmpNotifyFilterTable.h"
  28. /*
  29.  * snmpNotifyFilterTable_variables_oid:
  30.  *   this is the top level oid that we want to register under.  This
  31.  *   is essentially a prefix, with the suffix appearing in the
  32.  *   variable below.
  33.  */
  34. oid             snmpNotifyFilterTable_variables_oid[] =
  35.     { 1, 3, 6, 1, 6, 3, 13, 1, 3 };
  36. /*
  37.  * variable2 snmpNotifyFilterTable_variables:
  38.  *   this variable defines function callbacks and type return information 
  39.  *   for the snmpNotifyFilterTable mib section 
  40.  */
  41. struct variable2 snmpNotifyFilterTable_variables[] = {
  42.     /*
  43.      * magic number        , variable type , ro/rw , callback fn  , L, oidsuffix 
  44.      */
  45. #define   SNMPNOTIFYFILTERMASK  4
  46.     {SNMPNOTIFYFILTERMASK, ASN_OCTET_STR, RWRITE,
  47.      var_snmpNotifyFilterTable, 2, {1, 2}},
  48. #define   SNMPNOTIFYFILTERTYPE  5
  49.     {SNMPNOTIFYFILTERTYPE, ASN_INTEGER, RWRITE, var_snmpNotifyFilterTable,
  50.      2, {1, 3}},
  51. #define   SNMPNOTIFYFILTERSTORAGETYPE  6
  52.     {SNMPNOTIFYFILTERSTORAGETYPE, ASN_INTEGER, RWRITE,
  53.      var_snmpNotifyFilterTable, 2, {1, 4}},
  54. #define   SNMPNOTIFYFILTERROWSTATUS  7
  55.     {SNMPNOTIFYFILTERROWSTATUS, ASN_INTEGER, RWRITE,
  56.      var_snmpNotifyFilterTable, 2, {1, 5}},
  57. };
  58. /*
  59.  * (L = length of the oidsuffix) 
  60.  */
  61. /*
  62.  * global storage of our data, saved in and configured by header_complex() 
  63.  */
  64. static struct header_complex_index *snmpNotifyFilterTableStorage = NULL;
  65. /*
  66.  * init_snmpNotifyFilterTable():
  67.  *   Initialization routine.  This is called when the agent starts up.
  68.  *   At a minimum, registration of your variables should take place here.
  69.  */
  70. void
  71. init_snmpNotifyFilterTable(void)
  72. {
  73.     DEBUGMSGTL(("snmpNotifyFilterTable", "initializing...  "));
  74.     /*
  75.      * register ourselves with the agent to handle our mib tree 
  76.      */
  77.     REGISTER_MIB("snmpNotifyFilterTable", snmpNotifyFilterTable_variables,
  78.                  variable2, snmpNotifyFilterTable_variables_oid);
  79.     /*
  80.      * register our config handler(s) to deal with registrations 
  81.      */
  82.     snmpd_register_config_handler("snmpNotifyFilterTable",
  83.                                   parse_snmpNotifyFilterTable, NULL, NULL);
  84.     /*
  85.      * we need to be called back later to store our data 
  86.      */
  87.     snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
  88.                            store_snmpNotifyFilterTable, NULL);
  89.     /*
  90.      * place any other initialization junk you need here 
  91.      */
  92.     DEBUGMSGTL(("snmpNotifyFilterTable", "done.n"));
  93. }
  94. /*
  95.  * snmpNotifyFilterTable_add(): adds a structure node to our data set 
  96.  */
  97. int
  98. snmpNotifyFilterTable_add(struct snmpNotifyFilterTable_data *thedata)
  99. {
  100.     netsnmp_variable_list *vars = NULL;
  101.     DEBUGMSGTL(("snmpNotifyFilterTable", "adding data...  "));
  102.     /*
  103.      * add the index variables to the varbind list, which is 
  104.      * used by header_complex to index the data 
  105.      */
  106.     snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR,
  107.                               (u_char *) thedata->
  108.                               snmpNotifyFilterProfileName,
  109.                               thedata->snmpNotifyFilterProfileNameLen);
  110.     snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OBJECT_ID, (u_char *) thedata->snmpNotifyFilterSubtree, thedata->snmpNotifyFilterSubtreeLen * sizeof(oid));      /* snmpNotifyFilterSubtree */
  111.     header_complex_add_data(&snmpNotifyFilterTableStorage, vars, thedata);
  112.     DEBUGMSGTL(("snmpNotifyFilterTable", "registered an entryn"));
  113.     DEBUGMSGTL(("snmpNotifyFilterTable", "done.n"));
  114.     return SNMPERR_SUCCESS;
  115. }
  116. /*
  117.  * parse_snmpNotifyFilterTable():
  118.  *   parses .conf file entries needed to configure the mib.
  119.  */
  120. void
  121. parse_snmpNotifyFilterTable(const char *token, char *line)
  122. {
  123.     size_t          tmpint;
  124.     struct snmpNotifyFilterTable_data *StorageTmp =
  125.         SNMP_MALLOC_STRUCT(snmpNotifyFilterTable_data);
  126.     DEBUGMSGTL(("snmpNotifyFilterTable", "parsing config...  "));
  127.     if (StorageTmp == NULL) {
  128.         config_perror("malloc failure");
  129.         return;
  130.     }
  131.     line =
  132.         read_config_read_data(ASN_OCTET_STR, line,
  133.                               &StorageTmp->snmpNotifyFilterProfileName,
  134.                               &StorageTmp->snmpNotifyFilterProfileNameLen);
  135.     if (StorageTmp->snmpNotifyFilterProfileName == NULL) {
  136.         config_perror
  137.             ("invalid specification for snmpNotifyFilterProfileName");
  138.         return;
  139.     }
  140.     line =
  141.         read_config_read_data(ASN_OBJECT_ID, line,
  142.                               &StorageTmp->snmpNotifyFilterSubtree,
  143.                               &StorageTmp->snmpNotifyFilterSubtreeLen);
  144.     if (StorageTmp->snmpNotifyFilterSubtree == NULL) {
  145.         config_perror("invalid specification for snmpNotifyFilterSubtree");
  146.         return;
  147.     }
  148.     line =
  149.         read_config_read_data(ASN_OCTET_STR, line,
  150.                               &StorageTmp->snmpNotifyFilterMask,
  151.                               &StorageTmp->snmpNotifyFilterMaskLen);
  152.     line =
  153.         read_config_read_data(ASN_INTEGER, line,
  154.                               &StorageTmp->snmpNotifyFilterType, &tmpint);
  155.     line =
  156.         read_config_read_data(ASN_INTEGER, line,
  157.                               &StorageTmp->snmpNotifyFilterStorageType,
  158.                               &tmpint);
  159.     line =
  160.         read_config_read_data(ASN_INTEGER, line,
  161.                               &StorageTmp->snmpNotifyFilterRowStatus,
  162.                               &tmpint);
  163.     snmpNotifyFilterTable_add(StorageTmp);
  164.     DEBUGMSGTL(("snmpNotifyFilterTable", "done.n"));
  165. }
  166. /*
  167.  * store_snmpNotifyFilterTable():
  168.  *   stores .conf file entries needed to configure the mib.
  169.  */
  170. int
  171. store_snmpNotifyFilterTable(int majorID, int minorID, void *serverarg,
  172.                             void *clientarg)
  173. {
  174.     char            line[SNMP_MAXBUF];
  175.     char           *cptr;
  176.     size_t          tmpint;
  177.     struct snmpNotifyFilterTable_data *StorageTmp;
  178.     struct header_complex_index *hcindex;
  179.     DEBUGMSGTL(("snmpNotifyFilterTable", "storing data...  "));
  180.     for (hcindex = snmpNotifyFilterTableStorage; hcindex != NULL;
  181.          hcindex = hcindex->next) {
  182.         StorageTmp = (struct snmpNotifyFilterTable_data *) hcindex->data;
  183.         if (StorageTmp->snmpNotifyFilterStorageType == ST_NONVOLATILE) {
  184.             memset(line, 0, sizeof(line));
  185.             strcat(line, "snmpNotifyFilterTable ");
  186.             cptr = line + strlen(line);
  187.             cptr =
  188.                 read_config_store_data(ASN_OCTET_STR, cptr,
  189.                                        &StorageTmp->
  190.                                        snmpNotifyFilterProfileName,
  191.                                        &StorageTmp->
  192.                                        snmpNotifyFilterProfileNameLen);
  193.             cptr =
  194.                 read_config_store_data(ASN_OBJECT_ID, cptr,
  195.                                        &StorageTmp->
  196.                                        snmpNotifyFilterSubtree,
  197.                                        &StorageTmp->
  198.                                        snmpNotifyFilterSubtreeLen);
  199.             cptr =
  200.                 read_config_store_data(ASN_OCTET_STR, cptr,
  201.                                        &StorageTmp->snmpNotifyFilterMask,
  202.                                        &StorageTmp->
  203.                                        snmpNotifyFilterMaskLen);
  204.             cptr =
  205.                 read_config_store_data(ASN_INTEGER, cptr,
  206.                                        &StorageTmp->snmpNotifyFilterType,
  207.                                        &tmpint);
  208.             cptr =
  209.                 read_config_store_data(ASN_INTEGER, cptr,
  210.                                        &StorageTmp->
  211.                                        snmpNotifyFilterStorageType,
  212.                                        &tmpint);
  213.             cptr =
  214.                 read_config_store_data(ASN_INTEGER, cptr,
  215.                                        &StorageTmp->
  216.                                        snmpNotifyFilterRowStatus, &tmpint);
  217.             snmpd_store_config(line);
  218.         }
  219.     }
  220.     DEBUGMSGTL(("snmpNotifyFilterTable", "done.n"));
  221.     return 0;
  222. }
  223. /*
  224.  * var_snmpNotifyFilterTable():
  225.  *   Handle this table separately from the scalar value case.
  226.  *   The workings of this are basically the same as for var_snmpNotifyFilterTable above.
  227.  */
  228. unsigned char  *
  229. var_snmpNotifyFilterTable(struct variable *vp,
  230.                           oid * name,
  231.                           size_t * length,
  232.                           int exact,
  233.                           size_t * var_len, WriteMethod ** write_method)
  234. {
  235.     struct snmpNotifyFilterTable_data *StorageTmp = NULL;
  236.     DEBUGMSGTL(("snmpNotifyFilterTable",
  237.                 "var_snmpNotifyFilterTable: Entering...  n"));
  238.     /*
  239.      * this assumes you have registered all your data properly
  240.      */
  241.     if ((StorageTmp = (struct snmpNotifyFilterTable_data *)
  242.          header_complex((struct header_complex_index *)
  243.                         snmpNotifyFilterTableStorage, vp, name, length,
  244.                         exact, var_len, write_method)) == NULL) {
  245.         if (vp->magic == SNMPNOTIFYFILTERROWSTATUS)
  246.             *write_method = write_snmpNotifyFilterRowStatus;
  247.         return NULL;
  248.     }
  249.     /*
  250.      * this is where we do the value assignments for the mib results.
  251.      */
  252.     switch (vp->magic) {
  253.     case SNMPNOTIFYFILTERMASK:
  254.         *write_method = write_snmpNotifyFilterMask;
  255.         *var_len = StorageTmp->snmpNotifyFilterMaskLen;
  256.         return (u_char *) StorageTmp->snmpNotifyFilterMask;
  257.     case SNMPNOTIFYFILTERTYPE:
  258.         *write_method = write_snmpNotifyFilterType;
  259.         *var_len = sizeof(StorageTmp->snmpNotifyFilterType);
  260.         return (u_char *) & StorageTmp->snmpNotifyFilterType;
  261.     case SNMPNOTIFYFILTERSTORAGETYPE:
  262.         *write_method = write_snmpNotifyFilterStorageType;
  263.         *var_len = sizeof(StorageTmp->snmpNotifyFilterStorageType);
  264.         return (u_char *) & StorageTmp->snmpNotifyFilterStorageType;
  265.     case SNMPNOTIFYFILTERROWSTATUS:
  266.         *write_method = write_snmpNotifyFilterRowStatus;
  267.         *var_len = sizeof(StorageTmp->snmpNotifyFilterRowStatus);
  268.         return (u_char *) & StorageTmp->snmpNotifyFilterRowStatus;
  269.     default:
  270.         ERROR_MSG("");
  271.     }
  272.     return NULL;
  273. }
  274. int
  275. write_snmpNotifyFilterMask(int action,
  276.                            u_char * var_val,
  277.                            u_char var_val_type,
  278.                            size_t var_val_len,
  279.                            u_char * statP, oid * name, size_t name_len)
  280. {
  281.     static char    *tmpvar;
  282.     struct snmpNotifyFilterTable_data *StorageTmp = NULL;
  283.     static size_t   tmplen;
  284.     size_t          newlen =
  285.         name_len -
  286.         (sizeof(snmpNotifyFilterTable_variables_oid) / sizeof(oid) + 3 -
  287.          1);
  288.     DEBUGMSGTL(("snmpNotifyFilterTable",
  289.                 "write_snmpNotifyFilterMask entering action=%d...  n",
  290.                 action));
  291.     if ((StorageTmp = (struct snmpNotifyFilterTable_data *)
  292.          header_complex((struct header_complex_index *)
  293.                         snmpNotifyFilterTableStorage, NULL,
  294.                         &name[sizeof(snmpNotifyFilterTable_variables_oid) /
  295.                               sizeof(oid) + 3 - 1], &newlen, 1, NULL,
  296.                         NULL)) == NULL)
  297.         return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */
  298.     switch (action) {
  299.     case RESERVE1:
  300.         if (var_val_type != ASN_OCTET_STR) {
  301.             fprintf(stderr,
  302.                     "write to snmpNotifyFilterMask not ASN_OCTET_STRn");
  303.             return SNMP_ERR_WRONGTYPE;
  304.         }
  305.         break;
  306.     case RESERVE2:
  307.         /*
  308.          * memory reseveration, final preparation... 
  309.          */
  310.         break;
  311.     case FREE:
  312.         /*
  313.          * Release any resources that have been allocated 
  314.          */
  315.         break;
  316.     case ACTION:
  317.         /*
  318.          * The variable has been stored in string for
  319.          * you to use, and you have just been asked to do something with
  320.          * it.  Note that anything done here must be reversable in the UNDO case 
  321.          */
  322.         tmpvar = StorageTmp->snmpNotifyFilterMask;
  323.         tmplen = StorageTmp->snmpNotifyFilterMaskLen;
  324.         memdup((u_char **) & StorageTmp->snmpNotifyFilterMask, var_val,
  325.                var_val_len);
  326.         StorageTmp->snmpNotifyFilterMaskLen = var_val_len;
  327.         break;
  328.     case UNDO:
  329.         /*
  330.          * Back out any changes made in the ACTION case 
  331.          */
  332.         SNMP_FREE(StorageTmp->snmpNotifyFilterMask);
  333.         StorageTmp->snmpNotifyFilterMask = tmpvar;
  334.         StorageTmp->snmpNotifyFilterMaskLen = tmplen;
  335.         break;
  336.     case COMMIT:
  337.         /*
  338.          * Things are working well, so it's now safe to make the change
  339.          * permanently.  Make sure that anything done here can't fail! 
  340.          */
  341.         SNMP_FREE(tmpvar);
  342.         break;
  343.     }
  344.     return SNMP_ERR_NOERROR;
  345. }
  346. int
  347. write_snmpNotifyFilterType(int action,
  348.                            u_char * var_val,
  349.                            u_char var_val_type,
  350.                            size_t var_val_len,
  351.                            u_char * statP, oid * name, size_t name_len)
  352. {
  353.     static int      tmpvar;
  354.     struct snmpNotifyFilterTable_data *StorageTmp = NULL;
  355.     size_t          newlen =
  356.         name_len -
  357.         (sizeof(snmpNotifyFilterTable_variables_oid) / sizeof(oid) + 3 -
  358.          1);
  359.     DEBUGMSGTL(("snmpNotifyFilterTable",
  360.                 "write_snmpNotifyFilterType entering action=%d...  n",
  361.                 action));
  362.     if ((StorageTmp = (struct snmpNotifyFilterTable_data *)
  363.          header_complex((struct header_complex_index *)
  364.                         snmpNotifyFilterTableStorage, NULL,
  365.                         &name[sizeof(snmpNotifyFilterTable_variables_oid) /
  366.                               sizeof(oid) + 3 - 1], &newlen, 1, NULL,
  367.                         NULL)) == NULL)
  368.         return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */
  369.     switch (action) {
  370.     case RESERVE1:
  371.         if (var_val_type != ASN_INTEGER) {
  372.             fprintf(stderr,
  373.                     "write to snmpNotifyFilterType not ASN_INTEGERn");
  374.             return SNMP_ERR_WRONGTYPE;
  375.         }
  376.         break;
  377.     case RESERVE2:
  378.         /*
  379.          * memory reseveration, final preparation... 
  380.          */
  381.         break;
  382.     case FREE:
  383.         /*
  384.          * Release any resources that have been allocated 
  385.          */
  386.         break;
  387.     case ACTION:
  388.         /*
  389.          * The variable has been stored in long_ret for
  390.          * you to use, and you have just been asked to do something with
  391.          * it.  Note that anything done here must be reversable in the UNDO case 
  392.          */
  393.         tmpvar = StorageTmp->snmpNotifyFilterType;
  394.         StorageTmp->snmpNotifyFilterType = *((long *) var_val);
  395.         break;
  396.     case UNDO:
  397.         /*
  398.          * Back out any changes made in the ACTION case 
  399.          */
  400.         StorageTmp->snmpNotifyFilterType = tmpvar;
  401.         break;
  402.     case COMMIT:
  403.         /*
  404.          * Things are working well, so it's now safe to make the change
  405.          * permanently.  Make sure that anything done here can't fail! 
  406.          */
  407.         break;
  408.     }
  409.     return SNMP_ERR_NOERROR;
  410. }
  411. int
  412. write_snmpNotifyFilterStorageType(int action,
  413.                                   u_char * var_val,
  414.                                   u_char var_val_type,
  415.                                   size_t var_val_len,
  416.                                   u_char * statP,
  417.                                   oid * name, size_t name_len)
  418. {
  419.     static int      tmpvar;
  420.     struct snmpNotifyFilterTable_data *StorageTmp = NULL;
  421.     size_t          newlen =
  422.         name_len -
  423.         (sizeof(snmpNotifyFilterTable_variables_oid) / sizeof(oid) + 3 -
  424.          1);
  425.     DEBUGMSGTL(("snmpNotifyFilterTable",
  426.                 "write_snmpNotifyFilterStorageType entering action=%d...  n",
  427.                 action));
  428.     if ((StorageTmp = (struct snmpNotifyFilterTable_data *)
  429.          header_complex((struct header_complex_index *)
  430.                         snmpNotifyFilterTableStorage, NULL,
  431.                         &name[sizeof(snmpNotifyFilterTable_variables_oid) /
  432.                               sizeof(oid) + 3 - 1], &newlen, 1, NULL,
  433.                         NULL)) == NULL)
  434.         return SNMP_ERR_NOSUCHNAME;     /* remove if you support creation here */
  435.     switch (action) {
  436.     case RESERVE1:
  437.         if (var_val_type != ASN_INTEGER) {
  438.             fprintf(stderr,
  439.                     "write to snmpNotifyFilterStorageType not ASN_INTEGERn");
  440.             return SNMP_ERR_WRONGTYPE;
  441.         }
  442.         break;
  443.     case RESERVE2:
  444.         /*
  445.          * memory reseveration, final preparation... 
  446.          */
  447.         break;
  448.     case FREE:
  449.         /*
  450.          * Release any resources that have been allocated 
  451.          */
  452.         break;
  453.     case ACTION:
  454.         /*
  455.          * The variable has been stored in long_ret for
  456.          * you to use, and you have just been asked to do something with
  457.          * it.  Note that anything done here must be reversable in the UNDO case 
  458.          */
  459.         tmpvar = StorageTmp->snmpNotifyFilterStorageType;
  460.         StorageTmp->snmpNotifyFilterStorageType = *((long *) var_val);
  461.         break;
  462.     case UNDO:
  463.         /*
  464.          * Back out any changes made in the ACTION case 
  465.          */
  466.         StorageTmp->snmpNotifyFilterStorageType = tmpvar;
  467.         break;
  468.     case COMMIT:
  469.         /*
  470.          * Things are working well, so it's now safe to make the change
  471.          * permanently.  Make sure that anything done here can't fail! 
  472.          */
  473.         break;
  474.     }
  475.     return SNMP_ERR_NOERROR;
  476. }
  477. int
  478. write_snmpNotifyFilterRowStatus(int action,
  479.                                 u_char * var_val,
  480.                                 u_char var_val_type,
  481.                                 size_t var_val_len,
  482.                                 u_char * statP,
  483.                                 oid * name, size_t name_len)
  484. {
  485.     struct snmpNotifyFilterTable_data *StorageTmp = NULL;
  486.     static struct snmpNotifyFilterTable_data *StorageNew, *StorageDel;
  487.     size_t          newlen =
  488.         name_len -
  489.         (sizeof(snmpNotifyFilterTable_variables_oid) / sizeof(oid) + 3 -
  490.          1);
  491.     static int      old_value;
  492.     int             set_value;
  493.     static netsnmp_variable_list *vars, *vp;
  494.     struct header_complex_index *hciptr;
  495.     StorageTmp = (struct snmpNotifyFilterTable_data *)
  496.         header_complex((struct header_complex_index *)
  497.                        snmpNotifyFilterTableStorage, NULL,
  498.                        &name[sizeof(snmpNotifyFilterTable_variables_oid) /
  499.                              sizeof(oid) + 3 - 1], &newlen, 1, NULL, NULL);
  500.     if (var_val_type != ASN_INTEGER || var_val == NULL) {
  501.         fprintf(stderr,
  502.                 "write to snmpNotifyFilterRowStatus not ASN_INTEGERn");
  503.         return SNMP_ERR_WRONGTYPE;
  504.     }
  505.     set_value = *((long *) var_val);
  506.     /*
  507.      * check legal range, and notReady is reserved for us, not a user 
  508.      */
  509.     if (set_value < 1 || set_value > 6 || set_value == RS_NOTREADY)
  510.         return SNMP_ERR_INCONSISTENTVALUE;
  511.     switch (action) {
  512.     case RESERVE1:
  513.         /*
  514.          * stage one: test validity 
  515.          */
  516.         if (StorageTmp == NULL) {
  517.             /*
  518.              * create the row now? 
  519.              */
  520.             /*
  521.              * ditch illegal values now 
  522.              */
  523.             if (set_value == RS_ACTIVE || set_value == RS_NOTINSERVICE)
  524.                 return SNMP_ERR_INCONSISTENTVALUE;
  525.         } else {
  526.             /*
  527.              * row exists.  Check for a valid state change 
  528.              */
  529.             if (set_value == RS_CREATEANDGO
  530.                 || set_value == RS_CREATEANDWAIT) {
  531.                 /*
  532.                  * can't create a row that exists 
  533.                  */
  534.                 return SNMP_ERR_INCONSISTENTVALUE;
  535.             }
  536.             /*
  537.              * XXX: interaction with row storage type needed 
  538.              */
  539.         }
  540.         break;
  541.     case RESERVE2:
  542.         /*
  543.          * memory reseveration, final preparation... 
  544.          */
  545.         if (StorageTmp == NULL &&
  546.             (set_value == RS_CREATEANDGO
  547.              || set_value == RS_CREATEANDWAIT)) {
  548.             /*
  549.              * creation 
  550.              */
  551.             vars = NULL;
  552.             snmp_varlist_add_variable(&vars, NULL, 0, ASN_OCTET_STR, NULL, 0);  /* snmpNotifyFilterSubtree */
  553.             snmp_varlist_add_variable(&vars, NULL, 0, ASN_PRIV_IMPLIED_OBJECT_ID, NULL, 0);     /* snmpNotifyFilterSubtree */
  554.             if (header_complex_parse_oid
  555.                 (&
  556.                  (name
  557.                   [sizeof(snmpNotifyFilterTable_variables_oid) /
  558.                    sizeof(oid) + 2]), newlen, vars) != SNMPERR_SUCCESS) {
  559.                 /*
  560.                  * XXX: free, zero vars 
  561.                  */
  562.                 return SNMP_ERR_INCONSISTENTNAME;
  563.             }
  564.             vp = vars;
  565.             StorageNew = SNMP_MALLOC_STRUCT(snmpNotifyFilterTable_data);
  566.             memdup((u_char **) & (StorageNew->snmpNotifyFilterProfileName),
  567.                    (u_char *) vp->val.string, vp->val_len);
  568.             StorageNew->snmpNotifyFilterProfileNameLen = vp->val_len;
  569.             vp = vp->next_variable;
  570.             memdup((u_char **) & (StorageNew->snmpNotifyFilterSubtree),
  571.                    (u_char *) vp->val.objid, vp->val_len);
  572.             StorageNew->snmpNotifyFilterSubtreeLen =
  573.                 vp->val_len / sizeof(oid);
  574.             StorageNew->snmpNotifyFilterMask = (char *) calloc(1, 1);
  575.             StorageNew->snmpNotifyFilterMaskLen = 0;
  576.             StorageNew->snmpNotifyFilterType =
  577.                 SNMPNOTIFYFILTERTYPE_INCLUDED;
  578.             StorageNew->snmpNotifyFilterStorageType = ST_NONVOLATILE;
  579.             StorageNew->snmpNotifyFilterRowStatus = set_value;
  580.             /*
  581.              * XXX: free, zero vars, no longer needed? 
  582.              */
  583.         }
  584.         break;
  585.     case FREE:
  586.         /*
  587.          * XXX: free, zero vars 
  588.          */
  589.         /*
  590.          * Release any resources that have been allocated 
  591.          */
  592.         break;
  593.     case ACTION:
  594.         /*
  595.          * The variable has been stored in set_value for you to
  596.          * use, and you have just been asked to do something with
  597.          * it.  Note that anything done here must be reversable in
  598.          * the UNDO case 
  599.          */
  600.         if (StorageTmp == NULL &&
  601.             (set_value == RS_CREATEANDGO ||
  602.              set_value == RS_CREATEANDWAIT)) {
  603.             /*
  604.              * row creation, so add it 
  605.              */
  606.             if (StorageNew != NULL)
  607.                 snmpNotifyFilterTable_add(StorageNew);
  608.             /*
  609.              * XXX: ack, and if it is NULL? 
  610.              */
  611.         } else if (set_value != RS_DESTROY) {
  612.             /*
  613.              * set the flag? 
  614.              */
  615.             old_value = StorageTmp->snmpNotifyFilterRowStatus;
  616.             StorageTmp->snmpNotifyFilterRowStatus = *((long *) var_val);
  617.         } else {
  618.             /*
  619.              * destroy...  extract it for now 
  620.              */
  621.             if (StorageTmp) {
  622.                 hciptr =
  623.                     header_complex_find_entry(snmpNotifyFilterTableStorage,
  624.                                               StorageTmp);
  625.                 StorageDel = (struct snmpNotifyFilterTable_data *)
  626.                     header_complex_extract_entry((struct
  627.                                                   header_complex_index **)
  628.                                                  &snmpNotifyFilterTableStorage,
  629.                                                  hciptr);
  630.             }
  631.         }
  632.         break;
  633.     case UNDO:
  634.         /*
  635.          * Back out any changes made in the ACTION case 
  636.          */
  637.         if (StorageTmp == NULL &&
  638.             (set_value == RS_CREATEANDGO ||
  639.              set_value == RS_CREATEANDWAIT)) {
  640.             /*
  641.              * row creation, so remove it again 
  642.              */
  643.             hciptr =
  644.                 header_complex_find_entry(snmpNotifyFilterTableStorage,
  645.                                           StorageNew);
  646.             StorageDel = (struct snmpNotifyFilterTable_data *)
  647.                 header_complex_extract_entry((struct header_complex_index
  648.                                               **)
  649.                                              &snmpNotifyFilterTableStorage,
  650.                                              hciptr);
  651.             /*
  652.              * XXX: free it 
  653.              */
  654.         } else if (StorageDel != NULL) {
  655.             /*
  656.              * row deletion, so add it again 
  657.              */
  658.             snmpNotifyFilterTable_add(StorageDel);
  659.             StorageDel = NULL;
  660.         } else if (set_value != RS_DESTROY) {
  661.             StorageTmp->snmpNotifyFilterRowStatus = old_value;
  662.         }
  663.         break;
  664.     case COMMIT:
  665.         /*
  666.          * Things are working well, so it's now safe to make the change
  667.          * permanently.  Make sure that anything done here can't fail! 
  668.          */
  669.         if (StorageDel != NULL) {
  670.             StorageDel = NULL;
  671.             /*
  672.              * XXX: free it, its dead 
  673.              */
  674.         } else {
  675.             if (StorageTmp
  676.                 && StorageTmp->snmpNotifyFilterRowStatus ==
  677.                 RS_CREATEANDGO) {
  678.                 StorageTmp->snmpNotifyFilterRowStatus = RS_ACTIVE;
  679.             } else if (StorageTmp &&
  680.                        StorageTmp->snmpNotifyFilterRowStatus ==
  681.                        RS_CREATEANDWAIT) {
  682.                 StorageTmp->snmpNotifyFilterRowStatus = RS_NOTINSERVICE;
  683.             }
  684.         }
  685.         break;
  686.     }
  687.     return SNMP_ERR_NOERROR;
  688. }