summaryrefslogtreecommitdiff
path: root/include/net-snmp/library/snmp_debug.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/net-snmp/library/snmp_debug.h')
-rw-r--r--include/net-snmp/library/snmp_debug.h243
1 files changed, 243 insertions, 0 deletions
diff --git a/include/net-snmp/library/snmp_debug.h b/include/net-snmp/library/snmp_debug.h
new file mode 100644
index 0000000..a3969f6
--- /dev/null
+++ b/include/net-snmp/library/snmp_debug.h
@@ -0,0 +1,243 @@
+#ifndef SNMP_DEBUG_H
+#define SNMP_DEBUG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /*
+ * snmp_debug.h:
+ *
+ * - prototypes for snmp debugging routines.
+ * - easy to use macros to wrap around the functions. This also provides
+ * the ability to remove debugging code easily from the applications at
+ * compile time.
+ */
+
+
+#if !defined(__GNUC__) || __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
+#define NETSNMP_ATTRIBUTE_FORMAT(type, formatArg, firstArg)
+#else
+#define NETSNMP_ATTRIBUTE_FORMAT(type, formatArg, firstArg) \
+ __attribute__((__format__( __ ## type ## __, formatArg, firstArg )))
+#endif
+
+ /*
+ * These functions should not be used, if at all possible. Instead, use
+ * the macros below.
+ */
+ NETSNMP_IMPORT
+ void debugmsg(const char *token, const char *format, ...)
+ NETSNMP_ATTRIBUTE_FORMAT(printf, 2, 3);
+ NETSNMP_IMPORT
+ void debugmsgtoken(const char *token, const char *format,
+ ...)
+ NETSNMP_ATTRIBUTE_FORMAT(printf, 2, 3);
+ void debug_combo_nc(const char *token, const char *format,
+ ...)
+ NETSNMP_ATTRIBUTE_FORMAT(printf, 2, 3);
+
+#undef NETSNMP_ATTRIBUTE_FORMAT
+
+ NETSNMP_IMPORT
+ void debugmsg_oid(const char *token, const oid * theoid,
+ size_t len);
+ NETSNMP_IMPORT
+ void debugmsg_suboid(const char *token, const oid * theoid,
+ size_t len);
+ NETSNMP_IMPORT
+ void debugmsg_var(const char *token,
+ netsnmp_variable_list * var);
+ NETSNMP_IMPORT
+ void debugmsg_oidrange(const char *token,
+ const oid * theoid, size_t len,
+ size_t var_subid, oid range_ubound);
+ NETSNMP_IMPORT
+ void debugmsg_hex(const char *token, const u_char * thedata,
+ size_t len);
+ NETSNMP_IMPORT
+ void debugmsg_hextli(const char *token, const u_char * thedata,
+ size_t len);
+ NETSNMP_IMPORT
+ void debug_indent_add(int amount);
+ NETSNMP_IMPORT
+ int debug_indent_get(void);
+ /*
+ * What is said above is true for this function as well. Further this
+ * function is deprecated and only provided for backwards compatibility.
+ * Please use "%*s", debug_indent_get(), "" if you used this one before.
+ */
+ NETSNMP_IMPORT
+ const char *debug_indent(void);
+
+ /*
+ * Use these macros instead of the functions above to allow them to be
+ * re-defined at compile time to NOP for speed optimization.
+ *
+ * They need to be called enclosing all the arguments in a single set of ()s.
+ * Example:
+ * DEBUGMSGTL(("token", "debugging of something %s related\n", "snmp"));
+ *
+ * Usage:
+ * All of the functions take a "token" argument that helps determine when
+ * the output in question should be printed. See the snmpcmd.1 manual page
+ * on the -D flag to turn on/off output for a given token on the command line.
+ *
+ * DEBUGMSG((token, format, ...)): equivalent to printf(format, ...)
+ * (if "token" debugging output
+ * is requested by the user)
+ *
+ * DEBUGMSGT((token, format, ...)): equivalent to DEBUGMSG, but prints
+ * "token: " at the beginning of the
+ * line for you.
+ *
+ * DEBUGTRACE Insert this token anywhere you want
+ * tracing output displayed when the
+ * "trace" debugging token is selected.
+ *
+ * DEBUGMSGL((token, format, ...)): equivalent to DEBUGMSG, but includes
+ * DEBUGTRACE debugging line just before
+ * yours.
+ *
+ * DEBUGMSGTL((token, format, ...)): Same as DEBUGMSGL and DEBUGMSGT
+ * combined.
+ *
+ * Important:
+ * It is considered best if you use DEBUGMSGTL() everywhere possible, as it
+ * gives the nicest format output and provides tracing support just before
+ * every debugging statement output.
+ *
+ * To print multiple pieces to a single line in one call, use:
+ *
+ * DEBUGMSGTL(("token", "line part 1"));
+ * DEBUGMSG (("token", " and part 2\n"));
+ *
+ * to get:
+ *
+ * token: line part 1 and part 2
+ *
+ * as debugging output.
+ *
+ *
+ * Each of these macros also have a version with a suffix of '_NC'. The
+ * NC suffix stands for 'No Check', which means that no check will be
+ * performed to see if debug is enabled or if the token has been turned
+ * on. These NC versions are intended for use within a DEBUG_IF {} block,
+ * where the debug/token check has already been performed.
+ */
+
+#ifndef NETSNMP_NO_DEBUGGING /* make sure we're wanted */
+
+ /*
+ * define two macros : one macro with, one without,
+ * a test if debugging is enabled.
+ *
+ * Generally, use the macro with _DBG_IF_
+ */
+
+/******************* Start private macros ************************/
+#define _DBG_IF_ snmp_get_do_debugging()
+#define DEBUGIF(x) if (_DBG_IF_ && debug_is_token_registered(x) == SNMPERR_SUCCESS)
+
+#define __DBGMSGT(x) debugmsgtoken x, debugmsg x
+#define __DBGMSG_NC(x) debugmsg x
+#define __DBGMSGT_NC(x) debug_combo_nc x
+#define __DBGMSGL_NC(x) __DBGTRACE; debugmsg x
+#define __DBGMSGTL_NC(x) __DBGTRACE; debug_combo_nc x
+
+#ifdef NETSNMP_FUNCTION
+#define __DBGTRACE __DBGMSGT(("trace","%s(): %s, %d:\n",\
+ NETSNMP_FUNCTION,__FILE__,__LINE__))
+#define __DBGTRACETOK(x) __DBGMSGT((x,"%s(): %s, %d:\n", \
+ NETSNMP_FUNCTION,__FILE__,__LINE__))
+#else
+#define __DBGTRACE __DBGMSGT(("trace"," %s, %d:\n", __FILE__,__LINE__))
+#define __DBGTRACETOK(x) __DBGMSGT((x," %s, %d:\n", __FILE__,__LINE__))
+#endif
+
+#define __DBGMSGL(x) __DBGTRACE, debugmsg x
+#define __DBGMSGTL(x) __DBGTRACE, debugmsgtoken x, debugmsg x
+#define __DBGMSGOID(x) debugmsg_oid x
+#define __DBGMSGSUBOID(x) debugmsg_suboid x
+#define __DBGMSGVAR(x) debugmsg_var x
+#define __DBGMSGOIDRANGE(x) debugmsg_oidrange x
+#define __DBGMSGHEX(x) debugmsg_hex x
+#define __DBGMSGHEXTLI(x) debugmsg_hextli x
+#define __DBGINDENT() debug_indent_get()
+#define __DBGINDENTADD(x) debug_indent_add(x)
+#define __DBGINDENTMORE() debug_indent_add(2)
+#define __DBGINDENTLESS() debug_indent_add(-2)
+#define __DBGPRINTINDENT(token) __DBGMSGTL((token, "%*s", __DBGINDENT(), ""))
+
+#define __DBGDUMPHEADER(token,x) \
+ __DBGPRINTINDENT("dumph_" token); \
+ debugmsg("dumph_" token,x); \
+ if (debug_is_token_registered("dumpx" token) == SNMPERR_SUCCESS || \
+ debug_is_token_registered("dumpv" token) == SNMPERR_SUCCESS || \
+ (debug_is_token_registered("dumpx_" token) != SNMPERR_SUCCESS && \
+ debug_is_token_registered("dumpv_" token) != SNMPERR_SUCCESS)) { \
+ debugmsg("dumph_" token,"\n"); \
+ } else { \
+ debugmsg("dumph_" token," "); \
+ } \
+ __DBGINDENTMORE()
+
+#define __DBGDUMPSECTION(token,x) \
+ __DBGPRINTINDENT("dumph_" token); \
+ debugmsg("dumph_" token,"%s\n",x);\
+ __DBGINDENTMORE()
+
+#define __DBGDUMPSETUP(token,buf,len) \
+ debugmsg("dumpx" token, "dumpx_%s:%*s", token, __DBGINDENT(), ""); \
+ __DBGMSGHEX(("dumpx_" token,buf,len)); \
+ if (debug_is_token_registered("dumpv" token) == SNMPERR_SUCCESS || \
+ debug_is_token_registered("dumpv_" token) != SNMPERR_SUCCESS) { \
+ debugmsg("dumpx_" token,"\n"); \
+ } else { \
+ debugmsg("dumpx_" token," "); \
+ } \
+ debugmsg("dumpv" token, "dumpv_%s:%*s", token, __DBGINDENT(), "");
+
+/******************* End private macros ************************/
+/*****************************************************************/
+#endif /* NETSNMP_NO_DEBUGGING */
+
+#ifdef __cplusplus
+}
+#endif
+
+ /* Public macros moved to top-level API header file */
+#include <net-snmp/output_api.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ void snmp_debug_init(void);
+
+#define MAX_DEBUG_TOKENS 256
+#define MAX_DEBUG_TOKEN_LEN 128
+#define DEBUG_TOKEN_DELIMITER ","
+#define DEBUG_ALWAYS_TOKEN "all"
+
+#ifndef NETSNMP_NO_DEBUGGING
+
+/*
+ * internal:
+ * You probably shouldn't be using this information unless the word
+ * "expert" applies to you. I know it looks tempting.
+ */
+typedef struct netsnmp_token_descr_s {
+ char *token_name;
+ char enabled;
+} netsnmp_token_descr;
+
+NETSNMP_IMPORT int debug_num_tokens;
+NETSNMP_IMPORT netsnmp_token_descr dbg_tokens[MAX_DEBUG_TOKENS];
+
+#endif /* NETSNMP_NO_DEBUGGING */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* SNMP_DEBUG_H */