snmp_debug.h
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:10k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. #ifndef SNMP_DEBUG_H
  2. #define SNMP_DEBUG_H
  3. #ifdef __cplusplus
  4. extern          "C" {
  5. #endif
  6.     /*
  7.      * snmp_debug.h:
  8.      * 
  9.      * - prototypes for snmp debugging routines.
  10.      * - easy to use macros to wrap around the functions.  This also provides
  11.      * the ability to remove debugging code easily from the applications at
  12.      * compile time.
  13.      */
  14.     /*
  15.      * These functions should not be used, if at all possible.  Instead, use
  16.      * the macros below. 
  17.      */
  18. #if HAVE_STDARG_H
  19.     void            debugmsg(const char *token, const char *format, ...);
  20.     void            debugmsgtoken(const char *token, const char *format,
  21.                                   ...);
  22.     void            debug_combo_nc(const char *token, const char *format,
  23.                                    ...);
  24. #else
  25.     void            debugmsg(va_alist);
  26.     void            debugmsgtoken(va_alist);
  27.     void            debug_combo_nc(va_alist);
  28. #endif
  29.     void            debugmsg_oid(const char *token, const oid * theoid,
  30.                                  size_t len);
  31.     void            debugmsg_suboid(const char *token, const oid * theoid,
  32.                                     size_t len);
  33.     void            debugmsg_var(const char *token,
  34.                                  netsnmp_variable_list * var);
  35.     void            debugmsg_oidrange(const char *token,
  36.                                       const oid * theoid, size_t len,
  37.                                       size_t var_subid, oid range_ubound);
  38.     void            debugmsg_hex(const char *token, u_char * thedata,
  39.                                  size_t len);
  40.     void            debugmsg_hextli(const char *token, u_char * thedata,
  41.                                     size_t len);
  42.     void            debug_indent_add(int amount);
  43.     char           *debug_indent(void);
  44.     /*
  45.      * Use these macros instead of the functions above to allow them to be
  46.      * re-defined at compile time to NOP for speed optimization.
  47.      * 
  48.      * They need to be called enclosing all the arguments in a single set of ()s.
  49.      * Example:
  50.      * DEBUGMSGTL(("token", "debugging of something %s relatedn", "snmp"));
  51.      * 
  52.      * Usage:
  53.      * All of the functions take a "token" argument that helps determine when
  54.      * the output in question should be printed.  See the snmpcmd.1 manual page
  55.      * on the -D flag to turn on/off output for a given token on the command line.
  56.      * 
  57.      * DEBUGMSG((token, format, ...)):      equivalent to printf(format, ...)
  58.      * (if "token" debugging output
  59.      * is requested by the user)
  60.      * 
  61.      * DEBUGMSGT((token, format, ...)):     equivalent to DEBUGMSG, but prints
  62.      * "token: " at the beginning of the
  63.      * line for you.
  64.      * 
  65.      * DEBUGTRACE                           Insert this token anywhere you want
  66.      * tracing output displayed when the
  67.      * "trace" debugging token is selected.
  68.      * 
  69.      * DEBUGMSGL((token, format, ...)):     equivalent to DEBUGMSG, but includes
  70.      * DEBUGTRACE debugging line just before
  71.      * yours.
  72.      * 
  73.      * DEBUGMSGTL((token, format, ...)):    Same as DEBUGMSGL and DEBUGMSGT
  74.      * combined.
  75.      * 
  76.      * Important:
  77.      * It is considered best if you use DEBUGMSGTL() everywhere possible, as it
  78.      * gives the nicest format output and provides tracing support just before
  79.      * every debugging statement output.
  80.      * 
  81.      * To print multiple pieces to a single line in one call, use:
  82.      * 
  83.      * DEBUGMSGTL(("token", "line part 1"));
  84.      * DEBUGMSG  (("token", " and part 2n"));
  85.      * 
  86.      * to get:
  87.      * 
  88.      * token: line part 1 and part 2
  89.      * 
  90.      * as debugging output.
  91.      *
  92.      *
  93.      * Each of these macros also have a version with a suffix of '_NC'. The
  94.      * NC suffix stands for 'No Check', which means that no check will be
  95.      * performed to see if debug is enabled or if the token has been turned
  96.      * on. These NC versions are intended for use within a DEBUG_IF {} block,
  97.      * where the debug/token check has already been performed.
  98.      */
  99. #ifndef SNMP_NO_DEBUGGING       /* make sure we're wanted */
  100.     /*
  101.      * define two macros : one macro with, one without,
  102.      *                     a test if debugging is enabled.
  103.      * 
  104.      * Generally, use the macro with _DBG_IF_
  105.      */
  106. /******************* Start private macros ************************/
  107. #define _DBG_IF_            snmp_get_do_debugging()
  108. #define DEBUGIF(x)         if (_DBG_IF_ && debug_is_token_registered(x) == SNMPERR_SUCCESS)
  109. #define __DBGMSGT(x)     debugmsgtoken x,  debugmsg x
  110. #define __DBGMSG_NC(x)   debugmsg x
  111. #define __DBGMSGT_NC(x)  debug_combo_nc x
  112. #define __DBGMSGL_NC(x)  __DBGTRACE; debugmsg x
  113. #define __DBGMSGTL_NC(x) __DBGTRACE; debug_combo_nc x
  114. #ifdef  HAVE_CPP_UNDERBAR_FUNCTION_DEFINED
  115. #define __DBGTRACE       __DBGMSGT(("trace","%s(): %s, %d:n",__FUNCTION__,
  116.                                  __FILE__,__LINE__))
  117. #else
  118. #define __DBGTRACE       __DBGMSGT(("trace"," %s, %d:n", __FILE__,__LINE__))
  119. #endif
  120. #define __DBGMSGL(x)     __DBGTRACE, debugmsg x
  121. #define __DBGMSGTL(x)    __DBGTRACE, debugmsgtoken x, debugmsg x
  122. #define __DBGMSGOID(x)     debugmsg_oid x
  123. #define __DBGMSGSUBOID(x)  debugmsg_suboid x
  124. #define __DBGMSGVAR(x)     debugmsg_var x
  125. #define __DBGMSGOIDRANGE(x) debugmsg_oidrange x
  126. #define __DBGMSGHEX(x)     debugmsg_hex x
  127. #define __DBGMSGHEXTLI(x)  debugmsg_hextli x
  128. #define __DBGINDENT()      debug_indent()
  129. #define __DBGINDENTADD(x)  debug_indent_add(x)
  130. #define __DBGINDENTMORE()  debug_indent_add(2)
  131. #define __DBGINDENTLESS()  debug_indent_add(-2)
  132. #define __DBGPRINTINDENT(token) __DBGMSGTL((token, "%s", __DBGINDENT()))
  133. #define __DBGDUMPHEADER(token,x) 
  134.         __DBGPRINTINDENT("dumph_" token); 
  135.         debugmsg("dumph_" token,x); 
  136.         if (debug_is_token_registered("dumpx" token) == SNMPERR_SUCCESS ||    
  137.             debug_is_token_registered("dumpv" token) == SNMPERR_SUCCESS ||    
  138.             (debug_is_token_registered("dumpx_" token) != SNMPERR_SUCCESS &&  
  139.              debug_is_token_registered("dumpv_" token) != SNMPERR_SUCCESS)) { 
  140.             debugmsg("dumph_" token,"n"); 
  141.         } else { 
  142.             debugmsg("dumph_" token,"  "); 
  143.         } 
  144.         __DBGINDENTMORE()
  145. #define __DBGDUMPSECTION(token,x) 
  146.         __DBGPRINTINDENT("dumph_" token); 
  147.         debugmsg("dumph_" token,x); 
  148.         debugmsg("dumph_" token,"n"); 
  149.         __DBGINDENTMORE()
  150. #define __DBGDUMPSETUP(token,buf,len) 
  151.         debugmsg("dumpx" token, "dumpx_%s:%s", token, __DBGINDENT()); 
  152.         __DBGMSGHEX(("dumpx_" token,buf,len)); 
  153.         if (debug_is_token_registered("dumpv" token) == SNMPERR_SUCCESS || 
  154.             debug_is_token_registered("dumpv_" token) != SNMPERR_SUCCESS) { 
  155.             debugmsg("dumpx_" token,"n"); 
  156.         } else { 
  157.             debugmsg("dumpx_" token,"  "); 
  158.         } 
  159.         debugmsg("dumpv" token, "dumpv_%s:%s", token, __DBGINDENT());
  160. /******************* End   private macros ************************/
  161. /*****************************************************************/
  162. /*****************************************************************/
  163. /********************Start public  macros ************************/
  164. #define DEBUGMSG(x)        do {if (_DBG_IF_) {debugmsg x;} }while(0)
  165. #define DEBUGMSGT(x)       do {if (_DBG_IF_) {__DBGMSGT(x);} }while(0)
  166. #define DEBUGTRACE         do {if (_DBG_IF_) {__DBGTRACE;} }while(0)
  167. #define DEBUGMSGL(x)       do {if (_DBG_IF_) {__DBGMSGL(x);} }while(0)
  168. #define DEBUGMSGTL(x)      do {if (_DBG_IF_) {__DBGMSGTL(x);} }while(0)
  169. #define DEBUGMSGOID(x)     do {if (_DBG_IF_) {__DBGMSGOID(x);} }while(0)
  170. #define DEBUGMSGSUBOID(x)  do {if (_DBG_IF_) {__DBGMSGSUBOID(x);} }while(0)
  171. #define DEBUGMSGVAR(x)     do {if (_DBG_IF_) {__DBGMSGVAR(x);} }while(0)
  172. #define DEBUGMSGOIDRANGE(x) do {if (_DBG_IF_) {__DBGMSGOIDRANGE(x);} }while(0)
  173. #define DEBUGMSGHEX(x)     do {if (_DBG_IF_) {__DBGMSGHEX(x);} }while(0)
  174. #define DEBUGMSGHEXTLI(x)  do {if (_DBG_IF_) {__DBGMSGHEXTLI(x);} }while(0)
  175. #define DEBUGINDENT()      do {if (_DBG_IF_) {__DBGINDENT();} }while(0)
  176. #define DEBUGINDENTADD(x)  do {if (_DBG_IF_) {__DBGINDENTADD(x);} }while(0)
  177. #define DEBUGINDENTMORE()  do {if (_DBG_IF_) {__DBGINDENTMORE();} }while(0)
  178. #define DEBUGINDENTLESS()  do {if (_DBG_IF_) {__DBGINDENTLESS();} }while(0)
  179. #define DEBUGPRINTINDENT(token) 
  180. do {if (_DBG_IF_) {__DBGPRINTINDENT(token);} }while(0)
  181. #define DEBUGDUMPHEADER(token,x) 
  182. do {if (_DBG_IF_) {__DBGDUMPHEADER(token,x);} }while(0)
  183. #define DEBUGDUMPSECTION(token,x) 
  184. do {if (_DBG_IF_) {__DBGDUMPSECTION(token,x);} }while(0)
  185. #define DEBUGDUMPSETUP(token,buf,len) 
  186. do {if (_DBG_IF_) {__DBGDUMPSETUP(token,buf,len);} }while(0)
  187. #define DEBUGMSG_NC(x)  do { __DBGMSG_NC(x); }while(0)
  188. #define DEBUGMSGT_NC(x) do { __DBGMSGT_NC(x); }while(0)
  189. #else                           /* SNMP_NO_DEBUGGING := enable streamlining of the code */
  190. #define DEBUGMSG(x)
  191. #define DEBUGMSGT(x)
  192. #define DEBUGTRACE
  193. #define DEBUGMSGL(x)
  194. #define DEBUGMSGTL(x)
  195. #define DEBUGMSGOID(x)
  196. #define DEBUGMSGSUBOID(x)
  197. #define DEBUGMSGVAR(x)
  198. #define DEBUGMSGOIDRANGE(x)
  199. #define DEBUGMSGHEX(x)
  200. #define DEBUGIF(x)        if(0)
  201. #define DEBUGDUMP(t,b,l,p)
  202. #define DEBUGINDENT()
  203. #define DEBUGINDENTMORE()
  204. #define DEBUGINDENTLESS()
  205. #define DEBUGINDENTADD(x)
  206. #define DEBUGMSGHEXTLI(x)
  207. #define DEBUGPRINTINDENT(token)
  208. #define DEBUGDUMPHEADER(token,x)
  209. #define DEBUGDUMPSECTION(token,x)
  210. #define DEBUGDUMPSETUP(token, buf, len)
  211. #define DEBUGMSG_NC(x)
  212. #define DEBUGMSGT_NC(x)
  213. #endif
  214. #define MAX_DEBUG_TOKENS 256
  215. #define MAX_DEBUG_TOKEN_LEN 128
  216. #define DEBUG_TOKEN_DELIMITER ","
  217. #define DEBUG_ALWAYS_TOKEN "all"
  218.     /*
  219.      * setup routines:
  220.      * 
  221.      * debug_register_tokens(char *):     registers a list of tokens to
  222.      * print debugging output for.
  223.      * 
  224.      * debug_is_token_registered(char *): returns SNMPERR_SUCCESS or SNMPERR_GENERR
  225.      * if a token has been registered or
  226.      * not (and debugging output is "on").
  227.      * snmp_debug_init(void):             registers .conf handlers.
  228.      */
  229.     void            debug_register_tokens(char *tokens);
  230.     int             debug_is_token_registered(const char *token);
  231.     void            snmp_debug_init(void);
  232.     void            snmp_set_do_debugging(int);
  233.     int             snmp_get_do_debugging(void);
  234. /*
  235.  * internal:
  236.  * You probably shouldn't be using this information unless the word
  237.  * "expert" applies to you.  I know it looks tempting.
  238.  */
  239. typedef struct netsnmp_token_descr_s {
  240.     char *token_name;
  241.     char  enabled;
  242. } netsnmp_token_descr;
  243. extern int                 debug_num_tokens;
  244. extern netsnmp_token_descr dbg_tokens[MAX_DEBUG_TOKENS];
  245.     
  246. #ifdef __cplusplus
  247. }
  248. #endif
  249. #endif                          /* SNMP_DEBUG_H */