snmpTargetParamsEntry.c
上传用户:cxs890
上传日期:2021-05-22
资源大小:347k
文件大小:39k
源码类别:

SNMP编程

开发平台:

C/C++

  1. /* TargetParamTable MIB
  2.    This file was generated by mib2c and is intended for use as a mib module
  3.    for the ucd-snmp snmpd agent. Edited by Michael Baer 
  4.    last changed 2/2/99.
  5. */
  6. #include <config.h>
  7. #if HAVE_STRING_H
  8. #include <string.h>
  9. #else
  10. #include <strings.h>
  11. #endif
  12. #include <stdlib.h>
  13. #include <ctype.h>
  14. #if HAVE_WINSOCK_H
  15. #include <ip/socket.h>
  16. #endif
  17. #include "mibincl.h"
  18. #include "snmpTargetParamsEntry.h"
  19. #include "read_config.h"
  20. #include "callback.h"
  21. #define snmpTargetParamsOIDLen 11  /*This is base+column, 
  22.      i.e. everything but index*/
  23. extern char *strdup (const char *);
  24. extern void  snmpTargetTryToAddTrap (char *name);
  25. extern void  snmpTargetTryToDelTrap (char *name);
  26. oid snmpTargetParamsOID[snmpTargetParamsOIDLen] = {1,3,6,1,6,3,12,1,3,1,0};
  27. static struct targetParamTable_struct *aPTable=0;
  28. /* Utility routines */
  29. /* TargetParamTable_create creates and returns a pointer
  30.    to a targetParamTable_struct with default values set */
  31. struct targetParamTable_struct 
  32. *snmpTargetParamTable_create(void)
  33. {
  34. struct targetParamTable_struct *newEntry;
  35. newEntry = (struct targetParamTable_struct *)
  36. malloc(sizeof(struct targetParamTable_struct));
  37. if (newEntry == NULL)
  38. return NULL;
  39. newEntry->paramName   = 0;
  40. newEntry->mpModel     = -1;
  41. newEntry->secModel    = -1;
  42. newEntry->secName     = 0;
  43. newEntry->secLevel    = -1;
  44. newEntry->storageType = SNMP_STORAGE_NONVOLATILE;
  45. newEntry->rowStatus   = SNMP_ROW_NONEXISTENT;
  46. newEntry->next        = 0;
  47. return newEntry;
  48. }
  49. /* TargetParamTable_dispose frees the space allocated to a
  50.    targetParamTable_struct */
  51. void snmpTargetParamTable_dispose(
  52.      struct targetParamTable_struct *reaped)
  53. {
  54.   free(reaped->paramName);
  55.   free(reaped->secName);
  56.   
  57.   free(reaped);
  58. }  /* snmpTargetParamTable_dispose  */
  59. /* snmpTargetParamTable_addToList adds a targetParamTable_struct 
  60.    to a list passed in. The list is assumed to be in a sorted order,
  61.    low to high and this procedure inserts a new struct in the proper 
  62.    location. Sorting uses OID values based on paramName. A new equal value 
  63.    overwrites a current one. */
  64. void snmpTargetParamTable_addToList(
  65.      struct targetParamTable_struct *newEntry,
  66.      struct targetParamTable_struct **listPtr)
  67. {
  68.   static struct targetParamTable_struct *curr_struct, *prev_struct;
  69.   int    i;
  70.   int newOIDLen, currOIDLen;
  71.   oid    newOID[128], currOID[128];
  72.   
  73.   /* if the list is empty, add the new entry to the top */
  74.   if ( (prev_struct = curr_struct = *listPtr) == 0 ) {
  75.     *listPtr = newEntry;
  76.     return;
  77.   }
  78.   else {
  79.     /* get the 'OID' value of the new entry */
  80.     newOIDLen = strlen(newEntry->paramName);
  81.     for(i=0; i < (int)newOIDLen ;i++) {
  82.       newOID[i] = newEntry->paramName[i];
  83.     }
  84.     /* search through the list for an equal or greater OID value */
  85.     while (curr_struct != 0) {
  86.       currOIDLen = strlen(curr_struct->paramName);
  87.       for(i=0; i < (int)currOIDLen ;i++) {
  88. currOID[i] = curr_struct->paramName[i];
  89.       }
  90.       i=snmp_oid_compare(newOID, newOIDLen, currOID, currOIDLen);
  91.       if (i==0) {  /* Exact match, overwrite with new struct */
  92. newEntry->next = curr_struct->next;
  93. /* if curr_struct is the top of the list */
  94. if (*listPtr == curr_struct)  *listPtr = newEntry;
  95. else prev_struct->next = newEntry;
  96. snmpTargetParamTable_dispose(curr_struct);
  97. return;
  98.       }
  99.       else if (i < 0) { /* Found a greater OID, insert struct in front of it.*/
  100. newEntry->next = curr_struct;
  101. /* if curr_struct is the top of the list */
  102. if (*listPtr == curr_struct) *listPtr = newEntry;
  103. else prev_struct->next = newEntry;
  104. return;
  105.       }
  106.       prev_struct = curr_struct;
  107.       curr_struct = curr_struct->next;
  108.     }
  109.   }
  110.   /* if we're here, no larger OID was ever found, insert on end of list */
  111.   prev_struct->next = newEntry;
  112. }  /* snmpTargeParamTable_addToList  */
  113. /* snmpTargetParamTable_remFromList removes a targetParamTable_struct 
  114.    from the list passed in */
  115. void snmpTargetParamTable_remFromList(
  116.      struct targetParamTable_struct *oldEntry,
  117.      struct targetParamTable_struct **listPtr)
  118. {
  119.   struct targetParamTable_struct *tptr;
  120.   if ( (tptr = *listPtr) == 0 ) return;
  121.   else if (tptr == oldEntry) {
  122.     *listPtr = (*listPtr)->next;
  123.     snmpTargetParamTable_dispose(tptr);
  124.     return;
  125.   }
  126.   else  {
  127.     while (tptr->next != 0) {
  128.       if (tptr->next == oldEntry) {
  129. tptr->next = tptr->next->next;
  130. snmpTargetParamTable_dispose(oldEntry);
  131. return;
  132.       }
  133.       tptr = tptr->next;
  134.     }
  135.   }
  136. }  /* snmpTargetParamTable_remFromList  */
  137. /* lookup OID in the link list of Table Entries */
  138. struct targetParamTable_struct *
  139. search_snmpTargetParamsTable(
  140.      oid    *baseName,
  141.      int baseNameLen,
  142.      oid    *name,
  143.      int *length,
  144.      int    exact)
  145. {
  146.    static struct targetParamTable_struct *temp_struct;
  147.    int    i;
  148.    int myOIDLen;
  149.    oid    newNum[128];
  150.    /* lookup entry in p / * Get Current MIB ID */
  151.    memcpy(newNum, baseName, baseNameLen*sizeof(oid));
  152.   
  153.    for( temp_struct = aPTable; temp_struct != 0; temp_struct = temp_struct->next) {
  154.      for(i=0; i < (int)strlen(temp_struct->paramName) ;i++) {
  155.        newNum[baseNameLen+i] = temp_struct->paramName[i];
  156.      }
  157.      myOIDLen = baseNameLen+strlen(temp_struct->paramName);
  158.      i=snmp_oid_compare(name, *length, newNum, myOIDLen);
  159.      /* Assumes that the linked list sorted by OID, low to high */
  160.      if ( (i==0 && exact!=0) || (i<0 && exact==0) ) {
  161.        if (exact == 0) {
  162.  memcpy(name, newNum, myOIDLen*sizeof(oid));
  163.  *length = myOIDLen;
  164.        }
  165.        return temp_struct;
  166.      }
  167.    }
  168.    return(0);
  169. }  /* search_snmpTargetParamsTable */
  170. /* snmpTargetParams_rowStatusCheck is boolean funciton that  checks 
  171.    the status of a row's values in order to determine whether
  172.    the row should be notReady or notInService  */
  173. int snmpTargetParams_rowStatusCheck(
  174.      struct targetParamTable_struct *entry)
  175. {
  176.   if ( (entry->mpModel  < 0) || (entry->secModel < 0) ||
  177.        (entry->secLevel < 0) || (entry->secName == 0)   )
  178.     return 0;
  179.   else
  180.     return 1;
  181. }  /* snmtpTargetParamTable_rowStatusCheck */
  182. /* initialization routines */
  183. /* this variable defines function callbacks and type return information 
  184.    for the snmpTargetAddrEntry mib */
  185. struct variable2 snmpTargetParamsEntry_variables[] = {
  186.   { SNMPTARGETPARAMSMPMODEL,       ASN_INTEGER,   RWRITE, 
  187.     var_snmpTargetParamsEntry, 1, { SNMPTARGETPARAMSMPMODELCOLUMN } },
  188.   { SNMPTARGETPARAMSSECURITYMODEL, ASN_INTEGER,   RWRITE, 
  189.     var_snmpTargetParamsEntry, 1, { SNMPTARGETPARAMSSECURITYMODELCOLUMN } },
  190.   { SNMPTARGETPARAMSSECURITYNAME,  ASN_OCTET_STR, RWRITE, 
  191.     var_snmpTargetParamsEntry, 1, { SNMPTARGETPARAMSSECURITYNAMECOLUMN } },
  192.   { SNMPTARGETPARAMSSECURITYLEVEL, ASN_INTEGER,   RWRITE, 
  193.     var_snmpTargetParamsEntry, 1, { SNMPTARGETPARAMSSECURITYLEVELCOLUMN } },
  194.   { SNMPTARGETPARAMSSTORAGETYPE,   ASN_INTEGER,   RWRITE, 
  195.     var_snmpTargetParamsEntry, 1, { SNMPTARGETPARAMSSTORAGETYPECOLUMN } },
  196.   { SNMPTARGETPARAMSROWSTATUS,     ASN_INTEGER,   RWRITE, 
  197.     var_snmpTargetParamsEntry, 1, { SNMPTARGETPARAMSROWSTATUSCOLUMN } }
  198. };
  199. /* now load this mib into the agents mib table */
  200. oid snmpTargetParamsEntry_variables_oid[] = { 1,3,6,1,6,3,12,1,3,1 };
  201. void 
  202. init_snmpTargetParamsEntry(void)
  203. {
  204.   aPTable = 0;
  205.   REGISTER_MIB("target/snmpTargetParamsEntry", snmpTargetParamsEntry_variables,
  206. variable2, snmpTargetParamsEntry_variables_oid);
  207.   snmpd_register_config_handler("targetParams", snmpd_parse_config_targetParams,0,"");
  208.   /* we need to be called back later */
  209.   snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
  210.                          store_snmpTargetParamsEntry, NULL);
  211. }  /*  init_snmpTargetParmsEntry  */
  212. int snmpTargetParams_addParamName(
  213.      struct targetParamTable_struct *entry,
  214.      char   *cptr)
  215. {
  216.   int len;
  217.   if (cptr == 0) {
  218.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: no param name in config stringn"));
  219.     return(0);
  220.   }
  221.   else {
  222.     len = strlen(cptr);    
  223.     /* spec check for string 1-32 */
  224.     if (len < 1 || len > 32)  {
  225.       DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: param name out of range in config stringn"));
  226.       return(0);
  227.     }
  228.     entry->paramName = (char *)malloc(len + 1);
  229. if (entry->paramName == NULL)
  230. return 0;
  231.     strncpy(entry->paramName, cptr, len);
  232.     entry->paramName[len] = '';
  233.   }
  234.   return(1);
  235. }
  236.   
  237. int snmpTargetParams_addMPModel(
  238.      struct targetParamTable_struct *entry,
  239.      char   *cptr)
  240. {
  241.   if (cptr == 0) {
  242.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: no mp model in config stringn"));
  243.     return(0);
  244.   }
  245.   else if (!(isdigit(*cptr))) {
  246.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargeParamsEntry: mp model is not digit in config stringn"));
  247.     return(0);
  248.   }
  249.   /* spec check MP Model >= 0 */
  250.   else if ( (entry->mpModel = (int)strtol(cptr, (char **)NULL, 0)) < 0) {
  251.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargeParamsEntry: mp model out of range in config stringn"));
  252.     return(0);
  253.   }
  254.   return(1);
  255. }  /* snmpTargetParams_addMPModel  */
  256.   
  257. int snmpTargetParams_addSecModel(
  258.      struct targetParamTable_struct *entry,
  259.      char   *cptr)
  260. {
  261.   if (cptr == 0) {
  262.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: no sec model in config stringn"));
  263.     return(0);
  264.   }
  265.   else if (!(isdigit(*cptr))) {
  266.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargeParamsEntry: security model is not digit in config stringn"));
  267.     return(0);
  268.   }
  269.   /* spec check Sec. Model > 0 */
  270.   else if ( (entry->secModel = (int)strtol(cptr, (char **)NULL, 0)) <= 0) {
  271.       DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: security model out of range in config stringn"));
  272.       return(0);
  273.   }
  274.   return(1);
  275. }  /*  snmpTargetParams_addSecModel  */
  276. int snmpTargetParams_addSecName(
  277.      struct targetParamTable_struct *entry,
  278.      char   *cptr)
  279. {
  280.   int len;
  281.   if (cptr == 0) {
  282.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: no security name in config stringn"));
  283.     return(0);
  284.   }
  285.   else {
  286.     len = strlen(cptr);
  287.     entry->secName = (char *)malloc(len + 1);
  288. if (entry->secName == NULL)
  289. return 0;
  290.     strncpy(entry->secName, cptr, len);
  291.     entry->secName[len] = '';
  292.   }
  293.   return(1);
  294. }  /* snmpTargetParams_addSecName  */
  295. int snmpTargetParams_addSecLevel(
  296.      struct targetParamTable_struct *entry,
  297.      char   *cptr)
  298. {
  299.   if (cptr == 0) {
  300.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: no security level in config stringn"));
  301.     return(0);
  302.   }
  303.   else if (!(isdigit(*cptr)))  {
  304.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargeParamsEntry: security level is not digit in config stringn"));
  305.     return(0);
  306.    }
  307.   /* no spec range check, but noAuthNoPriv is 1 so... */
  308.   else if ( (entry->secLevel = (int)strtol(cptr, (char **)NULL, 0)) <= 0 ) {
  309.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargeParamsEntry: security level is not greater than 0 in config stringn"));
  310.     return(0);
  311.   }
  312.   return(1);
  313. }  /*  snmpTargetParams_addSecLevel  */
  314.   
  315. int snmpTargetParams_addStorageType(
  316.      struct targetParamTable_struct *entry,
  317.      char   *cptr)
  318. {
  319.   if (cptr == 0) {
  320.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: no storage type in config stringn"));
  321.     return(0);
  322.   }
  323.   else if (!(isdigit(*cptr))) {
  324.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargeParamsEntry: storage type is not digit in config stringn"));
  325.     return(0);
  326.   }
  327.   /* check that storage type is a possible value */
  328.   else if ( ((entry->storageType = (int)strtol(cptr, (char **)NULL, 0)) 
  329.      != SNMP_STORAGE_OTHER) &&
  330.     (entry->storageType != SNMP_STORAGE_VOLATILE) && 
  331.     (entry->storageType != SNMP_STORAGE_NONVOLATILE)  &&
  332.     (entry->storageType != SNMP_STORAGE_PERMANENT) && 
  333.     (entry->storageType != SNMP_STORAGE_READONLY) )  {
  334.     DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: storage type is not a valid value of"));
  335.     DEBUGMSG(("snmpTargetParamsEntry", " other(%d), volatile(%d), nonvolatile(%d), permanent(%d), or ",
  336.    SNMP_STORAGE_OTHER, SNMP_STORAGE_VOLATILE, SNMP_STORAGE_NONVOLATILE,
  337.    SNMP_STORAGE_PERMANENT));
  338.     DEBUGMSGTL(("snmpTargetParamsEntry","readonly(%d) in config string.n", SNMP_STORAGE_READONLY));
  339.     return(0);
  340.   }
  341.   return(1);
  342. }  /* snmpTargetParams_addStorageType  */
  343. int snmpTargetParams_addRowStatus(
  344.      struct targetParamTable_struct *entry,
  345.      char   *cptr)
  346. {
  347.   if (cptr == 0) {
  348.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargetParamsEntry: no row status in config stringn"));
  349.     return(0);
  350.   }
  351.   else if (!(isdigit(*cptr)))  {
  352.     DEBUGMSGTL(("snmpTargetParamsEntry","ERROR snmpTargeParamsEntry: row status is not digit in config stringn"));
  353.     return(0);
  354.   }
  355.   /* check that row status is a valid value */
  356.   else if ( ((entry->rowStatus = (int)strtol(cptr, (char **)NULL, 0)) 
  357.      != SNMP_ROW_ACTIVE) &&
  358.     (entry->rowStatus != SNMP_ROW_NOTINSERVICE) &&
  359.     (entry->rowStatus != SNMP_ROW_NOTREADY) ) {
  360.     DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: Row Status is not a valid value of "));
  361.     DEBUGMSG(("snmpTargetParamsEntry", "active(%d), notinservice(%d), or notready(%d) in config string.n",
  362.    SNMP_ROW_ACTIVE, SNMP_ROW_NOTINSERVICE, SNMP_ROW_NOTREADY));
  363.     return(0);
  364.   }
  365.   return(1);
  366. }  /* snmpTargetParams_addRowStatus  */
  367.     
  368. void snmpd_parse_config_targetParams(
  369.      const char *token, char *char_ptr)
  370. {
  371.   char *cptr = char_ptr, buff[1024];
  372.   struct targetParamTable_struct *newEntry;
  373.   newEntry = snmpTargetParamTable_create();
  374.   if (newEntry == NULL)
  375.   return;
  376.   cptr = copy_word(cptr, buff);
  377.   if (snmpTargetParams_addParamName(newEntry, buff) == 0) {
  378.     snmpTargetParamTable_dispose(newEntry);
  379.     return;
  380.   }
  381.   cptr = copy_word(cptr, buff);
  382.   if (snmpTargetParams_addMPModel(newEntry, buff) == 0) {
  383.     snmpTargetParamTable_dispose(newEntry);
  384.     return;
  385.   }
  386.   cptr = copy_word(cptr, buff);
  387.   if (snmpTargetParams_addSecModel(newEntry, buff) == 0) {
  388.     snmpTargetParamTable_dispose(newEntry);
  389.     return;
  390.   }
  391.   cptr = copy_word(cptr, buff);
  392.   if (snmpTargetParams_addSecName(newEntry, buff) == 0) {
  393.     snmpTargetParamTable_dispose(newEntry);
  394.     return;
  395.   }
  396.   cptr = copy_word(cptr, buff);
  397.   if (snmpTargetParams_addSecLevel(newEntry, buff) == 0) {
  398.     snmpTargetParamTable_dispose(newEntry);
  399.     return;
  400.   }
  401.   cptr = copy_word(cptr, buff);
  402.   if (snmpTargetParams_addStorageType(newEntry, buff) == 0) {
  403.     snmpTargetParamTable_dispose(newEntry);
  404.     return;
  405.   }
  406.   cptr = copy_word(cptr, buff);
  407.   if (snmpTargetParams_addRowStatus(newEntry, buff) == 0) {
  408.     snmpTargetParamTable_dispose(newEntry);
  409.     return;
  410.   }
  411.   sprintf(buff, "snmp_parse_config_targetParams, read: %s %d %d %s %d %d %dn",
  412.   newEntry->paramName, newEntry->mpModel,  newEntry->secModel, 
  413.   newEntry->secName,   newEntry->secLevel, newEntry->storageType,
  414.   newEntry->rowStatus);
  415.   DEBUGMSGTL(("snmpTargetParamsEntry", buff));
  416.   snmpTargetParamTable_addToList(newEntry, &aPTable);
  417. } /* snmpd_parse_config_target */
  418. /* shutdown routines */
  419. /* store_snmpTargetParamsEntry handles the presistent storage proccess 
  420.    for this MIB table. It writes out all the non-volatile rows 
  421.    to permanent storage on a shutdown  */
  422. int 
  423. store_snmpTargetParamsEntry(int majorID, int minorID, void *serverarg,
  424.                             void *clientarg)
  425. {
  426.   struct targetParamTable_struct *curr_struct;
  427.   char line[1024];
  428.   strcpy(line, "");
  429.   if ( (curr_struct = aPTable) != 0) {
  430.     while (curr_struct != 0) {
  431.       if ( (curr_struct->storageType == SNMP_STORAGE_NONVOLATILE || 
  432.     curr_struct->storageType == SNMP_STORAGE_PERMANENT) 
  433.                         &&
  434.    (curr_struct->rowStatus == SNMP_ROW_ACTIVE ||
  435.     curr_struct->rowStatus == SNMP_ROW_NOTINSERVICE) ) {
  436. sprintf(&line[strlen(line)], "targetParams %s %i %i %s %i %i %in",
  437.  curr_struct->paramName, curr_struct->mpModel,
  438.  curr_struct->secModel,  curr_struct->secName,
  439.  curr_struct->secLevel,  curr_struct->storageType,
  440.  curr_struct->rowStatus  );
  441. /* store to file */
  442. snmpd_store_config(line);
  443.       }
  444.       curr_struct = curr_struct->next;
  445.     }
  446.   }
  447.   return SNMPERR_SUCCESS;
  448. }  /*  store_snmpTargetParmsEntry  */
  449. /* MIB table access routines */
  450. u_char *
  451. var_snmpTargetParamsEntry(
  452.     struct  variable *vp,
  453.     oid     *name,
  454.     int  *length,
  455.     int     exact,
  456.     int  *var_len,
  457.     WriteMethod **write_method)
  458. {
  459.   /* variables we may use later */
  460.   static long long_ret;
  461.   static unsigned char string[1500];
  462.   struct targetParamTable_struct *temp_struct;
  463.   
  464.   *write_method = 0;           /* assume it isnt writable for the time being */
  465.   *var_len = sizeof(long_ret); /* assume an integer and change later if not */
  466.   
  467.   /* look for OID in current table */
  468.   if ( (temp_struct = search_snmpTargetParamsTable(vp->name, vp->namelen, 
  469.       name, length, exact)) == 0 ) {
  470.     if (vp->magic == SNMPTARGETPARAMSROWSTATUS)  {
  471.       *write_method = write_snmpTargetParamsRowStatus;
  472.     }
  473.     return(0);
  474.   }
  475.   
  476.   /* We found what we were looking for, either the next OID or the exact OID */
  477.   /* this is where we do the value assignments for the mib results. */
  478.   switch(vp->magic) {
  479.     case SNMPTARGETPARAMSMPMODEL:
  480.       *write_method = write_snmpTargetParamsMPModel;
  481.       /* if unset value, (i.e. new row) */
  482.       if (temp_struct->mpModel == -1)  return(0);
  483.       long_ret = temp_struct->mpModel;
  484.       return (unsigned char *) &long_ret;
  485.     case SNMPTARGETPARAMSSECURITYMODEL:
  486.       *write_method = write_snmpTargetParamsSecurityModel;
  487.       /* if unset value, (i.e. new row) */
  488.       if (temp_struct->secModel == -1)  return(0);
  489.       long_ret = temp_struct->secModel;
  490.       return (unsigned char *) &long_ret;
  491.     case SNMPTARGETPARAMSSECURITYNAME:
  492.       *write_method = write_snmpTargetParamsSecurityName;
  493.       /* if unset value, (i.e. new row) */
  494.       if (temp_struct->secName == 0)  return(0);
  495.       /* including null character. */
  496.       memcpy(string, temp_struct->secName, 
  497.      strlen(temp_struct->secName));
  498.       string[strlen(temp_struct->secName)] = '';
  499.       *var_len = strlen(temp_struct->secName);
  500.       return (unsigned char *) string;
  501.     case SNMPTARGETPARAMSSECURITYLEVEL:
  502.       *write_method = write_snmpTargetParamsSecurityLevel;
  503.       /* if unset value, (i.e. new row) */
  504.       if (temp_struct->secLevel == -1)  return(0);
  505.       long_ret = temp_struct->secLevel;
  506.       return (unsigned char *) &long_ret;
  507.     case SNMPTARGETPARAMSSTORAGETYPE:
  508.       *write_method = write_snmpTargetParamsStorageType;
  509.       long_ret = temp_struct->storageType;
  510.       return (unsigned char *) &long_ret;
  511.     case SNMPTARGETPARAMSROWSTATUS:
  512.       *write_method = write_snmpTargetParamsRowStatus;
  513.       long_ret = temp_struct->rowStatus;
  514.       return (unsigned char *) &long_ret;
  515.     default:
  516.       DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_snmpTargetParamsEntryn", vp->magic));
  517.   }
  518.   return 0;
  519. }  /* var_snmpTargetParamsEntry */
  520. /* Assign a value to the mpModel variable */
  521. int
  522. write_snmpTargetParamsMPModel(
  523.    int      action,
  524.    u_char   *var_val,
  525.    u_char   var_val_type,
  526.    int   var_val_len,
  527.    u_char   *statP,
  528.    oid      *name,
  529.    int   name_len)
  530. {
  531.   static long                    long_ret;
  532.   struct targetParamTable_struct *temp_struct;
  533.   /* check incoming variable */
  534.   if (var_val_type != ASN_INTEGER) {
  535.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsMPModel : not ASN_INTEGERn"));
  536.       return SNMP_ERR_WRONGTYPE;
  537.   }
  538.   if (var_val_len > (sizeof(long_ret))) {
  539.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsMPModel : bad lengthn"));
  540.       return SNMP_ERR_WRONGLENGTH;
  541.   }
  542.   long_ret = *((long *) var_val);
  543.   /* spec check range */
  544.   if (long_ret < 0) {
  545.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsMPModel : MP Model out of rangen"));
  546.     return SNMP_ERR_INCONSISTENTVALUE;
  547.   }
  548.   /* Find row in linked list and check pertinent status... */
  549.   snmpTargetParamsOID[snmpTargetParamsOIDLen-1] = SNMPTARGETPARAMSMPMODELCOLUMN;
  550.   if ((temp_struct = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, 
  551.      name, &name_len, 1)) == 0 ) {
  552.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsMPModel : BAD OIDn"));
  553.     return SNMP_ERR_NOSUCHNAME;
  554.   }
  555.   /* row exists, check if it is changeable */
  556.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  557.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamMPModel : row is read onlyn"));
  558.     return SNMP_ERR_READONLY;
  559.   }
  560.   /* check if row is active */
  561.   if (temp_struct->rowStatus == SNMP_ROW_ACTIVE) {
  562.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsMPModel : This change not allowed in active row.n"));
  563.     return SNMP_ERR_INCONSISTENTVALUE;
  564.   }
  565.   /* Finally, we're golden, should we save value? */
  566.   if (action == COMMIT)  {
  567.     temp_struct->mpModel = long_ret;
  568.     /* If row is new, check if its status can be updated */
  569.     if ( (temp_struct->rowStatus == SNMP_ROW_NOTREADY) &&
  570.  (snmpTargetParams_rowStatusCheck(temp_struct) != 0) )
  571.       temp_struct->rowStatus = SNMP_ROW_NOTINSERVICE;
  572.   }
  573.   return SNMP_ERR_NOERROR;
  574. }  /* write_snmpTargetParamsMPModel */
  575. /* Assign a value to the Security Model variable */
  576. int
  577. write_snmpTargetParamsSecurityModel(
  578.    int      action,
  579.    u_char   *var_val,
  580.    u_char   var_val_type,
  581.    int   var_val_len,
  582.    u_char   *statP,
  583.    oid      *name,
  584.    int   name_len)
  585. {
  586.   static long                    long_ret;
  587.   struct targetParamTable_struct *temp_struct;
  588.   /* check incoming variable */
  589.   if (var_val_type != ASN_INTEGER) {
  590.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityModel : not ASN_INTEGERn"));
  591.       return SNMP_ERR_WRONGTYPE;
  592.   }
  593.   if (var_val_len > (sizeof(long_ret))) {
  594.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityModel : bad lengthn"));
  595.       return SNMP_ERR_WRONGLENGTH;
  596.   }
  597.   long_ret = *((long *) var_val);
  598.   /* spec check range */
  599.   if (long_ret <= 0)  {
  600.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecModel : Security Model out of rangen"));
  601.     return SNMP_ERR_INCONSISTENTVALUE;
  602.   }
  603.   /* Find struct in linked list and check row status */
  604.   snmpTargetParamsOID[snmpTargetParamsOIDLen-1] = SNMPTARGETPARAMSSECURITYMODELCOLUMN;
  605.   if ((temp_struct = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, 
  606.      name, &name_len, 1)) == 0 ) {
  607.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamSecurityModel : BAD OID!n"));
  608.       return SNMP_ERR_NOSUCHNAME;
  609.   }
  610.   /* row exists, check if it is changeable */
  611.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  612.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamSecurityModel : row is read onlyn"));
  613.     return SNMP_ERR_READONLY;
  614.   }
  615.   /* check if row active */
  616.   if (temp_struct->rowStatus == SNMP_ROW_ACTIVE) {
  617.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamSecurityModel : This change not allowed in active row.n"));
  618.     return SNMP_ERR_INCONSISTENTVALUE;
  619.   }
  620.   /* Finally, we're golden, check if we should save value */
  621.   if (action == COMMIT)  {    
  622.     temp_struct->secModel = long_ret;
  623.     /* If row is new, check if its status can be updated */
  624.     if ( (temp_struct->rowStatus == SNMP_ROW_NOTREADY) &&
  625.  (snmpTargetParams_rowStatusCheck(temp_struct) != 0) )
  626.       temp_struct->rowStatus = SNMP_ROW_NOTINSERVICE;
  627.   }
  628.   return SNMP_ERR_NOERROR;
  629. }  /* write_snmpTargetParamsSecurityModel */
  630. /* Assign a value to the Security Name variable */
  631. int
  632. write_snmpTargetParamsSecurityName(
  633.    int      action,
  634.    u_char   *var_val,
  635.    u_char   var_val_type,
  636.    int   var_val_len,
  637.    u_char   *statP,
  638.    oid      *name,
  639.    int   name_len)
  640. {
  641.   static unsigned char           string[1500];
  642.   int  size;
  643.   struct targetParamTable_struct *temp_struct;
  644.   /* check incoming variable */
  645.   if (var_val_type != ASN_OCTET_STR) {
  646.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityName : not ASN_OCTET_STRn"));
  647.       return SNMP_ERR_WRONGTYPE;
  648.   }
  649.   if (var_val_len > (sizeof(string))) {
  650.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityName : bad lengthn"));
  651.       return SNMP_ERR_WRONGLENGTH;
  652.   }
  653.   /* spec check, 0-255, this means EMPTY STRINGS ALLOWED! */
  654.   size = var_val_len;
  655.   memcpy(string, var_val, var_val_len);
  656.   if (size > 255 || size < 0) {
  657.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityName : bad lengthn"));
  658.     return SNMP_ERR_WRONGLENGTH;
  659.   }
  660.   /* Find the struct in the linked list and check row status */
  661.   snmpTargetParamsOID[snmpTargetParamsOIDLen-1] = SNMPTARGETPARAMSSECURITYNAMECOLUMN;
  662.   if ((temp_struct = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, 
  663.      name, &name_len, 1)) == 0 ) {
  664.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityName : BAD OID!n"));
  665.     return SNMP_ERR_NOSUCHNAME;
  666.   }
  667.   /* row exists, check if it is changeable */
  668.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  669.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityName : row is read onlyn"));
  670.     return SNMP_ERR_READONLY;
  671.   }
  672.   /* check if row active */
  673.   if (temp_struct->rowStatus == SNMP_ROW_ACTIVE) {
  674.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityName : This change not allowed in active row.n"));
  675.     return SNMP_ERR_INCONSISTENTVALUE;
  676.   }
  677.   /* Finally, we're golden, check if we should save value */
  678.   if (action == COMMIT)  {    
  679.     free(temp_struct->secName);
  680.     temp_struct->secName = (char *)malloc(size + 1);
  681. if (temp_struct->secName == NULL)
  682. return SNMP_ERR_COMMITFAILED;
  683.     memcpy(temp_struct->secName, string, size);
  684.     temp_struct->secName[size] = '';
  685.     
  686.     /* If row is new, check if its status can be updated */
  687.     if ( (temp_struct->rowStatus == SNMP_ROW_NOTREADY) &&
  688.  (snmpTargetParams_rowStatusCheck(temp_struct) != 0) )
  689.       temp_struct->rowStatus = SNMP_ROW_NOTINSERVICE;
  690.   }
  691.   return SNMP_ERR_NOERROR;
  692. }  /* write_snmpTargetParamsSecurityName */
  693. int
  694. write_snmpTargetParamsSecurityLevel(
  695.    int      action,
  696.    u_char   *var_val,
  697.    u_char   var_val_type,
  698.    int   var_val_len,
  699.    u_char   *statP,
  700.    oid      *name,
  701.    int   name_len)
  702. {
  703.   static long                    long_ret;
  704.   struct targetParamTable_struct *temp_struct;
  705.  
  706.   /* check incoming variable */
  707.   if (var_val_type != ASN_INTEGER) {
  708.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityLevel : not ASN_INTEGERn"));
  709.       return SNMP_ERR_WRONGTYPE;
  710.   }
  711.   if (var_val_len > (sizeof(long_ret))) {
  712.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityLevel : bad lengthn"));
  713.       return SNMP_ERR_WRONGLENGTH;
  714.   }
  715.   long_ret = *((long *) var_val);
  716.   /* spec check, no spec check, but noAuthNoPriv is 1 so... */
  717.   if (long_ret <= 0 )  {
  718.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargeParamsSecurityLevel: security level is not noAuthNoPriv(1) or highern"));
  719.     return SNMP_ERR_INCONSISTENTVALUE;
  720.   }
  721.   /* Find the struct in linked list and check its status */
  722.   snmpTargetParamsOID[snmpTargetParamsOIDLen-1] = SNMPTARGETPARAMSSECURITYLEVELCOLUMN;
  723.   if ((temp_struct = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, 
  724.      name, &name_len, 1)) == 0 ) {
  725.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityLevel : BAD OID!n"));
  726.     return SNMP_ERR_NOSUCHNAME;
  727.   }
  728.   /* row exists, check if it is changeable */
  729.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  730.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityLevel : row is read onlyn"));
  731.     return SNMP_ERR_READONLY;
  732.   }
  733.   /* check if row active */
  734.   if (temp_struct->rowStatus == SNMP_ROW_ACTIVE) {
  735.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsSecurityLevel : This change not allowed in active row.n"));
  736.     return SNMP_ERR_INCONSISTENTVALUE;
  737.   }
  738.   /* Finally, we're golden, check if we should save value */
  739.   if (action == COMMIT) {
  740.     temp_struct->secLevel = long_ret;
  741.     
  742.     /* If row is new, check if its status can be updated */
  743.     if ( (temp_struct->rowStatus == SNMP_ROW_NOTREADY) &&
  744.  (snmpTargetParams_rowStatusCheck(temp_struct) != 0) )
  745.       temp_struct->rowStatus = SNMP_ROW_NOTINSERVICE;
  746.   }
  747.   return SNMP_ERR_NOERROR;
  748. } /* write_snmpTargetParamsSecurityLevel */
  749. /* Assign a value to the Storage Type variable */
  750. int
  751. write_snmpTargetParamsStorageType(
  752.    int      action,
  753.    u_char   *var_val,
  754.    u_char   var_val_type,
  755.    int   var_val_len,
  756.    u_char   *statP,
  757.    oid      *name,
  758.    int   name_len)
  759. {
  760.   static long                    long_ret;
  761.   struct targetParamTable_struct *temp_struct;
  762.   if (var_val_type != ASN_INTEGER) {
  763.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsStorageType not ASN_INTEGERn"));
  764.       return SNMP_ERR_WRONGTYPE;
  765.   }
  766.   if (var_val_len > (sizeof(long_ret))) {
  767.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsStorageType: bad lengthn"));
  768.       return SNMP_ERR_WRONGLENGTH;
  769.   }
  770.   long_ret = *((long *) var_val);
  771.   
  772.   if ( (long_ret != SNMP_STORAGE_OTHER) && (long_ret != SNMP_STORAGE_VOLATILE) &&
  773.        (long_ret != SNMP_STORAGE_NONVOLATILE) )  {
  774.     DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsStorageType : attempted storage type not a valid"));
  775.     DEBUGMSG(("snmpTargetParamsEntry", "  value of other(%d), volatile(%d), or nonvolatile(%d)n", 
  776.    SNMP_STORAGE_OTHER, SNMP_STORAGE_VOLATILE, SNMP_STORAGE_NONVOLATILE));
  777.     return SNMP_ERR_INCONSISTENTVALUE;
  778.   }
  779.   /* Find the struct in the linked list and check status */
  780.   snmpTargetParamsOID[snmpTargetParamsOIDLen-1] = SNMPTARGETPARAMSSTORAGETYPECOLUMN;
  781.   if ((temp_struct = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, 
  782.      name, &name_len, 1)) == 0 ) {
  783.     DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamStorageType : BAD OIDn"));
  784.     return SNMP_ERR_NOSUCHNAME;
  785.   }
  786.   if ( (temp_struct->storageType == SNMP_STORAGE_PERMANENT) || 
  787.        (temp_struct->storageType == SNMP_STORAGE_READONLY) )  {
  788.     DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsStorageType : row has unchangeable storage status: %dn",
  789.    temp_struct->storageType));
  790.     return SNMP_ERR_INCONSISTENTVALUE;
  791.   }
  792.   /* Finally, we're golden, check if we should save new value */
  793.   if (action == COMMIT) {      
  794.     temp_struct->storageType = long_ret;
  795.   }
  796.   return SNMP_ERR_NOERROR;
  797. }  /* write_snmpTargetParamsStorageType */
  798. /* snmpTargeParams_createNewRow is called from write_snmpTargetParamsRowStatus
  799.    when a new row is required. It creates a new row with 
  800.    the index of the passed in 'name' (i.e. full index OID) and
  801.    adds it to the linked list. 'name' should be the full OID of the new index. 
  802.    It passes back 0 if unsuccessfull.*/
  803. int snmpTargetParams_createNewRow(
  804.      oid  *name,
  805.      int name_len)
  806. {
  807.   int    pNameLen, i;
  808.   struct targetParamTable_struct *temp_struct;
  809.   /* setup a new snmpTargetParamTable structure and add it to the list */
  810.   pNameLen = name_len - snmpTargetParamsOIDLen;
  811.   if (pNameLen > 0) {
  812.     temp_struct            = snmpTargetParamTable_create();
  813. if (temp_struct == NULL)
  814. return 0;
  815.     temp_struct->paramName = (char *)malloc(pNameLen + 1);
  816. if (temp_struct->paramName == NULL)
  817. {
  818. free (temp_struct);
  819. return 0;
  820. }
  821.     for (i = 0; i < pNameLen; i++) {
  822.       temp_struct->paramName[i] = (char)name[i+snmpTargetParamsOIDLen];
  823.     }
  824.     temp_struct->paramName[pNameLen]  = '';
  825.     temp_struct->rowStatus            = SNMP_ROW_NOTREADY;
  826.     
  827.     snmpTargetParamTable_addToList(temp_struct, &aPTable);
  828.     return 1;
  829.   }
  830.   return 0;
  831. }  /* snmpTargetParams_createNewRow */
  832. /* Assign a value to the Row Status variable */
  833. int
  834. write_snmpTargetParamsRowStatus(
  835.    int      action,
  836.    u_char   *var_val,
  837.    u_char   var_val_type,
  838.    int   var_val_len,
  839.    u_char   *statP,
  840.    oid      *name,
  841.    int   name_len)
  842. {
  843.   enum commit_action_enum        {NOTHING, DESTROY, CREATE, CHANGE};
  844.   enum commit_action_enum        onCommitDo; 
  845.   static long                    long_ret;
  846.   struct targetParamTable_struct *temp_struct; /*also treated as boolean for row lookup*/
  847.   if (var_val_type != ASN_INTEGER) {
  848.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsRowStatus not ASN_INTEGERn"));
  849.       return SNMP_ERR_WRONGTYPE;
  850.   }
  851.   if (var_val_len > (sizeof(long_ret))) {
  852.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamsRowStatus: bad lengthn"));
  853.       return SNMP_ERR_WRONGLENGTH;
  854.   }
  855.   long_ret = *((long *) var_val);
  856.   /* search for struct in linked list */
  857.   snmpTargetParamsOID[snmpTargetParamsOIDLen-1] = SNMPTARGETPARAMSROWSTATUSCOLUMN;
  858.   if ((temp_struct = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, 
  859.      name, &name_len, 1)) == 0) {
  860.     /* row doesn't exist, check valid possibilities */
  861.     if (long_ret == SNMP_ROW_DESTROY)  
  862.       /* re: RFC 1903, destroying a non-existent row is noError, whatever */
  863.       onCommitDo = NOTHING;
  864.     /* check if this is for a new row creation */
  865.     else if (long_ret == SNMP_ROW_CREATEANDGO || long_ret == SNMP_ROW_CREATEANDWAIT) 
  866.       onCommitDo = CREATE;
  867.     else /* no valid sets for no row being found so... */
  868.       return SNMP_ERR_NOSUCHNAME;
  869.   }
  870.   else {  /* row exists */
  871.     /* check if it is changeable */
  872.     if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  873.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamRowStatus : row is read onlyn"));
  874.       return SNMP_ERR_READONLY;
  875.     }
  876.     /* check if row is to be destroyed (note: it is ok to destroy notReady row!) */
  877.     else if (long_ret == SNMP_ROW_DESTROY)  {
  878.       if (temp_struct->storageType == SNMP_STORAGE_PERMANENT) {
  879. DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamRowStatus : unable to destroy permanent rown"));
  880. return SNMP_ERR_INCONSISTENTVALUE;
  881.       }
  882.       else  {
  883. onCommitDo = DESTROY;
  884.       }
  885.     }
  886.     /* check if row is new and can be changed from notready yet */
  887.     else if (temp_struct->rowStatus == SNMP_ROW_NOTREADY) {
  888.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargeParamRowStatus : unable to change from NOTREADYn"));
  889.       return SNMP_ERR_INCONSISTENTVALUE;
  890.     }  
  891.     /* we now know the row status can be set, check for two valid settings left*/
  892.     else if ( (long_ret == SNMP_ROW_ACTIVE) || 
  893.       (long_ret == SNMP_ROW_NOTINSERVICE) ) {
  894.       onCommitDo = CHANGE;
  895.     }
  896.     /* not a valid setting */
  897.     else  {
  898.       DEBUGMSGTL(("snmpTargetParamsEntry","write to snmpTargetParamRowStatus : Bad value for setn"));
  899.       return SNMP_ERR_INCONSISTENTVALUE;
  900.     }
  901.   } /* if row exist */
  902.   
  903.   /* if this is a commit, do expected action */
  904.   if (action == COMMIT) {
  905.     switch(onCommitDo) { 
  906.       
  907.     case CREATE :
  908.       if (snmpTargetParams_createNewRow(name, name_len) == 0) {
  909. DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsRowStatus : "));
  910. DEBUGMSG(("snmpTargetParamsEntry","failed new row creation, bad OID/index value n"));
  911. return SNMP_ERR_GENERR;
  912.       }
  913.       break;
  914.       
  915.     case DESTROY:
  916.       snmpTargetParamTable_remFromList(temp_struct, &aPTable);
  917.       break;
  918.     case CHANGE:
  919.   if ((temp_struct->rowStatus != SNMP_ROW_ACTIVE) && (long_ret == SNMP_ROW_ACTIVE))
  920.   {
  921.   temp_struct->rowStatus = long_ret;
  922.   snmpTargetTryToAddTrap (temp_struct->paramName);
  923.   }
  924.   else if ((temp_struct->rowStatus == SNMP_ROW_ACTIVE) && (long_ret != SNMP_ROW_ACTIVE))
  925.   {
  926.   snmpTargetTryToDelTrap (temp_struct->paramName);
  927.   }
  928.       temp_struct->rowStatus = long_ret;
  929.       break;
  930.     case NOTHING:
  931. default:
  932.       break;
  933.     }
  934.   }
  935.   
  936.   return SNMP_ERR_NOERROR;
  937. }  /* write_snmpTargetParamsRowStatus */
  938. /**************************************************
  939. *Called when delete an existing trap_sink
  940. *IN: host_name -- ip address in string format
  941. *IN: community -- community string of the trap_sink
  942. * --sxf 2k-12-27
  943. *******************************************************/
  944. void snmp_delete_targetParam (char *host_name, char *community)
  945. {
  946. struct targetParamTable_struct *temp_struct, *temp_struct_next;
  947. char  buf[256];
  948. if (host_name == NULL || community == NULL)
  949. {
  950. snmp_trace("SNMP In add target entry: community or host_name not provided!n");
  951. return;
  952. }
  953. if (strlen (community) + strlen (host_name) > 200)
  954. {
  955. snmp_trace("SNMP In add target entry: community or host_name length to long!n");
  956. return;
  957. }
  958. sprintf (buf, "traphost.%s.%s",community,host_name);
  959. for( temp_struct = aPTable; temp_struct != NULL; ) 
  960. {
  961. temp_struct_next = temp_struct->next;
  962. if (strcmp (buf,temp_struct->paramName) == 0)
  963. {
  964. snmpTargetParamTable_remFromList(temp_struct, &aPTable);
  965. }
  966. temp_struct = temp_struct_next;
  967.    }
  968. }
  969. /*********************************************************************
  970. *Called when create a new host to send trap
  971. *IN: host_name -- ip address in string format
  972. *IN: community -- community of trapd application in manager entity
  973. *IN: model -- for v1 model is 0
  974. *IN: secModel -- the security model
  975. *IN: secName -- for v1 it is the community string
  976. *IN: secLevel -- noAuth authNoPriv or authPriv
  977. *    --sxf 2k-12-27
  978. *******************************************************************/
  979. void snmp_add_targetParam (char *host_name, char *community, int model, 
  980.    int secModel, char *secName, int secLevel)
  981. {
  982. struct targetParamTable_struct *newEntry;
  983. char  buf[256];
  984. if (host_name == NULL || community == NULL)
  985. {
  986. snmp_trace("SNMP In add param entry: community or host_name not provided!n");
  987. return;
  988. }
  989. if (strlen (community) + strlen (host_name) > 200)
  990. {
  991. snmp_trace("SNMP In add param entry: community or host_name length to long!n");
  992. return;
  993. }
  994. snmp_delete_targetParam (host_name, community);
  995. newEntry = snmpTargetParamTable_create();
  996. if (newEntry == NULL)
  997. {
  998. snmp_trace("SNMP In add param entry:Insufficient memoryn");
  999. return;
  1000. }
  1001. sprintf (buf, "traphost.%s.%s",community,host_name);
  1002. newEntry->paramName = strdup (buf);
  1003. if (newEntry->paramName == NULL)
  1004. {
  1005. snmp_trace("SNMP In add target entry:Out of memoryn");
  1006. free (newEntry);
  1007. return;
  1008. }
  1009. newEntry->mpModel = model;
  1010. newEntry->secModel = secModel;
  1011. if (secName != NULL)
  1012. {
  1013. newEntry->secName = strdup (secName);
  1014. if (newEntry->secName == NULL)
  1015. {
  1016. snmp_trace("SNMP In add target entry:Out of memoryn");
  1017. free (newEntry);
  1018. free (newEntry->paramName);
  1019. return;
  1020. }
  1021. }
  1022. newEntry->secLevel = secLevel;
  1023. newEntry->storageType = SNMP_STORAGE_NONVOLATILE;
  1024. newEntry->rowStatus = SNMP_ROW_ACTIVE;
  1025. snmpTargetParamTable_addToList(newEntry, &aPTable);
  1026. }
  1027. int snmpTargetGetCommFromIndex (char *name, char *buf)
  1028. {
  1029. struct targetParamTable_struct *temp_struct;
  1030. for( temp_struct = aPTable; temp_struct != NULL; temp_struct = temp_struct->next) 
  1031. {
  1032. if (strcmp (name,temp_struct->paramName) == 0 && temp_struct->rowStatus == SNMP_ROW_ACTIVE)
  1033. {
  1034. strncpy (buf, temp_struct->secName, 256);
  1035. return 1;
  1036. }
  1037. }
  1038. return 0;
  1039. }