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

SNMP编程

开发平台:

C/C++

  1. #include <config.h>
  2. #include <stdio.h>
  3. #if HAVE_STDLIB_H
  4. #include <stdlib.h>
  5. #endif
  6. #if HAVE_STRING_H
  7. #include <string.h>
  8. #else
  9. #include <strings.h>
  10. #endif
  11. #include <sys/types.h>
  12. #if HAVE_NETINET_IN_H
  13. #include <netinet/in.h>
  14. #endif
  15. #if HAVE_STDARG_H
  16. #include <stdarg.h>
  17. #else
  18. #include <varargs.h>
  19. #endif
  20. #if HAVE_WINSOCK_H
  21. #include <ip/socket.h>
  22. #endif
  23. #if HAVE_DMALLOC_H
  24. #include <dmalloc.h>
  25. #endif
  26. #include "asn1.h"
  27. #include "mib.h"
  28. #include "snmp_api.h"
  29. #include "read_config.h"
  30. #include "snmp_debug.h"
  31. #include "snmp_impl.h"
  32. #include "snmp_logging.h"
  33. static int   dodebug = SNMP_ALWAYS_DEBUG;
  34. static int   debug_num_tokens=0;
  35. static char *debug_tokens[MAX_DEBUG_TOKENS];
  36. static int   debug_print_everything=0;
  37. /* indent debugging:  provide a space padded section to return an indent for */
  38. static int debugindent=0;
  39. #define INDENTMAX 80
  40. static char debugindentchars[] = "                                                                                ";
  41. char *
  42. debug_indent(void) {
  43.   return debugindentchars;
  44. }
  45. void
  46. debug_indent_add(int amount) {
  47.   if (debugindent+amount >= 0 && debugindent+amount < 80) {
  48.     debugindentchars[debugindent] = ' ';
  49.     debugindent += amount;
  50.     debugindentchars[debugindent] = '';
  51.   }
  52. }
  53. void
  54. #if HAVE_STDARG_H
  55. DEBUGP(const char *first, ...)
  56. #else
  57. DEBUGP(va_alist)
  58.   va_dcl
  59. #endif
  60. {
  61.   va_list args;
  62. #if HAVE_STDARG_H
  63.   va_start(args, first);
  64. #else
  65.   const char *first;
  66.   va_start(args);
  67.   first = va_arg(args, const char *);
  68. #endif
  69.   if (dodebug && (debug_print_everything || debug_num_tokens == 0)) {
  70.     fprintf(stderr, "%s: ", DEBUG_ALWAYS_TOKEN);
  71.     vfprintf(stderr, first, args);
  72.   }
  73.   va_end(args);
  74. }
  75. void
  76. DEBUGPOID(oid *theoid,
  77.   size_t len)
  78. {
  79.   char c_oid[SPRINT_MAX_LEN];
  80.   sprint_objid(c_oid,theoid,len);
  81.   DEBUGP(c_oid);
  82. }
  83. void debug_config_register_tokens(const char *configtoken, char *tokens) {
  84.   debug_register_tokens(tokens);
  85. }
  86. void debug_config_turn_on_debugging(const char *configtoken, char *line) {
  87.   snmp_set_do_debugging(atoi(line));
  88. }
  89. void
  90. snmp_debug_init(void) {
  91.   debugindentchars[0] = ''; /* zero out the debugging indent array. */
  92.   register_premib_handler("snmp","doDebugging",
  93.                           debug_config_turn_on_debugging, NULL,
  94.                           "(1|0)");
  95.   register_premib_handler("snmp","debugTokens",
  96.                           debug_config_register_tokens, NULL,
  97.                           "token[,token...]");
  98. }
  99. void debug_register_tokens(char *tokens) {
  100.   char *newp, *cp;
  101.   
  102.   if (tokens == 0 || *tokens == 0)
  103.     return;
  104.   newp = strdup(tokens); /* strtok messes it up */
  105.   cp = strtok(newp, DEBUG_TOKEN_DELIMITER);
  106.   while(cp) {
  107.     if (strlen(cp) < MAX_DEBUG_TOKEN_LEN) {
  108.       if (strcasecmp(cp, DEBUG_ALWAYS_TOKEN) == 0)
  109.         debug_print_everything = 1;
  110.       else if (debug_num_tokens < MAX_DEBUG_TOKENS)
  111.         debug_tokens[debug_num_tokens++] = strdup(cp);
  112.     }
  113.     cp = strtok(NULL, DEBUG_TOKEN_DELIMITER);
  114.   }
  115.   free(newp);
  116. }
  117. /*
  118.   debug_is_token_registered(char *TOKEN):
  119.   returns SNMPERR_SUCCESS
  120.        or SNMPERR_GENERR
  121.   if TOKEN has been registered and debugging support is turned on.
  122. */
  123. int
  124. debug_is_token_registered(const char *token) {
  125.   int i;
  126.   /* debugging flag is on or off */
  127.   if (!dodebug)
  128.     return SNMPERR_GENERR;
  129.   
  130.   if (debug_num_tokens == 0 || debug_print_everything) {
  131.     /* no tokens specified, print everything */
  132.     return SNMPERR_SUCCESS;
  133.   } else {
  134.     for(i=0; i < debug_num_tokens; i++) {
  135.       if (strncmp(debug_tokens[i], token, strlen(debug_tokens[i])) == 0) {
  136.         return SNMPERR_SUCCESS;
  137.       }
  138.     }
  139.   }
  140.   return SNMPERR_GENERR;
  141. }
  142. void
  143. #if HAVE_STDARG_H
  144. debugmsg(const char *token, const char *format, ...)
  145. #else
  146. debugmsg(va_alist)
  147.   va_dcl
  148. #endif
  149. {
  150.   va_list debugargs;
  151.   
  152. #if HAVE_STDARG_H
  153.   va_start(debugargs,format);
  154. #else
  155.   const char *format;
  156.   const char *token;
  157.   va_start(debugargs);
  158.   token = va_arg(debugargs, const char *);
  159.   format = va_arg(debugargs, const char *); /* ??? */
  160. #endif
  161.   if (debug_is_token_registered(token) == SNMPERR_SUCCESS) {
  162.     snmp_vlog(LOG_DEBUG, format, debugargs);
  163.   }
  164.   va_end(debugargs);
  165. }
  166. void
  167. debugmsg_oid(const char *token, oid *theoid, size_t len) {
  168.   char c_oid[SPRINT_MAX_LEN];
  169.   
  170.   sprint_objid(c_oid, theoid, len);
  171.   debugmsg(token, c_oid);
  172. }
  173. void
  174. debugmsg_hex(const char *token, u_char *thedata, size_t len) {
  175.   char buf[SPRINT_MAX_LEN];
  176.   
  177.   sprint_hexstring(buf, thedata, len);
  178.   debugmsg(token, buf);
  179. }
  180. void
  181. debugmsg_hextli(const char *token, u_char *thedata, size_t len) {
  182.   char buf[SPRINT_MAX_LEN];
  183.   int incr; 
  184.   /*XX tracing lines removed from this function DEBUGTRACE; */
  185.   DEBUGIF(token) {
  186.     for(incr = 16; len > 0; len -= incr, thedata += incr) {
  187.       if ((int)len < incr) incr = len;
  188.       /*XXnext two lines were DEBUGPRINTINDENT(token);*/
  189.       debugmsgtoken(token, "%s", debug_indent());
  190.       debugmsg(token, "%s", debug_indent());
  191.       sprint_hexstring(buf, thedata, incr);
  192.       debugmsg(token, buf);
  193.     }
  194.   }
  195. }
  196. void
  197. #if HAVE_STDARG_H
  198. debugmsgtoken(const char *token, const char *format, ...)
  199. #else
  200. debugmsgtoken(va_alist)
  201.   va_dcl
  202. #endif
  203. {
  204.   va_list debugargs;
  205. #if HAVE_STDARG_H
  206.   va_start(debugargs,format);
  207. #else
  208.   const char *token;
  209.   va_start(debugargs);
  210.   token = va_arg(debugargs, const char *);
  211. #endif
  212.   debugmsg(token, "%s: ", token);
  213.   va_end(debugargs);
  214. }
  215.   
  216. /* for speed, these shouldn't be in default_storage space */
  217. void
  218. snmp_set_do_debugging(int val)
  219. {
  220.   dodebug = val;
  221. }
  222. int
  223. snmp_get_do_debugging (void)
  224. {
  225.   return dodebug;
  226. }