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

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