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

SNMP编程

开发平台:

C/C++

  1. /* snmpTargetAddrEntry MIB
  2.    
  3.    This file was generated by mib2c and is intended for use as a mib module
  4.    for the ucd-snmp snmpd agent. Edited by Michael Baer
  5.    last changed 2/2/99.
  6. */
  7. #include <config.h>
  8. #if HAVE_STRING_H
  9. #include <string.h>
  10. #else
  11. #include <strings.h>
  12. #endif
  13. #include <stdlib.h>
  14. #include <ctype.h>
  15. #if HAVE_WINSOCK_H
  16. #include <ip/socket.h>
  17. #endif
  18. #include "mibincl.h"
  19. #include "snmpTargetAddrEntry.h"
  20. #include "read_config.h"
  21. #include "callback.h"
  22. #include "util_funcs.h"
  23. #define snmpTargetAddrOIDLen 11 /*This is base+column, 
  24.   i.e. everything but index*/
  25. oid snmpTargetAddrOID[snmpTargetAddrOIDLen] = {1,3,6,1,6,3,12,1,2,1,0};
  26. static struct targetAddrTable_struct *aAddrTable=0;
  27. static unsigned int snmpTargetSpinLock = 420420;
  28. /* Utility routines */
  29. extern char *snmp_ntoa (long );
  30. extern char *strdup (const char*);
  31. /* TargetAddrTable_create creates and returns a pointer
  32.    to a targetAddrTable_struct with default values set */
  33. /* Convert Internet address in ascii dotted-decimal format (44.0.0.1) to
  34.  * binary IP address
  35.  */
  36. int32
  37. aton(char *s)
  38. {
  39.     int32 n;
  40.   
  41.     register int i;
  42.   
  43.     n = 0;
  44.     if(s == NULLCHAR)
  45.         return 0;
  46.     for(i=24;i>=0;i -= 8){
  47.         /* Skip any leading stuff (e.g., spaces, '[') */
  48.         while(*s != '' && !isdigit(*s))
  49.             s++;
  50.         if(*s == '')
  51.             break;
  52.         n |= (int32)atoi(s) << i;
  53.         if((s = strchr(s,'.')) == NULLCHAR)
  54.             break;
  55.         s++;
  56.     }
  57.     return n;
  58. }
  59.   
  60. struct targetAddrTable_struct 
  61. *snmpTargetAddrTable_create(void)
  62. {
  63.   struct targetAddrTable_struct *newEntry;
  64.   newEntry = (struct targetAddrTable_struct *)
  65.     malloc(sizeof(struct targetAddrTable_struct));
  66.   if (newEntry) {
  67.   newEntry->name        = 0;
  68.   newEntry->tDomainLen  = 0;
  69.   newEntry->tAddress    = 0;
  70.  
  71.   newEntry->timeout     = 1500;
  72.   newEntry->retryCount  = 3;
  73.   newEntry->tagList     = strdup("");
  74.   if (newEntry->tagList == NULL)
  75.   {
  76.   free (newEntry);
  77.   return NULL;
  78.   }
  79.   newEntry->params      = 0;
  80.   newEntry->spinLock    = 0;
  81.   newEntry->storageType = SNMP_STORAGE_NONVOLATILE;
  82.   newEntry->rowStatus   = SNMP_ROW_NONEXISTENT;
  83.   newEntry->next        = 0;
  84.   }
  85.   return newEntry;
  86. }  /* snmpTargetAddrTable_create */
  87. /* TargetAddrTable_dispose frees the space allocated to a
  88.    targetAddrTable_struct */
  89. void snmpTargetAddrTable_dispose(struct targetAddrTable_struct *reaped)
  90. {
  91.   free(reaped->name);
  92.   free(reaped->tAddress);
  93.   free(reaped->tagList);
  94.   free(reaped->params);
  95.   
  96.   free(reaped);
  97. }  /* snmpTargetAddrTable_dispose  */
  98. /* snmpTargetAddrTable_addToList adds a targetAddrTable_struct 
  99.    to a list passed in. The list is assumed to be in a sorted order,
  100.    low to high and this procedure inserts a new struct in the proper 
  101.    location. Sorting uses OID values based on name. A new equal value 
  102.    overwrites a current one. */
  103. void snmpTargetAddrTable_addToList(
  104.      struct targetAddrTable_struct *newEntry,
  105.      struct targetAddrTable_struct **listPtr)
  106. {
  107.   static struct targetAddrTable_struct *curr_struct, *prev_struct;
  108.   int    i;
  109.   int newOIDLen, currOIDLen;
  110.   oid    newOID[128], currOID[128];
  111.   
  112.   /* if the list is empty, add the new entry to the top */
  113.   if ( (prev_struct = curr_struct = *listPtr) == 0 ) {
  114.     *listPtr = newEntry;
  115.     return;
  116.   }
  117.   else {
  118.     /* get the 'OID' value of the new entry */
  119.     newOIDLen = strlen(newEntry->name);
  120.     for(i=0; i < (int)newOIDLen ;i++) {
  121.       newOID[i] = newEntry->name[i];
  122.     }
  123.     /* search through the list for an equal or greater OID value */
  124.     while (curr_struct != 0) {
  125.       currOIDLen = strlen(curr_struct->name);
  126.       for(i=0; i < (int)currOIDLen ;i++) {
  127. currOID[i] = curr_struct->name[i];
  128.       }
  129.       i=snmp_oid_compare(newOID, newOIDLen, currOID, currOIDLen);
  130.       if (i==0) {  /* Exact match, overwrite with new struct */
  131. newEntry->next = curr_struct->next;
  132. /* if curr_struct is the top of the list */
  133. if (*listPtr == curr_struct)  *listPtr = newEntry;
  134. else prev_struct->next = newEntry;
  135. snmpTargetAddrTable_dispose(curr_struct);
  136. return;
  137.       }
  138.       else if (i < 0) { /* Found a greater OID, insert struct in front of it.*/
  139. newEntry->next = curr_struct;
  140. /* if curr_struct is the top of the list */
  141. if (*listPtr == curr_struct) *listPtr = newEntry;
  142. else prev_struct->next = newEntry;
  143. return;
  144.       }
  145.       prev_struct = curr_struct;
  146.       curr_struct = curr_struct->next;
  147.     }
  148.   }
  149.   /* if we're here, no larger OID was ever found, insert on end of list */
  150.   prev_struct->next = newEntry;
  151. }  /* snmpTargeAddrTable_addToList  */
  152. /* snmpTargetAddrTable_remFromList removes a targetAddrTable_struct 
  153.    from the list passed in */
  154. void snmpTargetAddrTable_remFromList(
  155.      struct targetAddrTable_struct *oldEntry,
  156.      struct targetAddrTable_struct **listPtr)
  157. {
  158.   struct targetAddrTable_struct *tptr;
  159.   if ( (tptr = *listPtr) == 0 ) return;
  160.   else if (tptr == oldEntry) {
  161.     *listPtr = (*listPtr)->next;
  162.     snmpTargetAddrTable_dispose(tptr);
  163.     return;
  164.   }
  165.   else  {
  166.     while (tptr->next != 0) {
  167.       if (tptr->next == oldEntry) {
  168. tptr->next = tptr->next->next;
  169. snmpTargetAddrTable_dispose(oldEntry);
  170. return;
  171.       }
  172.       tptr = tptr->next;
  173.     }
  174.   }
  175. }  /* snmpTargetAddrTable_remFromList  */
  176. /* lookup OID in the link list of Addr Table Entries */
  177. struct targetAddrTable_struct *
  178. search_snmpTargetAddrTable(
  179.      oid    *baseName,
  180.      int  baseNameLen,
  181.      oid    *name,
  182.      int *length,
  183.      int    exact)
  184. {
  185.    static struct targetAddrTable_struct *temp_struct;
  186.    int    i;
  187.    int myOIDLen;
  188.    oid    newNum[128];
  189.    /* lookup entry in addrTable linked list, Get Current MIB ID */
  190.    memcpy(newNum, baseName, baseNameLen*sizeof(oid));
  191.   
  192.    for( temp_struct = aAddrTable; temp_struct != 0; temp_struct = temp_struct->next) {
  193.      for(i=0; i < (int)strlen(temp_struct->name) ;i++) {
  194.        newNum[baseNameLen+i] = temp_struct->name[i];
  195.      }
  196.      myOIDLen = baseNameLen+strlen(temp_struct->name);
  197.      i=snmp_oid_compare(name, *length, newNum, myOIDLen);
  198.      /* Assumes that the linked list sorted by OID, low to high */
  199.      if ( (i==0 && exact!=0) || (i<0 && exact==0) ) {
  200.        if (exact == 0) {
  201.  memcpy(name, newNum, myOIDLen*sizeof(oid));
  202.  *length = myOIDLen;
  203.        }
  204.        return temp_struct;
  205.      }
  206.    }
  207.    return(0);
  208. }  /* search_snmpTargetAddrTable  */
  209. /* snmpTargetAddr_rowStatusCheck is boolean funciton that  checks 
  210.    the status of a row's values in order to determine whether
  211.    the row should be notReady or notInService  */
  212. int snmpTargetAddr_rowStatusCheck(struct targetAddrTable_struct *entry)
  213. {
  214.   if ( (entry->tDomainLen == 0) || (entry->tAddress == 0) ||
  215.        (entry->params == 0)  )
  216.     return 0;
  217.   else
  218.     return 1;
  219. }  /* snmtpTargetAddrTable_rowStatusCheck */
  220. /* Init routines */
  221. /* this variable defines function callbacks and type return information 
  222.    for the snmpTargetAddrEntry mib */
  223. struct variable2 snmpTargetAddrEntry_variables[] = {
  224.   { SNMPTARGETADDRTDOMAIN,     ASN_OBJECT_ID , RWRITE, 
  225.     var_snmpTargetAddrEntry, 1, { SNMPTARGETADDRTDOMAINCOLUMN } },
  226.   { SNMPTARGETADDRTADDRESS,    ASN_OCTET_STR , RWRITE, 
  227.     var_snmpTargetAddrEntry, 1, { SNMPTARGETADDRTADDRESSCOLUMN } },
  228.   { SNMPTARGETADDRTIMEOUT,     ASN_INTEGER   , RWRITE, 
  229.     var_snmpTargetAddrEntry, 1, { SNMPTARGETADDRTIMEOUTCOLUMN } },
  230.   { SNMPTARGETADDRRETRYCOUNT,  ASN_INTEGER   , RWRITE, 
  231.     var_snmpTargetAddrEntry, 1, { SNMPTARGETADDRRETRYCOUNTCOLUMN } },
  232.   { SNMPTARGETADDRTAGLIST,     ASN_OCTET_STR , RWRITE, 
  233.     var_snmpTargetAddrEntry, 1, {SNMPTARGETADDRTAGLISTCOLUMN } },
  234.   { SNMPTARGETADDRPARAMS,      ASN_OCTET_STR , RWRITE, 
  235.     var_snmpTargetAddrEntry, 1, { SNMPTARGETADDRPARAMSCOLUMN } },
  236.   { SNMPTARGETADDRSTORAGETYPE, ASN_INTEGER   , RWRITE, 
  237.     var_snmpTargetAddrEntry, 1, { SNMPTARGETADDRSTORAGETYPECOLUMN } },
  238.   { SNMPTARGETADDRROWSTATUS,   ASN_INTEGER   , RWRITE, 
  239.     var_snmpTargetAddrEntry, 1, { SNMPTARGETADDRROWSTATUSCOLUMN } },
  240. };
  241. struct variable2 snmpTargetSpinLock_variables[] = {
  242. {SNMPTARGETSPINLOCK, ASN_INTEGER, RWRITE, var_snmpTargetSpinLock, 1, {1}},
  243. };
  244. /*
  245. struct variable2 snmpTargetContexts_variables[] = {
  246. {SNMPUNAVAILABLECONTEXTS , ASN_INTEGER, RWRITE, var_snmpTargetContexts, 1, {4}},
  247. {SNMPUNKNOWNCONTEXTS , ASN_INTEGER, RWRITE, var_snmpTargetContexts, 1, {5}},
  248. };
  249. */
  250. /* now load this mib into the agents mib table */
  251. oid snmpTargetAddrEntry_variables_oid[] = { 1,3,6,1,6,3,12,1,2,1 };
  252. oid snmpTargetSpinLock_variables_oid[] = {1,3,6,1,6,3,12,1};
  253. static oid snmpTargetAddrEntry_TDomain_oid[] = {1,3,6,1,6,1,1};
  254. static int snmpTargetAddrEntry_TDomain_oid_len = 7;
  255. void init_snmpTargetAddrEntry(void) {
  256.   aAddrTable = 0;
  257.   DEBUGMSGTL(("snmpTargetAddrEntry","initn"));
  258.   REGISTER_MIB("target/snmpTargetAddrEntry", snmpTargetAddrEntry_variables,
  259. variable2, snmpTargetAddrEntry_variables_oid);
  260.   REGISTER_MIB("target/snmpTargetSpinLock", snmpTargetSpinLock_variables, 
  261. variable2, snmpTargetSpinLock_variables_oid);
  262.   snmpd_register_config_handler("targetAddr", snmpd_parse_config_targetAddr,
  263. 0, "");
  264.   /* we need to be called back later */
  265.   snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_STORE_DATA,
  266.                          store_snmpTargetAddrEntry, NULL);
  267. }  /* init_snmpTargetAddrEntry */
  268. int snmpTargetAddr_addName(
  269.      struct targetAddrTable_struct *entry,
  270.      char   *cptr)
  271. {
  272.   int len;
  273.   if (cptr == 0) {
  274.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: no name in config stringn"));
  275.     return(0);
  276.   }
  277.   else {
  278.     len = strlen(cptr);    
  279.     /* spec check for string 1-32 */
  280.     if (len < 1 || len > 32)  {
  281.       DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: name out of range in config stringn"));
  282.       return(0);
  283.     }
  284.     entry->name = (char *)malloc(len + 1);
  285. if (entry->name == NULL)
  286. return 0;
  287.     strncpy(entry->name, cptr, len);
  288.     entry->name[len] = '';
  289.   }
  290.   return(1);
  291. } /* addName */
  292.   
  293. int snmpTargetAddr_addTDomain(
  294.      struct targetAddrTable_struct *entry,
  295.      char   *cptr)
  296. {
  297.   int len=128;
  298.   
  299.   if (cptr == 0) {
  300.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: no tDomain in config stringn"));
  301.     return(0);
  302.   }
  303.   if ( !read_objid(cptr, entry->tDomain, (size_t *)&len) ) {
  304.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: tDomain unreadable in config stringn"));
  305.     return(0);
  306.   }
  307.   /* spec check for oid 1-128 */
  308.   if (len < 1 || len > 128)  {
  309.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: tDomain out of range in config stringn"));
  310.     return(0);
  311.   }
  312.   
  313.   entry->tDomainLen = len;
  314.   return(1);
  315. } /* snmpTargetAddr_addTDomain */
  316. int snmpTargetAddr_addTAddress(
  317.      struct targetAddrTable_struct *entry,
  318.      char   *cptr)
  319. {
  320.   int len;
  321.   if (cptr == 0) {
  322.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: no tAddress in config stringn"));
  323.     return(0);
  324.   }
  325.   else {
  326.     len = strlen(cptr);    
  327.     /* spec check for string 1-32 */
  328.     /*    if (len < 1 || len > 32)  {
  329.   DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: name out of range in config stringn"));
  330.   return(0);
  331.       } */
  332.     free(entry->tAddress);
  333.     entry->tAddress = (char *)malloc(len + 1);
  334. if (entry->tAddress == NULL)
  335. return 0;
  336.     strncpy(entry->tAddress, cptr, len);
  337.     entry->tAddress[len] = '';
  338.   }
  339.   return(1);
  340. } /* snmpTargetAddr_addTAddress */
  341.   
  342.   
  343. int snmpTargetAddr_addTimeout(
  344.      struct targetAddrTable_struct *entry,
  345.      char   *cptr)
  346. {
  347.   if (cptr == 0) {
  348.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetParamsEntry: no Timeout in config stringn"));
  349.     return(0);
  350.   }
  351.   else if (!(isdigit(*cptr))) {
  352.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargeParamsEntry: Timeout is not a digit in config stringn"));
  353.     return(0);
  354.   }
  355.   /* check Timeout >= 0 */
  356.   else if ( (entry->timeout = (int)strtol(cptr, (char **)NULL, 0)) < 0) {
  357.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargeParamsEntry: Timeout out of range in config stringn"));
  358.     return(0);
  359.   }
  360.   return(1);
  361. }  /* snmpTargetAddr_addTimeout  */
  362.   
  363.   
  364. int snmpTargetAddr_addRetryCount(
  365.      struct targetAddrTable_struct *entry,
  366.      char   *cptr)
  367. {
  368.   if (cptr == 0) {
  369.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetParamsEntry: no Retry Count in config stringn"));
  370.     return(0);
  371.   }
  372.   else if (!(isdigit(*cptr))) {
  373.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargeParamsEntry: Retry Count is not a digit in config stringn"));
  374.     return(0);
  375.   }
  376.   /* spec check 0..255 */
  377.   else {
  378.     entry->retryCount = (int)strtol(cptr, (char **)NULL, 0);
  379.     if ( (entry->retryCount < 0) ||
  380.  (entry->retryCount > 255) )  {
  381.       DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargeParamsEntry: Retry Count is out of range in config stringn"));
  382.       return(0);
  383.     }
  384.   }
  385.   return(1);
  386. }  /* snmpTargetAddr_addRetryCount  */
  387.  
  388. int snmpTargetAddr_addTagList(
  389.      struct targetAddrTable_struct *entry,
  390.      char   *cptr)
  391. {
  392.   int len;
  393.   if (cptr == 0) {
  394.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: no tag list in config stringn"));
  395.     return(0);
  396.   }
  397.   else {
  398.     len = strlen(cptr);    
  399.     /* spec check for string 0-255 */
  400.     if (len < 0 || len > 255)  {
  401.       DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: tag list out of range in config stringn"));
  402.       return(0);
  403.     } 
  404.     free(entry->tagList);
  405.     entry->tagList = (char *)malloc(len + 1);
  406. if (entry->tagList == NULL)
  407. return 0;
  408.     strncpy(entry->tagList, cptr, len);
  409.     entry->tagList[len] = '';
  410.   }
  411.   return(1);
  412. } /* snmpTargetAddr_addTagList */
  413.   
  414.  
  415. int snmpTargetAddr_addParams(
  416.      struct targetAddrTable_struct *entry,
  417.      char   *cptr)
  418. {
  419.   int len;
  420.   if (cptr == 0) {
  421.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: no params in config stringn"));
  422.     return(0);
  423.   }
  424.   else {
  425.     len = strlen(cptr);    
  426.     /* spec check for string 1-32 */
  427.     if (len < 1 || len > 32)  {
  428.       DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: params out of range in config stringn"));
  429.       return(0);
  430.     } 
  431.     entry->params = (char *)malloc(len + 1);
  432. if (entry->params == NULL)
  433. return 0;
  434.     strncpy(entry->params, cptr, len);
  435.     entry->params[len] = '';
  436.   }
  437.   return(1);
  438. } /* snmpTargetAddr_addParams */
  439.   
  440. int snmpTargetAddr_addStorageType(
  441.      struct targetAddrTable_struct *entry,
  442.      char   *cptr)
  443. {
  444.   char   buff[1024];
  445.   if (cptr == 0) {
  446.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: no storage type in config stringn"));
  447.     return(0);
  448.   }
  449.   else if (!(isdigit(*cptr))) {
  450.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: storage type is not a digit in config stringn"));
  451.     return(0);
  452.   }
  453.   /* check that storage type is a possible value */
  454.   else if ( ((entry->storageType = (int)strtol(cptr, (char **)NULL, 0)) 
  455.      != SNMP_STORAGE_OTHER) &&
  456.     (entry->storageType != SNMP_STORAGE_VOLATILE) && 
  457.     (entry->storageType != SNMP_STORAGE_NONVOLATILE)  &&
  458.     (entry->storageType != SNMP_STORAGE_PERMANENT) && 
  459.     (entry->storageType != SNMP_STORAGE_READONLY) )  {
  460.     sprintf(buff,"ERROR snmpTargetAddrEntry: storage type not a valid value of other(%d), volatile(%d), nonvolatile(%d), permanent(%d), or readonly(%d) in config string.n", SNMP_STORAGE_OTHER, SNMP_STORAGE_VOLATILE, SNMP_STORAGE_NONVOLATILE, SNMP_STORAGE_PERMANENT, SNMP_STORAGE_READONLY);
  461.     DEBUGMSGTL(("snmpTargetAddrEntry", buff));
  462.     return(0);
  463.   }
  464.   return(1);
  465. }  /* snmpTargetAddr_addStorageType */
  466.   
  467.   
  468. int snmpTargetAddr_addRowStatus(
  469.      struct targetAddrTable_struct *entry,
  470.      char   *cptr)
  471. {
  472.   char buff[1024];
  473.   if (cptr == 0) {
  474.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: no Row Status in config stringn"));
  475.     return(0);
  476.   }
  477.   else if (!(isdigit(*cptr))) {
  478.     DEBUGMSGTL(("snmpTargetAddrEntry","ERROR snmpTargetAddrEntry: Row Status is not a digit in config stringn"));
  479.     return(0);
  480.   }
  481.   /* check that row status is a valid value */
  482.   else if ( ((entry->rowStatus = (int)strtol(cptr, (char **)NULL, 0)) 
  483.      != SNMP_ROW_ACTIVE) &&
  484.     (entry->rowStatus != SNMP_ROW_NOTINSERVICE) &&
  485.     (entry->rowStatus != SNMP_ROW_NOTREADY) ) {
  486.     sprintf(buff, "ERROR snmpTargetAddrEntry: Row Status is not a valid value of active(%d), notinservice(%d), or notready(%d) in config string.n", SNMP_ROW_ACTIVE, SNMP_ROW_NOTINSERVICE, SNMP_ROW_NOTREADY);
  487.     DEBUGMSGTL(("snmpTargetAddrEntry", buff));
  488.     
  489.     return(0);
  490.   }
  491.   return(1);
  492. }  /* snmpTargetAddr_addRowStatus  */
  493. /**************************************************
  494. *Delete a target address entry
  495. *IN: host_name -- ip address in string format
  496. *IN: community -- community string
  497. * --sxf 2k-12-26
  498. *******************************************************/
  499. void snmp_delete_targetAddr (char *host_name, char *community)
  500. {
  501. struct targetAddrTable_struct *temp_struct, *temp_struct_next;
  502. char  buf[256];
  503. if (host_name == NULL || community == NULL)
  504. {
  505. snmp_trace("SNMP In add target entry: community or host_name not provided!n");
  506. return;
  507. }
  508. if (strlen (community) + strlen (host_name) > 200)
  509. {
  510. snmp_trace("SNMP In add target entry: community or host_name length to long!n");
  511. return;
  512. }
  513. sprintf (buf, "traphost.%s.%s",community,host_name);
  514.    for( temp_struct = aAddrTable; temp_struct != NULL; ) 
  515.    {
  516.     temp_struct_next = temp_struct->next;
  517.     if (strcmp (buf,temp_struct->name) == 0)
  518.     {
  519.     snmpTargetAddrTable_remFromList(temp_struct, &aAddrTable);
  520.     }
  521.     temp_struct = temp_struct_next;
  522.    }
  523. }
  524. /*
  525. *Create target address entry. Called when create a new host to send trap.
  526. *IN: host_name -- ip address in string format
  527. *IN: community -- community of trapd application in manager entity
  528. *IN: timeout -- default value is 1500 (defined in target mib) 
  529. *IN: retry -- default value is 3 (defined in target mib)
  530. *    --sxf 2k-12-26
  531. */
  532. void snmp_add_targetAddr (char *host_name, char *community, int timeout, int retry)
  533. {
  534. struct targetAddrTable_struct *newEntry;
  535. char  buf[256];
  536. long ipAddr;
  537. if (host_name == NULL || community == NULL)
  538. {
  539. snmp_trace("SNMP In add target entry: community or host_name not provided!n");
  540. return;
  541. }
  542. if (strlen (community) + strlen (host_name) > 200)
  543. {
  544. snmp_trace("SNMP In add target entry: community or host_name length to long!n");
  545. return;
  546. }
  547. snmp_delete_targetAddr (host_name, community);
  548. newEntry = snmpTargetAddrTable_create();
  549. if (newEntry == NULL)
  550. return;
  551. sprintf (buf, "traphost.%s.%s",community,host_name);
  552. newEntry->name = strdup (buf);
  553. memcpy (newEntry->tDomain, snmpTargetAddrEntry_TDomain_oid,snmpTargetAddrEntry_TDomain_oid_len*sizeof(oid));
  554. newEntry->tDomainLen = snmpTargetAddrEntry_TDomain_oid_len;
  555. newEntry->tAddress = (char *)malloc (7*sizeof(char));
  556. /*ip addr*/
  557. ipAddr = aton(host_name);
  558. if (newEntry->tAddress != NULL)
  559. {
  560. memcpy (newEntry->tAddress, &ipAddr, 4);
  561. /*udp port*/
  562. (newEntry->tAddress)[4] = 0;
  563. (newEntry->tAddress)[5] = 0xA2;
  564. (newEntry->tAddress)[6] = '';
  565. }
  566. newEntry->timeout = timeout;
  567. newEntry->retryCount = retry;
  568. newEntry->tagList = strdup ("trap");
  569. newEntry->params = strdup (buf);
  570. newEntry->storageType = SNMP_STORAGE_NONVOLATILE;
  571. newEntry->rowStatus = SNMP_ROW_ACTIVE;
  572. if (newEntry->name == NULL||newEntry->tAddress == NULL
  573. ||newEntry->tagList == NULL||newEntry->params == NULL)
  574. {
  575. snmp_trace("SNMP In add target entry:Insufficient memoryn");
  576. if (newEntry->name)
  577. free(newEntry->name);
  578. if (newEntry->tAddress)
  579. free (newEntry->tAddress);
  580. if (newEntry->tagList)
  581. free (newEntry->tagList);
  582. if (newEntry->params)
  583. free (newEntry->params);
  584. free (newEntry);
  585. return;
  586. }
  587. snmpTargetAddrTable_addToList(newEntry, &aAddrTable);
  588. }
  589. void snmpd_parse_config_targetAddr(const char *token, char *char_ptr)
  590. {
  591.   char  *cptr = char_ptr, buff[1024];
  592.   struct targetAddrTable_struct *newEntry;
  593.   int                            i;
  594.   newEntry = snmpTargetAddrTable_create();
  595.   if (newEntry == NULL)
  596.   return;
  597.   cptr = copy_word(cptr, buff);
  598.   if (snmpTargetAddr_addName(newEntry, buff) == 0) {
  599.     snmpTargetAddrTable_dispose(newEntry);
  600.     return;
  601.   }
  602.   cptr = copy_word(cptr, buff);
  603.   if (snmpTargetAddr_addTDomain(newEntry, buff) == 0) {
  604.     snmpTargetAddrTable_dispose(newEntry);
  605.     return;
  606.   }
  607.   cptr = copy_word(cptr, buff);
  608.   if (snmpTargetAddr_addTAddress(newEntry, buff) == 0) {
  609.     snmpTargetAddrTable_dispose(newEntry);
  610.     return;
  611.   }
  612.   cptr = copy_word(cptr, buff);
  613.   if (snmpTargetAddr_addTimeout(newEntry, buff) == 0) {
  614.     snmpTargetAddrTable_dispose(newEntry);
  615.     return;
  616.   }
  617.   cptr = copy_word(cptr, buff);
  618.   if (snmpTargetAddr_addRetryCount(newEntry, buff) == 0) {
  619.     snmpTargetAddrTable_dispose(newEntry);
  620.     return;
  621.   }
  622.   cptr = copy_word(cptr, buff);
  623.   if (snmpTargetAddr_addTagList(newEntry, buff) == 0) {
  624.     snmpTargetAddrTable_dispose(newEntry);
  625.     return;
  626.   }
  627.   cptr = copy_word(cptr, buff);
  628.   if (snmpTargetAddr_addParams(newEntry, buff) == 0) {
  629.     snmpTargetAddrTable_dispose(newEntry);
  630.     return;
  631.   }
  632.   cptr = copy_word(cptr, buff);
  633.   if (snmpTargetAddr_addStorageType(newEntry, buff) == 0) {
  634.     snmpTargetAddrTable_dispose(newEntry);
  635.     return;
  636.   }
  637.   cptr = copy_word(cptr, buff);
  638.   if (snmpTargetAddr_addRowStatus(newEntry, buff) == 0) {
  639.     snmpTargetAddrTable_dispose(newEntry);
  640.     return;
  641.   }
  642.   sprintf(buff, "snmp_parse_config_targetAddr, read: %sn",
  643.    newEntry->name);
  644.   for(i=0;i<newEntry->tDomainLen;i++) {
  645.     sprintf(&buff[strlen(buff)], ".%d", (int)newEntry->tDomain[i]);
  646.   }
  647.   sprintf(&buff[strlen(buff)], " %s %d %d %s %s %d %dn",
  648.   snmp_ntoa(*((long*)(newEntry->tAddress))), newEntry->timeout, newEntry->retryCount,
  649.   newEntry->tagList,  newEntry->params,  newEntry->storageType, 
  650.   newEntry->rowStatus);
  651.   DEBUGMSGTL(("snmpTargetAddrEntry", buff));
  652.   snmpTargetAddrTable_addToList(newEntry, &aAddrTable);
  653. } /* snmpd_parse_config_target */
  654. /* Shutdown routines */
  655. /* store_snmpTargetAddrEntry handles the persistent storage proccess 
  656.    for this MIB table. It writes out all the non-volatile rows 
  657.    to permanent storage on a shutdown  */
  658. int 
  659. store_snmpTargetAddrEntry(int majorID, int minorID, void *serverarg,
  660.                           void *clientarg)
  661. {
  662.   struct targetAddrTable_struct *curr_struct;
  663.   char line[1024];
  664.   int  i;
  665.   if ( (curr_struct = aAddrTable) != 0) {
  666.     while (curr_struct != 0) {
  667.       if ( (curr_struct->storageType == SNMP_STORAGE_NONVOLATILE || 
  668.     curr_struct->storageType == SNMP_STORAGE_PERMANENT) 
  669.    &&
  670.    (curr_struct->rowStatus == SNMP_ROW_ACTIVE ||
  671.     curr_struct->rowStatus == SNMP_ROW_NOTINSERVICE) ) {
  672. sprintf(line, "targetAddr %s ", curr_struct->name);
  673. for(i=0; i < curr_struct->tDomainLen; i++) {
  674.   sprintf(&line[strlen(line)], ".%i", (int)curr_struct->tDomain[i]);
  675. }
  676. sprintf(&line[strlen(line)], " %s %i %i "%s" %s %i %i", 
  677.  snmp_ntoa(*((long*)(curr_struct->tAddress))),    curr_struct->timeout, 
  678.  curr_struct->retryCount,  curr_struct->tagList,
  679.  curr_struct->params,      curr_struct->storageType, 
  680.  curr_struct->rowStatus);
  681. /* store to file */
  682. snmpd_store_config(line);
  683.       }
  684.       curr_struct = curr_struct->next;
  685.     }
  686.   }
  687.   return SNMPERR_SUCCESS;
  688. }  /*  store_snmpTargetAddrEntry  */
  689. /*MIB table access routines */
  690. u_char *
  691. var_snmpTargetAddrEntry(
  692.     struct variable *vp,
  693.     oid     *name,
  694.     int *length,
  695.     int     exact,
  696.     int  *var_len,
  697.     WriteMethod **write_method)
  698. {
  699.   /* variables we may use later */
  700.   static long                    long_ret;
  701.   static char                    string[1500];
  702.   static oid                     objid[128];
  703.   struct targetAddrTable_struct *temp_struct;
  704.   int                            i;
  705.   *write_method = 0;           /* assume it isnt writable for the time being */
  706.   *var_len = sizeof(long_ret); /* assume an integer and change later if not */
  707.   /* look for OID in current table */
  708.   if ( (temp_struct = search_snmpTargetAddrTable(vp->name, vp->namelen, 
  709.       name, length, exact)) == 0 ) {
  710.     /* for creation of new rows */
  711.     if (vp->magic == SNMPTARGETADDRROWSTATUS)  {
  712.       *write_method = write_snmpTargetAddrRowStatus;
  713.     }
  714.     return(0);
  715.   }
  716.   
  717.   /* We found what we were looking for, either the next OID or the exact OID */
  718.   /* this is where we do the value assignments for the mib results. */
  719.   switch(vp->magic) {
  720.   case SNMPTARGETADDRTDOMAIN:
  721.     *write_method = write_snmpTargetAddrTDomain;
  722.     if (temp_struct->tDomainLen <= 0) {
  723.       return(0);
  724.     }
  725.     else {
  726.       for (i=0;i<temp_struct->tDomainLen;i++) {
  727. objid[i] = temp_struct->tDomain[i];
  728.       }
  729.       *var_len = temp_struct->tDomainLen * sizeof(oid);
  730.     }
  731.     return (unsigned char *) objid;
  732.     
  733.   case SNMPTARGETADDRTADDRESS:
  734.     *write_method = write_snmpTargetAddrTAddress;
  735.     if (temp_struct->tAddress == 0)  return(0);
  736.     memcpy(string, temp_struct->tAddress, 7);
  737.     *var_len = 6;
  738.     return (unsigned char *) string;
  739.     
  740.   case SNMPTARGETADDRTIMEOUT:
  741.     *write_method = write_snmpTargetAddrTimeout;
  742.     long_ret = temp_struct->timeout;
  743.     return (unsigned char *) &long_ret;
  744.   case SNMPTARGETADDRRETRYCOUNT:
  745.     *write_method = write_snmpTargetAddrRetryCount;
  746.     long_ret = temp_struct->retryCount;
  747.     return (unsigned char *) &long_ret;
  748.   case SNMPTARGETADDRTAGLIST:
  749.     *write_method = write_snmpTargetAddrTagList;
  750.     strcpy(string, temp_struct->tagList);
  751.     *var_len = strlen(string);
  752.     return (unsigned char *) string;
  753.   case SNMPTARGETADDRPARAMS:
  754.     *write_method = write_snmpTargetAddrParams;
  755.     if (temp_struct->params == 0) return(0);
  756.     strcpy(string, temp_struct->params);
  757.     *var_len = strlen(string);
  758.     return (unsigned char *) string;
  759.     
  760.   case SNMPTARGETADDRSTORAGETYPE:
  761.     *write_method = write_snmpTargetAddrStorageType;
  762.     long_ret = temp_struct->storageType;
  763.     return (unsigned char *) &long_ret;
  764.   case SNMPTARGETADDRROWSTATUS:
  765.     *write_method = write_snmpTargetAddrRowStatus;
  766.     long_ret = temp_struct->rowStatus;
  767.     return (unsigned char *) &long_ret;
  768.     
  769.   default:
  770.     DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_snmpTargetAddrEntryn", vp->magic));
  771.   }
  772.   return 0;
  773. }  /* var_snmpTargetAddrEntry */
  774. int
  775. write_snmpTargetAddrTDomain(
  776.    int      action,
  777.    u_char   *var_val,
  778.    u_char   var_val_type,
  779.    int     var_val_len,
  780.    u_char   *statP,
  781.    oid      *name,
  782.    int      name_len)
  783. {
  784.   int                            objSize;
  785.   int                            i;
  786.   struct targetAddrTable_struct *temp_struct;
  787.   static oid                    objid[MAX_OID_LEN];
  788.   if (var_val_type != ASN_OBJECT_ID) {
  789.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTDomain not ASN_OBJECT_IDn"));
  790.     return SNMP_ERR_WRONGTYPE;
  791.   }
  792.   if (var_val_len > 128) {
  793.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTDomain: bad lengthn"));
  794.     return SNMP_ERR_WRONGLENGTH;
  795.   }
  796.   /* spec check, ??? */
  797.   objSize = var_val_len/sizeof(oid);
  798.   memcpy(objid, var_val, var_val_len);
  799.   
  800.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRTDOMAINCOLUMN;
  801.   if ( (temp_struct = search_snmpTargetAddrTable(snmpTargetAddrOID, 
  802.  snmpTargetAddrOIDLen,
  803.  name, &name_len, 1)) == 0) {
  804.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTDomain : BAD OID!n"));
  805.     return SNMP_ERR_NOSUCHNAME;
  806.   }
  807.   /* row exists, check if it is changeable */
  808.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  809.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTDomain : row is read onlyn"));
  810.     return SNMP_ERR_READONLY;
  811.   }
  812.   /* check if row active */
  813.   if (temp_struct->rowStatus == SNMP_ROW_ACTIVE) {
  814.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTDomains : This change not allowed in active row.n"));
  815.     return SNMP_ERR_INCONSISTENTVALUE;
  816.   }
  817.   /* Finally, we're golden, check if we should save value */
  818.   if (action == COMMIT)  {    
  819.     for (i=0;i < (int)objSize; i++) 
  820.       temp_struct->tDomain[i] = objid[i];
  821.     temp_struct->tDomainLen = objSize;
  822.     /* If row is new, check if its status can be updated */
  823.     if ( (temp_struct->rowStatus == SNMP_ROW_NOTREADY) &&
  824.  (snmpTargetAddr_rowStatusCheck(temp_struct) != 0) )
  825.       temp_struct->rowStatus = SNMP_ROW_NOTINSERVICE;
  826.   }
  827.   return SNMP_ERR_NOERROR;
  828. }  /* write_snmpTargetAddrTDomain */
  829. int
  830. write_snmpTargetAddrTAddress(
  831.    int action,
  832.    u_char   *var_val,
  833.    u_char   var_val_type,
  834.    int   var_val_len,
  835.    u_char   *statP,
  836.    oid      *name,
  837.    int   name_len)
  838. {
  839.   static unsigned char           string[1500];
  840.   int  size;
  841.   struct targetAddrTable_struct *temp_struct;
  842.   if (var_val_type != ASN_OCTET_STR) {
  843.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTAddress not ASN_OCTET_STRn"));
  844.       return SNMP_ERR_WRONGTYPE;
  845.   }
  846.   if (var_val_len > (sizeof(string))) {
  847.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTAddress: bad lengthn"));
  848.       return SNMP_ERR_WRONGLENGTH;
  849.   }
  850.   /* spec check, ??? */
  851.   size = var_val_len;
  852.   memcpy(string, var_val, var_val_len);
  853.   
  854.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRTADDRESSCOLUMN;
  855.   if ( (temp_struct = search_snmpTargetAddrTable(snmpTargetAddrOID, 
  856.  snmpTargetAddrOIDLen,
  857.  name, &name_len, 1)) == 0) {
  858.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTAddress : BAD OID!n"));
  859.     return SNMP_ERR_NOSUCHNAME;
  860.   }
  861.   /* row exists, check if it is changeable */
  862.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  863.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTAddress : row is read onlyn"));
  864.     return SNMP_ERR_READONLY;
  865.   }
  866.   /* check if row active */
  867.   if (temp_struct->rowStatus == SNMP_ROW_ACTIVE) {
  868.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTAddress : This change not allowed in active row.n"));
  869.     return SNMP_ERR_INCONSISTENTVALUE;
  870.   }
  871.   
  872.   /* Finally, we're golden, check if we should save value */
  873.   if (action == COMMIT)  {    
  874.     free(temp_struct->tAddress);
  875.     temp_struct->tAddress = (char *)malloc(size + 1);
  876. if (temp_struct->tAddress == NULL)
  877. return SNMP_ERR_COMMITFAILED;
  878.     memcpy(temp_struct->tAddress, string, size);
  879.     temp_struct->tAddress[size] = '';
  880.     
  881.     /* If row is new, check if its status can be updated */
  882.     if ( (temp_struct->rowStatus == SNMP_ROW_NOTREADY) &&
  883.  (snmpTargetAddr_rowStatusCheck(temp_struct) != 0) )
  884.       temp_struct->rowStatus = SNMP_ROW_NOTINSERVICE;
  885.   }
  886.   return SNMP_ERR_NOERROR;
  887. }  /* write_snmpTargetAddrTAddress */
  888. int
  889. write_snmpTargetAddrTimeout(
  890.    int      action,
  891.    u_char   *var_val,
  892.    u_char   var_val_type,
  893.    int   var_val_len,
  894.    u_char   *statP,
  895.    oid      *name,
  896.    int   name_len)
  897. {
  898.   /* variables we may use later */
  899.   static long                    long_ret;
  900.  /* int                         size;*/
  901.   struct targetAddrTable_struct *temp_struct;
  902.   if (var_val_type != ASN_INTEGER) {
  903.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTimeout not ASN_INTEGERn"));
  904.       return SNMP_ERR_WRONGTYPE;
  905.   }
  906.   if (var_val_len > (sizeof(long_ret))) {
  907.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTimeout: bad lengthn"));
  908.       return SNMP_ERR_WRONGLENGTH;
  909.   }
  910.   long_ret = *((long *) var_val);
  911.   
  912.   /* spec check range, no spec check */
  913.   
  914.   /* Find row in linked list and check pertinent status... */
  915.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRTIMEOUTCOLUMN;
  916.   if ((temp_struct = search_snmpTargetAddrTable
  917.        (snmpTargetAddrOID, snmpTargetAddrOIDLen, 
  918. name, &name_len, 1)) == 0 ) {
  919.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTimeout : BAD OIDn"));
  920.     return SNMP_ERR_NOSUCHNAME;
  921.   }
  922.   /* row exists, check if it is changeable */
  923.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  924.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTimeout : row is read onlyn"));
  925.     return SNMP_ERR_READONLY;
  926.   }
  927.   /* Finally, we're golden, should we save value? */
  928.   if (action == COMMIT)  {
  929.     temp_struct->timeout = long_ret;
  930.   }
  931.   return SNMP_ERR_NOERROR;
  932. }  /* write_snmpTargetAddrTimeout */
  933. int
  934. write_snmpTargetAddrRetryCount(
  935.    int      action,
  936.    u_char   *var_val,
  937.    u_char   var_val_type,
  938.    int   var_val_len,
  939.    u_char   *statP,
  940.    oid      *name,
  941.    int   name_len)
  942. {
  943.   /* variables we may use later */
  944.   static long                    long_ret;
  945.   struct targetAddrTable_struct *temp_struct;
  946.   if (var_val_type != ASN_INTEGER) {
  947.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRetryCount not ASN_INTEGERn"));
  948.     return SNMP_ERR_WRONGTYPE;
  949.   }
  950.   if (var_val_len > (sizeof(long_ret))) {
  951.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRetryCount: bad lengthn"));
  952.     return SNMP_ERR_WRONGLENGTH;
  953.   }
  954.   long_ret = *((long *) var_val);
  955.   
  956.   /* spec check range, no spec check */
  957.   
  958.   /* Find row in linked list and check pertinent status... */
  959.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRRETRYCOUNTCOLUMN;
  960.   if ((temp_struct = search_snmpTargetAddrTable
  961.        (snmpTargetAddrOID, snmpTargetAddrOIDLen, 
  962. name, &name_len, 1)) == 0 ) {
  963.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTimeout : BAD OIDn"));
  964.     return SNMP_ERR_NOSUCHNAME;
  965.   }
  966.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  967.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRetryCount : row is read onlyn"));
  968.     return SNMP_ERR_READONLY;
  969.   }
  970.   /* Finally, we're golden, should we save value? */
  971.   if (action == COMMIT)  {
  972.     temp_struct->retryCount = long_ret;
  973.   }
  974.   return SNMP_ERR_NOERROR;
  975. }  /* write_snmpTargetAddrRetryCount */
  976. int
  977. write_snmpTargetAddrTagList(
  978.    int      action,
  979.    u_char   *var_val,
  980.    u_char   var_val_type,
  981.    int   var_val_len,
  982.    u_char   *statP,
  983.    oid      *name,
  984.    int   name_len)
  985. {
  986.   /* variables we may use later */
  987.   static unsigned char           string[1500];
  988.   int                         size;
  989.   struct targetAddrTable_struct *temp_struct;
  990.   if (var_val_type != ASN_OCTET_STR) {
  991.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTagList not ASN_OCTET_STRn"));
  992.     return SNMP_ERR_WRONGTYPE;
  993.   }
  994.   if (var_val_len > (sizeof(string))) {
  995.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTagList: bad lengthn"));
  996.     return SNMP_ERR_WRONGLENGTH;
  997.   }
  998.   
  999.   /* spec check, ??? */
  1000.   size = var_val_len;
  1001.   memcpy(string, var_val, var_val_len);
  1002.   
  1003.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRTAGLISTCOLUMN;
  1004.   if ( (temp_struct = search_snmpTargetAddrTable(snmpTargetAddrOID, 
  1005.  snmpTargetAddrOIDLen,
  1006.  name, &name_len, 1)) == 0) {
  1007.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTagList : BAD OID!n"));
  1008.     return SNMP_ERR_NOSUCHNAME;
  1009.   }
  1010.   /* row exists, check if it is changeable */
  1011.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  1012.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrTagList : row is read onlyn"));
  1013.     return SNMP_ERR_READONLY;
  1014.   }
  1015.   
  1016.   /* Finally, we're golden, check if we should save value */
  1017.   if (action == COMMIT)  {    
  1018.     free(temp_struct->tagList);
  1019.     temp_struct->tagList = (char *)malloc(size + 1);
  1020. if (temp_struct->tagList == NULL)
  1021. return SNMP_ERR_COMMITFAILED;
  1022.     memcpy(temp_struct->tagList, string, size);
  1023.     temp_struct->tagList[size] = '';
  1024.   }
  1025.   return SNMP_ERR_NOERROR;
  1026. }  /* write_snmpTargetAddrTagList */
  1027. int
  1028. write_snmpTargetAddrParams(
  1029.    int      action,
  1030.    u_char   *var_val,
  1031.    u_char   var_val_type,
  1032.    int   var_val_len,
  1033.    u_char   *statP,
  1034.    oid      *name,
  1035.    int   name_len)
  1036. {
  1037.   static unsigned char           string[1500];
  1038.   int                         size;
  1039.   struct targetAddrTable_struct *temp_struct;
  1040.   if (var_val_type != ASN_OCTET_STR) {
  1041.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrParams not ASN_OCTET_STRn"));
  1042.     return SNMP_ERR_WRONGTYPE;
  1043.   }
  1044.   if (var_val_len > (sizeof(string))) {
  1045.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrParams: bad lengthn"));
  1046.     return SNMP_ERR_WRONGLENGTH;
  1047.   }
  1048.   /* spec check, ??? */
  1049.   size = var_val_len;
  1050.   memcpy(string, var_val, var_val_len);
  1051.   
  1052.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRPARAMSCOLUMN;
  1053.   if ( (temp_struct = search_snmpTargetAddrTable(snmpTargetAddrOID, 
  1054.  snmpTargetAddrOIDLen,
  1055.  name, &name_len, 1)) == 0) {
  1056.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrParams : BAD OID!n"));
  1057.     return SNMP_ERR_NOSUCHNAME;
  1058.   }
  1059.   /* row exists, check if it is changeable */
  1060.   if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  1061.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrParams : row is read onlyn"));
  1062.     return SNMP_ERR_READONLY;
  1063.   }
  1064.   
  1065.   /* Finally, we're golden, check if we should save value */
  1066.   if (action == COMMIT)  {    
  1067.     free(temp_struct->params);
  1068.     temp_struct->params = (char *)malloc(size + 1);
  1069. if (temp_struct->params == NULL)
  1070. return SNMP_ERR_COMMITFAILED;
  1071.     memcpy(temp_struct->params, string, size);
  1072.     temp_struct->params[size] = '';
  1073.     
  1074.     /* If row is new, check if its status can be updated */
  1075.     if ( (temp_struct->rowStatus == SNMP_ROW_NOTREADY) &&
  1076.  (snmpTargetAddr_rowStatusCheck(temp_struct) != 0) )
  1077.       temp_struct->rowStatus = SNMP_ROW_NOTINSERVICE;
  1078.   }
  1079.   return SNMP_ERR_NOERROR;
  1080. }  /* write_snmpTargetAddrParams */
  1081. int
  1082. write_snmpTargetAddrStorageType(
  1083.    int      action,
  1084.    u_char   *var_val,
  1085.    u_char   var_val_type,
  1086.    int   var_val_len,
  1087.    u_char   *statP,
  1088.    oid      *name,
  1089.    int   name_len)
  1090. {
  1091.   static long                    long_ret;
  1092.   struct targetAddrTable_struct *temp_struct;
  1093.   if (var_val_type != ASN_INTEGER) {
  1094.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrStorageType not ASN_INTEGERn"));
  1095.       return SNMP_ERR_WRONGTYPE;
  1096.   }
  1097.   if (var_val_len > (sizeof(long_ret))) {
  1098.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrStorageType: bad lengthn"));
  1099.       return SNMP_ERR_WRONGLENGTH;
  1100.   }
  1101.   long_ret = *((long *) var_val);
  1102.   
  1103.   if ( (long_ret != SNMP_STORAGE_OTHER) && (long_ret != SNMP_STORAGE_VOLATILE) &&
  1104.        (long_ret != SNMP_STORAGE_NONVOLATILE) )  {
  1105.     DEBUGMSGTL(("snmpTargetAddrEntry", "write to snmpTargetAddrStorageType : attempted storage type not a valid"));
  1106.     DEBUGMSG(("snmpTargetAddrEntry", "  value of other(%d), volatile(%d), or nonvolatile(%d)n", 
  1107.    SNMP_STORAGE_OTHER, SNMP_STORAGE_VOLATILE, SNMP_STORAGE_NONVOLATILE));
  1108.     return SNMP_ERR_INCONSISTENTVALUE;
  1109.   }
  1110.   /* Find the struct in the linked list and check status */
  1111.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRSTORAGETYPECOLUMN;
  1112.   if ((temp_struct = search_snmpTargetAddrTable(snmpTargetAddrOID, 
  1113. snmpTargetAddrOIDLen, 
  1114. name, &name_len, 1)) == 0 ) {
  1115.     DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrStorageType : BAD OIDn"));
  1116.     return SNMP_ERR_NOSUCHNAME;
  1117.   }
  1118.   if ( (temp_struct->storageType == SNMP_STORAGE_PERMANENT) || 
  1119.        (temp_struct->storageType == SNMP_STORAGE_READONLY) )  {
  1120.     DEBUGMSGTL(("snmpTargetAddrEntry", "write to snmpTargetAddrStorageType : row has unchangeable storage status: %dn",
  1121.    temp_struct->storageType));
  1122.     return SNMP_ERR_INCONSISTENTVALUE;
  1123.   }
  1124.   /* Finally, we're golden, check if we should save new value */
  1125.   if (action == COMMIT) {      
  1126.     temp_struct->storageType = long_ret;
  1127.   }
  1128.   return SNMP_ERR_NOERROR;
  1129. }  /* write_snmpTargetAddrStorageType */
  1130. /* snmpTargeAddr_createNewRow is called from write_snmpTargetAddrRowStatus
  1131.    when a new row is required. It creates a new row with 
  1132.    the index of the passed in 'name' (i.e. full index OID) and
  1133.    adds it to the linked list. 'name' should be the full OID of the new index. 
  1134.    It passes back 0 if unsuccessfull.*/
  1135. int snmpTargetAddr_createNewRow(
  1136.      oid   *name,
  1137.      int name_len)
  1138. {
  1139.   int newNameLen;
  1140.   int i;
  1141.   struct targetAddrTable_struct *temp_struct;
  1142.   /* setup a new snmpTargetAddrTable structure and add it to the list */
  1143.   newNameLen = name_len - snmpTargetAddrOIDLen;
  1144.   if (newNameLen > 0) {
  1145.     temp_struct       = snmpTargetAddrTable_create();
  1146. if (temp_struct == NULL)
  1147. return 0;
  1148.     temp_struct->name = (char *)malloc(newNameLen + 1);
  1149.     if (temp_struct->name == NULL) {
  1150. free(temp_struct);
  1151. return 0;
  1152.     }
  1153.     for (i = 0; i < (int)newNameLen; i++) {
  1154.       temp_struct->name[i] = (char)name[i+snmpTargetAddrOIDLen];
  1155.     }
  1156.     temp_struct->name[newNameLen]  = '';
  1157.     temp_struct->rowStatus         = SNMP_ROW_NOTREADY;
  1158.     
  1159.     snmpTargetAddrTable_addToList(temp_struct, &aAddrTable);
  1160.     return 1;
  1161.   }
  1162.   return 0;
  1163. }  /* snmpTargetAddr_createNewRow */
  1164. /* Assign a value to the Row Status variable */
  1165. int
  1166. write_snmpTargetAddrRowStatus(
  1167.    int      action,
  1168.    u_char   *var_val,
  1169.    u_char   var_val_type,
  1170.    int   var_val_len,
  1171.    u_char   *statP,
  1172.    oid      *name,
  1173.    int   name_len)
  1174. {
  1175.   enum commit_action_enum        {NOTHING, DESTROY, CREATE, CHANGE};
  1176.   enum commit_action_enum        onCommitDo; 
  1177.   static long                    long_ret;
  1178.   struct targetAddrTable_struct *temp_struct;
  1179.   if (var_val_type != ASN_INTEGER) {
  1180.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRowStatus not ASN_INTEGERn"));
  1181.       return SNMP_ERR_WRONGTYPE;
  1182.   }
  1183.   if (var_val_len > (sizeof(long_ret))) {
  1184.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRowStatus: bad lengthn"));
  1185.       return SNMP_ERR_WRONGLENGTH;
  1186.   }
  1187.   long_ret = *((long *) var_val);
  1188.   /* search for struct in linked list */
  1189.   snmpTargetAddrOID[snmpTargetAddrOIDLen-1] = SNMPTARGETADDRROWSTATUSCOLUMN;
  1190.   if ((temp_struct = search_snmpTargetAddrTable(snmpTargetAddrOID, 
  1191. snmpTargetAddrOIDLen, 
  1192. name, &name_len, 1)) == 0) {
  1193.     /* row doesn't exist, check valid possibilities */
  1194.     if (long_ret == SNMP_ROW_DESTROY)  
  1195.       /* re: RFC 1903, destroying a non-existent row is noError, whatever */
  1196.       onCommitDo = NOTHING;
  1197.     /* check if this is for a new row creation */
  1198.     else if (long_ret == SNMP_ROW_CREATEANDGO || long_ret == SNMP_ROW_CREATEANDWAIT) 
  1199.       onCommitDo = CREATE;
  1200.     else /* no valid sets for no row being found so... */
  1201.       return SNMP_ERR_NOSUCHNAME;
  1202.   }
  1203.   else {  /* row exists */
  1204.     /* check if it is changeable */
  1205.     if (temp_struct->storageType == SNMP_STORAGE_READONLY) {
  1206.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRowStatus : row is read onlyn"));
  1207.       return SNMP_ERR_READONLY;
  1208.     }    
  1209.     /* check if row is to be destroyed (note: it is ok to destroy notReady row!) */
  1210.     else if (long_ret == SNMP_ROW_DESTROY)  {
  1211.       if (temp_struct->storageType == SNMP_STORAGE_PERMANENT) {
  1212. DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRowStatus : unable to destroy permanent rown"));
  1213. return SNMP_ERR_INCONSISTENTVALUE;
  1214.       }
  1215.       else  {
  1216. onCommitDo = DESTROY;
  1217.       }
  1218.     }
  1219.     /* check if row is new and can be changed from notready yet */
  1220.     else if (temp_struct->rowStatus == SNMP_ROW_NOTREADY) {
  1221.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargeAddrRowStatus : unable to change from NOTREADYn"));
  1222.       return SNMP_ERR_INCONSISTENTVALUE;
  1223.     }  
  1224.     /* we now know the row status can be set, check for the two valid settings left*/
  1225.     else if ( (long_ret == SNMP_ROW_ACTIVE) || 
  1226.       (long_ret == SNMP_ROW_NOTINSERVICE) ) {
  1227.       onCommitDo = CHANGE;
  1228.     }
  1229.     /* not a valid setting */
  1230.     else  {
  1231.       DEBUGMSGTL(("snmpTargetAddrEntry","write to snmpTargetAddrRowStatus : Bad value for setn"));
  1232.       return SNMP_ERR_INCONSISTENTVALUE;
  1233.     }
  1234.   } /* if row exist */
  1235.   
  1236.   /* if this is a commit, do expected action */
  1237.   if (action == COMMIT) {
  1238.     switch(onCommitDo) { 
  1239.       
  1240.     case CREATE :
  1241.       if (snmpTargetAddr_createNewRow(name, name_len) == 0) {
  1242. DEBUGMSGTL(("snmpTargetAddrEntry", "write to snmpTargetAddrRowStatus : "));
  1243. DEBUGMSG(("snmpTargetAddrEntry","failed new row creation, bad OID/index value n"));
  1244. return SNMP_ERR_GENERR;
  1245.       }
  1246.       break;
  1247.       
  1248.     case DESTROY:
  1249.       snmpTargetAddrTable_remFromList(temp_struct, &aAddrTable);
  1250.       break;
  1251.     case CHANGE:
  1252.   if ((temp_struct->rowStatus != SNMP_ROW_ACTIVE) && (long_ret == SNMP_ROW_ACTIVE))
  1253.   {
  1254.   temp_struct->rowStatus = long_ret;
  1255.   snmpTargetTryToAddTrap (temp_struct->name);
  1256.   }
  1257.   else if ((temp_struct->rowStatus == SNMP_ROW_ACTIVE) && (long_ret != SNMP_ROW_ACTIVE))
  1258.   {
  1259.   snmpTargetTryToDelTrap (temp_struct->name);
  1260.   }
  1261.       temp_struct->rowStatus = long_ret;
  1262.       break;
  1263.     case NOTHING:
  1264. default:
  1265.       break;
  1266.     }
  1267.   }
  1268.   
  1269.   return SNMP_ERR_NOERROR;
  1270. }  /* write_snmpTargetAddrRowStatus */
  1271. u_char *
  1272. var_snmpTargetSpinLock(
  1273.     struct variable *vp,
  1274.     oid     *name,
  1275.     int  *length,
  1276.     int     exact,
  1277.     int  *var_len,
  1278.     WriteMethod **write_method)
  1279. {
  1280. static long long_ret;
  1281. *write_method = NULL;
  1282. if (header_generic(vp,name,length,exact,var_len,write_method) == MATCH_FAILED)
  1283. return NULL;
  1284. switch(vp->magic) {
  1285.     case SNMPTARGETSPINLOCK:
  1286.       *write_method = write_snmpTargetSpinLock;
  1287.       long_ret = snmpTargetSpinLock;
  1288.   *var_len = sizeof (long);
  1289.       return (unsigned char *) &long_ret;
  1290. default:
  1291. snmp_trace ("SNMP in var_snmpTargetSpinLock: unknown suboidn");
  1292. }
  1293. return NULL;
  1294. }
  1295.  
  1296. int write_snmpTargetSpinLock(
  1297.    int      action,
  1298.    u_char   *var_val,
  1299.    u_char   var_val_type,
  1300.    int   var_val_len,
  1301.    u_char   *statP,
  1302.    oid      *name,
  1303.    int   name_len)
  1304. {
  1305.   /* variables we may use later */
  1306.   static long long_ret;
  1307.   if (var_val_type != ASN_INTEGER){
  1308.       DEBUGMSGTL(("usmUser","write to usmUserSpinLock not ASN_INTEGERn"));
  1309.       return SNMP_ERR_WRONGTYPE;
  1310.   }
  1311.   if (var_val_len > sizeof(long_ret)){
  1312.       DEBUGMSGTL(("usmUser","write to usmUserSpinLock: bad lengthn"));
  1313.       return SNMP_ERR_WRONGLENGTH;
  1314.   }
  1315.   long_ret = *((long *) var_val);
  1316.   if (long_ret != (long)snmpTargetSpinLock)
  1317.     return SNMP_ERR_INCONSISTENTVALUE;
  1318.   if (action == COMMIT) {
  1319.     if (snmpTargetSpinLock == 2147483647)
  1320.       snmpTargetSpinLock = 0;
  1321.     else
  1322.       snmpTargetSpinLock++;
  1323.   }
  1324.   return SNMP_ERR_NOERROR;
  1325. }  /* end write_usmUserSpinLock() */
  1326. int snmpTargetGetAddrFromIndex(char *name, char *buf, int *pRetry)
  1327. {
  1328. struct targetAddrTable_struct *temp_struct;
  1329. long ipAddr;
  1330. for( temp_struct = aAddrTable; temp_struct != NULL; temp_struct = temp_struct->next) 
  1331. {
  1332.     if (strcmp (name,temp_struct->name) == 0 && temp_struct->rowStatus == SNMP_ROW_ACTIVE)
  1333. {
  1334. ipAddr = *((long *)(temp_struct->tAddress));
  1335. strncpy (buf, snmp_ntoa(ipAddr), 256);
  1336. *pRetry = temp_struct->retryCount;
  1337. return 1;
  1338. }
  1339. }
  1340. return 0;
  1341. }
  1342. /************************************************
  1343. *When rowStatus set to active, add to trap sink.
  1344. *--sxf 2k-12-27
  1345. ************************************************/
  1346. extern int deleteTrapSessionNoRem (char *peer, char *community, int version, int pdutype);
  1347. extern int createTrapSessionNoAdd (char *sink,char * com,int timeout,int queuelen,unsigned short trapflags, int version, int pdutype);
  1348. extern int snmpTargetGetCommFromIndex (char*, char*);
  1349. void  snmpTargetTryToAddTrap (char *name)
  1350. {
  1351. char host_name[256];
  1352. char community[256];
  1353. int  retry;
  1354. if (snmpTargetGetAddrFromIndex (name, host_name, &retry))
  1355. {
  1356. if (snmpTargetGetCommFromIndex(name, community))
  1357. {
  1358. createTrapSessionNoAdd (host_name, community, 30, retry, 0xffff, SNMP_VERSION_1, SNMP_MSG_TRAP);
  1359. }
  1360. }
  1361. }
  1362. /***************************************************
  1363. *When rowStatus set from active, del from trap sink
  1364. *--sxf 2k-12-27
  1365. ***************************************************/
  1366. void  snmpTargetTryToDelTrap (char *name)
  1367. {
  1368. char host_name[256];
  1369. char community[256];
  1370. int  retry;
  1371. if (snmpTargetGetAddrFromIndex (name, host_name, &retry))
  1372. {
  1373. if (snmpTargetGetCommFromIndex(name, community))
  1374. {
  1375. deleteTrapSessionNoRem (host_name, community, SNMP_VERSION_1, SNMP_MSG_TRAP);
  1376. }
  1377. }
  1378. }
  1379. u_char *
  1380. var_snmpTargetContexts(
  1381.     struct variable *vp,
  1382.     oid     *name,
  1383.     int  *length,
  1384.     int     exact,
  1385.     int  *var_len,
  1386.     WriteMethod **write_method)
  1387. {
  1388. static long long_ret;
  1389. *write_method = NULL;
  1390. if (header_generic(vp,name,length,exact,var_len,write_method) == MATCH_FAILED)
  1391. return NULL;
  1392. switch(vp->magic) {
  1393.     case SNMPUNAVAILABLECONTEXTS:
  1394. case SNMPUNKNOWNCONTEXTS:
  1395.       long_ret = 0;
  1396.      *var_len = sizeof (long);
  1397.       return (unsigned char *) &long_ret;
  1398. default:
  1399. snmp_trace ("SNMP in var_snmpTargetSpinLock: unknown suboidn");
  1400. }
  1401. return NULL;
  1402. }