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

SNMP编程

开发平台:

C/C++

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