v3.cpp
上传用户:ets1996
上传日期:2014-09-30
资源大小:353k
文件大小:10k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  v3.cpp  
  4.   _##
  5.   _##  SNMP++v3.2.22
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2007 Jochen Katz, Frank Fock
  8.   _##
  9.   _##  This software is based on SNMP++2.6 from Hewlett Packard:
  10.   _##  
  11.   _##    Copyright (c) 1996
  12.   _##    Hewlett-Packard Company
  13.   _##  
  14.   _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  15.   _##  Permission to use, copy, modify, distribute and/or sell this software 
  16.   _##  and/or its documentation is hereby granted without fee. User agrees 
  17.   _##  to display the above copyright notice and this license notice in all 
  18.   _##  copies of the software and any documentation of the software. User 
  19.   _##  agrees to assume all liability for the use of the software; 
  20.   _##  Hewlett-Packard and Jochen Katz make no representations about the 
  21.   _##  suitability of this software for any purpose. It is provided 
  22.   _##  "AS-IS" without warranty of any kind, either express or implied. User 
  23.   _##  hereby grants a royalty-free license to any and all derivatives based
  24.   _##  upon this software code base. 
  25.   _##  
  26.   _##  Stuttgart, Germany, Wed May  2 23:22:30 CEST 2007 
  27.   _##  
  28.   _##########################################################################*/
  29. char v3_cpp_version[]="#(@) SNMP++ $Id: v3.cpp 273 2006-11-03 19:21:16Z katz $";
  30. #include <stdlib.h>
  31. #include <string.h>
  32. #include <stdio.h>
  33. #include <string.h>
  34. #ifndef _MSC_VER
  35. #ifndef __BCPLUSPLUS__
  36. #include <unistd.h>
  37. #endif
  38. #endif
  39. #include "snmp_pp/log.h"
  40. #include "snmp_pp/v3.h"
  41. #include "snmp_pp/octet.h"
  42. #ifdef SNMP_PP_NAMESPACE
  43. namespace Snmp_pp {
  44. #endif
  45. #define MAX_LINE_LEN 100
  46. const char *logfilename = NULL;
  47. int debug_level = 19;
  48. // Set the amount of log messages you want to get.
  49. void debug_set_level(const int db_level)
  50. {
  51.   debug_level = db_level;
  52. }
  53. #ifdef _DEBUG
  54. void debughexcprintf(int db_level, const char *comment,
  55.                      const unsigned char *data, const unsigned int len)
  56. {
  57.     if (db_level > debug_level) return;
  58.     char *buf = new char[MAX_LOG_SIZE];
  59.     if (NULL == buf) return; // not good!
  60.     if (comment && (strlen(comment) < MAX_LOG_SIZE - 25))
  61.     {
  62. sprintf(buf, "%s (length %i): n", comment, len);
  63. LOG_BEGIN(DEBUG_LOG | 3);
  64. LOG(buf);
  65. LOG_END;
  66.     }
  67.     char *tmp = new char[4];
  68.     if (NULL == tmp) { delete [] buf ; return; }
  69.     buf[0] = '';
  70.     for (unsigned int i=0; i<len; i++)
  71.     {
  72. sprintf(tmp, "%02X ", data[i]);
  73. strcat(buf, tmp);
  74. if ((i+1)%4==0)
  75. {
  76.     sprintf(tmp, " ");
  77.     strcat(buf, tmp);
  78. }
  79. if ((i+1)%16==0)
  80. {
  81.     LOG_BEGIN(DEBUG_LOG | 3);
  82.     LOG(buf);
  83.     LOG_END;
  84.     // reset the buf
  85.     buf[0] = '';
  86. }
  87.     }
  88.     if (buf[0] != '')
  89.     {
  90. // print the last part of the message
  91. LOG_BEGIN(DEBUG_LOG | 3);
  92. LOG(buf);
  93. LOG_END;
  94.     }
  95.     // and cleanup...
  96.     delete [] tmp;
  97.     delete [] buf;
  98. }
  99. void debugprintf(int db_level, const char *format, ...)
  100. {
  101.     if (db_level > debug_level) return;
  102.     va_list  args;
  103.     va_start(args, format);
  104. /////////////////////////////////////////////////////////////////
  105. // NOTE: This would be the best way to go (by using _vscprintf), 
  106. // but it is part of the VC7.0, and it can't be used in VC6.0
  107. /////////////////////////////////////////////////////////////////
  108. // _vscprintf doesn't count terminating '' so we add one more
  109. // int len = _vscprintf( format, args ) + 1;
  110.     char *buf = new char[MAX_LOG_SIZE];
  111.     if (NULL == buf) return; // not good!
  112.     vsprintf(buf, format, args);
  113.     va_end(args);
  114.     LOG_BEGIN(DEBUG_LOG | 1);
  115.     LOG(buf);
  116.     LOG_END;
  117.     // and cleanup...
  118.     delete [] buf;
  119. }
  120. #else
  121. #if (defined (__STRICT_ANSI__) || !defined (__GNUC__)) && !defined (_MSC_VER)
  122. void debugprintf(int, const char*, ...)
  123. {
  124. }
  125. #endif
  126. #endif
  127. #ifdef _SNMPv3
  128. unsigned char *v3strcpy(const unsigned char *src, const int srclen)
  129. {
  130.   unsigned char *res = new unsigned char[srclen+1];
  131.   if (!res) return NULL;
  132.   memcpy(res, src, srclen);
  133.   res[srclen] = '';
  134.   return res;
  135. }
  136. int unsignedCharCompare(const unsigned char *str1, const long int ptr1len,
  137.                         const unsigned char *str2, const long int ptr2len)
  138. {
  139.   if (ptr1len != ptr2len) return 0;
  140.   const unsigned char *ptr1 = str1;
  141.   const unsigned char *ptr2 = str2;
  142.   for (int i=0; i < ptr1len; ++i)
  143.     if (*ptr1++ != *ptr2++) return 0;
  144.   return 1;
  145. }
  146. // Encode the given string into the output buffer.
  147. void encodeString(const unsigned char* in, const int in_length, char* out)
  148. {
  149.   char* out_ptr = out;
  150.   const unsigned char* in_ptr = in;
  151.   for (int i=0; i<in_length; i++)
  152.   {
  153.     *out_ptr++ = 64 + ((*in_ptr >> 4) & 0xF);
  154.     *out_ptr++ = 64 + (*in_ptr++ & 0xF);
  155.   }
  156. }
  157. // Decode the given encoded string into the output buffer.
  158. void decodeString(const unsigned char* in, const int in_length, char* out)
  159. {
  160.   char* out_ptr = out;
  161.   const unsigned char* in_ptr = in;
  162.   if ((in_length % 2) || (in_length < 0))
  163.   {
  164.     LOG_BEGIN(WARNING_LOG | 3);
  165.     LOG("decodeString: Illegal input length (len)");
  166.     LOG(in_length);
  167.     LOG_END;
  168.     *out = 0;
  169.     return;
  170.   }
  171.   for (int i= in_length / 2; i > 0; i--)
  172.   {
  173.     *out_ptr = (*in_ptr++ & 0xF) << 4;
  174.     *out_ptr++ |= (*in_ptr++ & 0xF);
  175.   }
  176.   *out_ptr = 0; // make sure it is null terminated
  177. }
  178. // Read the bootCounter of the given engineID stored in the given file.
  179. int getBootCounter(const char *fileName,
  180.                    const OctetStr &engineId, unsigned int &boot)
  181. {
  182.   char line[MAX_LINE_LEN];
  183.   char encoded[MAXLENGTH_ENGINEID * 2 + 2];
  184.   int len = engineId.len();
  185.   FILE *file;
  186.   boot = 0;
  187.   file = fopen(fileName, "r");
  188.   if (!file)
  189.   {
  190.     LOG_BEGIN(ERROR_LOG | 1);
  191.     LOG("getBootCounter: Could not open (file)");
  192.     LOG(fileName);
  193.     LOG_END;
  194.     return SNMPv3_FILEOPEN_ERROR;
  195.   }
  196.   if (len > MAXLENGTH_ENGINEID)
  197.   {
  198.     LOG_BEGIN(ERROR_LOG | 3);
  199.     LOG("getBootCounter: engine id too long, ignoring last bytes (len) (max)");
  200.     LOG(len);
  201.     LOG(MAXLENGTH_ENGINEID);
  202.     LOG_END;
  203.     len = MAXLENGTH_ENGINEID;
  204.   }
  205.   encodeString(engineId.data(), len, encoded);
  206.   encoded[2*len]=' ';
  207.   encoded[2*len + 1] = 0;
  208.   while (fgets(line, MAX_LINE_LEN, file))
  209.   {
  210.     line[MAX_LINE_LEN - 1] = 0;
  211.     /* ignore comments */
  212.     if (line[0]=='#')
  213.       continue;
  214.     if (!strncmp(encoded, line, len*2 + 1))
  215.     {
  216.       /* line starts with engineId */
  217.       char* ptr = line;
  218.       /* skip until first space */
  219.       while (*ptr != 0 && *ptr != ' ')
  220.         ptr++;
  221.       if (*ptr == 0)
  222.       {
  223.         fclose(file);
  224.         LOG_BEGIN(ERROR_LOG | 3);
  225.         LOG("getBootCounter: Illegal line: (file) (line)");
  226.         LOG(fileName);
  227.         LOG(line);
  228.         LOG_END;
  229.         return SNMPv3_FILE_ERROR;
  230.       }
  231.       boot = atoi(ptr);
  232.       fclose(file);
  233.       LOG_BEGIN(DEBUG_LOG | 3);
  234.       LOG("getBootCounter: found entry (file) (engine id) (boot counter)");
  235.       LOG(fileName);
  236.       LOG(engineId.get_printable());
  237.       LOG(boot);
  238.       LOG_END;
  239.       return SNMPv3_OK;
  240.     }
  241.   }
  242.   fclose(file);
  243.   LOG_BEGIN(WARNING_LOG | 3);
  244.   LOG("getBootCounter: No entry found (file) (engine id)");
  245.   LOG(fileName);
  246.   LOG(engineId.get_printable());
  247.   LOG_END;
  248.   return SNMPv3_NO_ENTRY_ERROR;
  249. }
  250. // Store the bootCounter of the given engineID in the given file.
  251. int saveBootCounter(const char *fileName,
  252.                     const OctetStr &engineId, const unsigned int boot)
  253. {
  254.   char line[MAX_LINE_LEN];
  255.   char tmpFileName[MAXLENGTH_FILENAME];
  256.   char encoded[MAXLENGTH_ENGINEID * 2 + 2];
  257.   int found = FALSE;
  258.   int len = engineId.len();
  259.   FILE *file_in, *file_out;
  260.   tmpFileName[0] = 0;
  261.   sprintf(tmpFileName, "%s.tmp",fileName);
  262.   if (len > MAXLENGTH_ENGINEID)
  263.   {
  264.     LOG_BEGIN(ERROR_LOG | 3);
  265.     LOG("saveBootCounter: engine id too long, ignoring last bytes (len) (max)");
  266.     LOG(len);
  267.     LOG(MAXLENGTH_ENGINEID);
  268.     LOG_END;
  269.     len = MAXLENGTH_ENGINEID;
  270.   }
  271.   file_in = fopen(fileName, "r");
  272.   if (!file_in)
  273.   {
  274.     file_in = fopen(fileName, "w");
  275.     if (!file_in)
  276.     {
  277.       LOG_BEGIN(ERROR_LOG | 3);
  278.       LOG("saveBootCounter: could not create new file (file)");
  279.       LOG(fileName);
  280.       LOG_END;
  281.       return SNMPv3_FILECREATE_ERROR;
  282.     }
  283.     LOG_BEGIN(INFO_LOG | 3);
  284.     LOG("saveBootCounter: created new file (file)");
  285.     LOG(fileName);
  286.     LOG_END;
  287.     fputs("# n",file_in);
  288.     fputs("# This file was created by an SNMP++v3 application,n", file_in);
  289.     fputs("# it is used to store the snmpEngineBoots counters.n", file_in);
  290.     fputs("# n",file_in);
  291.     fputs("# Lines starting with '#' are comments.n", file_in);
  292.     fputs("# The snmpEngineBoots counters are stored asn", file_in);
  293.     fputs("# <encoded snmpEngineId> <bootCounter>n", file_in);
  294.     fputs("# n", file_in);
  295.     fclose(file_in);
  296.     file_in = fopen(fileName, "r");
  297.   }
  298.   file_out = fopen(tmpFileName, "w");
  299.   if ((file_in) && (file_out))
  300.   {
  301.     encodeString(engineId.data(), len, encoded);
  302.     encoded[len*2] = ' ';
  303.     encoded[len*2 + 1] = 0;
  304.     while (fgets(line, MAX_LINE_LEN, file_in))
  305.     {
  306.       line[MAX_LINE_LEN - 1] = 0;
  307.       if (!strncmp(encoded, line, len*2 + 1))
  308.       {
  309.         if (found)
  310.         {
  311.           LOG_BEGIN(WARNING_LOG | 3);
  312.           LOG("saveBootCounter: Removing doubled entry (file) (line)");
  313.           LOG(fileName);
  314.           LOG(line);
  315.           LOG_END;
  316.           continue;
  317.         }
  318.         sprintf(line,"%s%in", encoded, boot);
  319.         fputs(line, file_out);
  320.         found = TRUE;
  321.         continue;
  322.       }
  323.       fputs(line, file_out);
  324.     }
  325.     if (!found)
  326.     {
  327.       sprintf(line, "%s%in", encoded, boot);
  328.       fputs(line, file_out);
  329.     }
  330.     fclose(file_in);
  331.     fclose(file_out);
  332. #ifdef WIN32
  333.     _unlink(fileName);
  334. #endif
  335.     if (rename(tmpFileName, fileName))
  336.     {
  337.       LOG_BEGIN(ERROR_LOG | 1);
  338.       LOG("saveBootCounter: Failed to rename temporary file (tmp file) (file)");
  339.       LOG(tmpFileName);
  340.       LOG(fileName);
  341.       LOG_END;
  342.       return SNMPv3_FILERENAME_ERROR;
  343.     }
  344.     LOG_BEGIN(INFO_LOG | 5);
  345.     LOG("saveBootCounter: Saved counter (file) (engine id) (boot)");
  346.     LOG(fileName);
  347.     LOG(engineId.get_printable());
  348.     LOG(boot);
  349.     LOG_END;
  350.     return SNMPv3_OK;
  351.   }
  352.   LOG_BEGIN(ERROR_LOG | 1);
  353.   LOG("saveBootCounter: Failed to open both files (file) (tmp file)");
  354.   LOG(fileName);
  355.   LOG(tmpFileName);
  356.   LOG_END;
  357.   return SNMPv3_FILEOPEN_ERROR;
  358. }
  359. #endif
  360. #ifdef SNMP_PP_NAMESPACE
  361. }; // end of namespace Snmp_pp
  362. #endif