|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Portions of this file are subject to the following copyright(s). See
|
|
Packit |
fcad23 |
* the Net-SNMP's COPYING file for more details and other copyrights
|
|
Packit |
fcad23 |
* that may apply:
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* Portions of this file are copyrighted by:
|
|
Packit |
fcad23 |
* Copyright (c) 2016 VMware, Inc. All rights reserved.
|
|
Packit |
fcad23 |
* Use is subject to license terms specified in the COPYING file
|
|
Packit |
fcad23 |
* distributed with the Net-SNMP package.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/net-snmp-config.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#define SYSLOG_NAMES
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <limits.h>
|
|
Packit |
fcad23 |
#include <stdio.h>
|
|
Packit |
fcad23 |
#ifndef HAVE_PRIORITYNAMES
|
|
Packit |
fcad23 |
#include <errno.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_STDLIB_H
|
|
Packit |
fcad23 |
#include <stdlib.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_STRING_H
|
|
Packit |
fcad23 |
#include <string.h>
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
#include <strings.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#include <sys/types.h>
|
|
Packit |
fcad23 |
#if HAVE_NETINET_IN_H
|
|
Packit |
fcad23 |
#include <netinet/in.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#include <stdarg.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#if HAVE_UNISTD_H
|
|
Packit |
fcad23 |
#include <unistd.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
#if HAVE_DMALLOC_H
|
|
Packit |
fcad23 |
#include <dmalloc.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifdef HAVE_PRIORITYNAMES
|
|
Packit |
fcad23 |
#include <sys/syslog.h>
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/types.h>
|
|
Packit |
fcad23 |
#include <net-snmp/output_api.h>
|
|
Packit |
fcad23 |
#include <net-snmp/library/snmp_debug.h> /* For this file's "internal" definitions */
|
|
Packit |
fcad23 |
#include <net-snmp/config_api.h>
|
|
Packit |
fcad23 |
#include <net-snmp/utilities.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#include <net-snmp/library/mib.h>
|
|
Packit |
fcad23 |
#include <net-snmp/library/snmp_api.h>
|
|
Packit |
fcad23 |
#include <net-snmp/library/snmp_assert.h>
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#define SNMP_DEBUG_DISABLED 0
|
|
Packit |
fcad23 |
#define SNMP_DEBUG_ACTIVE 1
|
|
Packit |
fcad23 |
#define SNMP_DEBUG_EXCLUDED 2
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifndef NETSNMP_NO_DEBUGGING
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static int dodebug = NETSNMP_ALWAYS_DEBUG;
|
|
Packit |
fcad23 |
int debug_num_tokens = 0;
|
|
Packit |
fcad23 |
static int debug_print_everything = 0;
|
|
Packit |
fcad23 |
#ifndef NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL
|
|
Packit |
fcad23 |
static int debug_log_level = LOG_DEBUG;
|
|
Packit |
fcad23 |
#else
|
|
Packit |
fcad23 |
#define debug_log_level LOG_DEBUG
|
|
Packit |
fcad23 |
#endif /* NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
netsnmp_token_descr dbg_tokens[MAX_DEBUG_TOKENS];
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Number of spaces to indent debug output. Valid range is [0,INT_MAX]
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
static int debugindent = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
debug_indent_get(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return debugindent;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
const char*
|
|
Packit |
fcad23 |
debug_indent(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
#define SPACES " " \
|
|
Packit |
fcad23 |
" "
|
|
Packit |
fcad23 |
if ((sizeof(SPACES) - 1) < (unsigned int)debugindent) {
|
|
Packit |
fcad23 |
snmp_log(LOG_ERR, "Too deep indentation for debug_indent. "
|
|
Packit |
fcad23 |
"Consider using \"%%*s\", debug_indent_get(), \"\" instead.");
|
|
Packit |
fcad23 |
return SPACES;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return SPACES + sizeof(SPACES) - 1 - debugindent;
|
|
Packit |
fcad23 |
#undef SPACES
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_indent_add(int amount)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
if (-debugindent <= amount && amount <= INT_MAX - debugindent)
|
|
Packit |
fcad23 |
debugindent += amount;
|
|
Packit |
fcad23 |
netsnmp_assert( debugindent >= 0 ); /* no negative indents */
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
NETSNMP_IMPORT void
|
|
Packit |
fcad23 |
debug_config_register_tokens(const char *configtoken, char *tokens);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_indent_reset(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
if (debugindent != 0)
|
|
Packit |
fcad23 |
DEBUGMSGTL(("dump_indent","indent reset from %d\n", debugindent));
|
|
Packit |
fcad23 |
debugindent = 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_config_register_tokens(const char *configtoken, char *tokens)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
debug_register_tokens(tokens);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
NETSNMP_IMPORT void
|
|
Packit |
fcad23 |
debug_config_turn_on_debugging(const char *configtoken, char *line);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_config_turn_on_debugging(const char *configtoken, char *line)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
snmp_set_do_debugging(atoi(line));
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifndef NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
netsnmp_set_debug_log_level(int val)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
if (val < LOG_EMERG)
|
|
Packit |
fcad23 |
val = LOG_EMERG;
|
|
Packit |
fcad23 |
else if (val > LOG_DEBUG)
|
|
Packit |
fcad23 |
val = LOG_DEBUG;
|
|
Packit |
fcad23 |
debug_log_level = val;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
netsnmp_get_debug_log_level(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return debug_log_level;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
static void
|
|
Packit |
fcad23 |
debug_config_debug_log_level(const char *configtoken, char *line)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
#if !HAVE_PRIORITYNAMES
|
|
Packit |
fcad23 |
static const struct strval_s {
|
|
Packit |
fcad23 |
const char *c_name;
|
|
Packit |
fcad23 |
int c_val;
|
|
Packit |
fcad23 |
} prioritynames[] = {
|
|
Packit |
fcad23 |
{ "alert", LOG_ALERT },
|
|
Packit |
fcad23 |
{ "crit", LOG_CRIT },
|
|
Packit |
fcad23 |
{ "debug", LOG_DEBUG },
|
|
Packit |
fcad23 |
{ "emerg", LOG_EMERG },
|
|
Packit |
fcad23 |
{ "err", LOG_ERR },
|
|
Packit |
fcad23 |
{ "info", LOG_INFO },
|
|
Packit |
fcad23 |
{ "notice", LOG_NOTICE },
|
|
Packit |
fcad23 |
{ "warning", LOG_WARNING },
|
|
Packit |
fcad23 |
{ NULL, 0 }
|
|
Packit |
fcad23 |
};
|
|
Packit |
fcad23 |
#endif
|
|
Packit |
fcad23 |
int i = 0, len_l, len_p;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
len_l = strlen(line);
|
|
Packit |
fcad23 |
for(;prioritynames[i].c_name;++i) {
|
|
Packit |
fcad23 |
len_p = strlen(prioritynames[i].c_name);
|
|
Packit |
fcad23 |
if ((len_p != len_l) ||
|
|
Packit |
fcad23 |
(strcasecmp(line,prioritynames[i].c_name) != 0))
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
netsnmp_set_debug_log_level(prioritynames[i].c_val);
|
|
Packit |
fcad23 |
return;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
config_perror("unknown debug log level, using debug");
|
|
Packit |
fcad23 |
netsnmp_set_debug_log_level(LOG_DEBUG);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
#endif /* NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_register_tokens(const char *tokens)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
char *newp, *cp;
|
|
Packit |
fcad23 |
char *st = NULL;
|
|
Packit |
fcad23 |
int status;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (tokens == NULL || *tokens == 0)
|
|
Packit |
fcad23 |
return;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
newp = strdup(tokens); /* strtok_r messes it up */
|
|
Packit |
fcad23 |
if (!newp)
|
|
Packit |
fcad23 |
return;
|
|
Packit |
fcad23 |
cp = strtok_r(newp, DEBUG_TOKEN_DELIMITER, &st);
|
|
Packit |
fcad23 |
while (cp) {
|
|
Packit |
fcad23 |
if (strlen(cp) < MAX_DEBUG_TOKEN_LEN) {
|
|
Packit |
fcad23 |
if (strcasecmp(cp, DEBUG_ALWAYS_TOKEN) == 0) {
|
|
Packit |
fcad23 |
debug_print_everything = 1;
|
|
Packit |
fcad23 |
} else if (debug_num_tokens < MAX_DEBUG_TOKENS) {
|
|
Packit |
fcad23 |
if ('-' == *cp) {
|
|
Packit |
fcad23 |
++cp;
|
|
Packit |
fcad23 |
status = SNMP_DEBUG_EXCLUDED;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
status = SNMP_DEBUG_ACTIVE;
|
|
Packit |
fcad23 |
dbg_tokens[debug_num_tokens].token_name = strdup(cp);
|
|
Packit |
fcad23 |
dbg_tokens[debug_num_tokens++].enabled = status;
|
|
Packit |
fcad23 |
snmp_log(LOG_NOTICE, "registered debug token %s, %d\n", cp, status);
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
snmp_log(LOG_NOTICE, "Unable to register debug token %s\n", cp);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
snmp_log(LOG_NOTICE, "Debug token %s over length\n", cp);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
cp = strtok_r(NULL, DEBUG_TOKEN_DELIMITER, &st);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
free(newp);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Print all registered tokens along with their current status
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_print_registered_tokens(void) {
|
|
Packit |
fcad23 |
int i;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
snmp_log(LOG_INFO, "%d tokens registered :\n", debug_num_tokens);
|
|
Packit |
fcad23 |
for (i=0; i
|
|
Packit |
fcad23 |
snmp_log( LOG_INFO, "%d) %s : %d\n",
|
|
Packit |
fcad23 |
i, dbg_tokens [i].token_name, dbg_tokens [i].enabled);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Enable logs on a given token
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
debug_enable_token_logs (const char *token) {
|
|
Packit |
fcad23 |
int i;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/* debugging flag is on or off */
|
|
Packit |
fcad23 |
if (!dodebug)
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (debug_num_tokens == 0 || debug_print_everything) {
|
|
Packit |
fcad23 |
/* no tokens specified, print everything */
|
|
Packit |
fcad23 |
return SNMPERR_SUCCESS;
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
for(i=0; i < debug_num_tokens; i++) {
|
|
Packit |
fcad23 |
if (dbg_tokens[i].token_name &&
|
|
Packit |
fcad23 |
strncmp(dbg_tokens[i].token_name, token,
|
|
Packit |
fcad23 |
strlen(dbg_tokens[i].token_name)) == 0) {
|
|
Packit |
fcad23 |
dbg_tokens[i].enabled = SNMP_DEBUG_ACTIVE;
|
|
Packit |
fcad23 |
return SNMPERR_SUCCESS;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* Diable logs on a given token
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
debug_disable_token_logs (const char *token) {
|
|
Packit |
fcad23 |
int i;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/* debugging flag is on or off */
|
|
Packit |
fcad23 |
if (!dodebug)
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (debug_num_tokens == 0 || debug_print_everything) {
|
|
Packit |
fcad23 |
/* no tokens specified, print everything */
|
|
Packit |
fcad23 |
return SNMPERR_SUCCESS;
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
for(i=0; i < debug_num_tokens; i++) {
|
|
Packit |
fcad23 |
if (strncmp(dbg_tokens[i].token_name, token,
|
|
Packit |
fcad23 |
strlen(dbg_tokens[i].token_name)) == 0) {
|
|
Packit |
fcad23 |
dbg_tokens[i].enabled = SNMP_DEBUG_DISABLED;
|
|
Packit |
fcad23 |
return SNMPERR_SUCCESS;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* debug_is_token_registered(char *TOKEN):
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* returns SNMPERR_SUCCESS
|
|
Packit |
fcad23 |
* or SNMPERR_GENERR
|
|
Packit |
fcad23 |
*
|
|
Packit |
fcad23 |
* if TOKEN has been registered and debugging support is turned on.
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
debug_is_token_registered(const char *token)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int i, rc;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* debugging flag is on or off
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
if (!dodebug)
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (debug_num_tokens == 0 || debug_print_everything) {
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* no tokens specified, print everything
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
return SNMPERR_SUCCESS;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
rc = SNMPERR_GENERR; /* ! found = err */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
for (i = 0; i < debug_num_tokens; i++) {
|
|
Packit |
fcad23 |
if (SNMP_DEBUG_DISABLED == dbg_tokens[i].enabled)
|
|
Packit |
fcad23 |
continue;
|
|
Packit |
fcad23 |
if (dbg_tokens[i].token_name &&
|
|
Packit |
fcad23 |
strncmp(dbg_tokens[i].token_name, token,
|
|
Packit |
fcad23 |
strlen(dbg_tokens[i].token_name)) == 0) {
|
|
Packit |
fcad23 |
if (SNMP_DEBUG_ACTIVE == dbg_tokens[i].enabled)
|
|
Packit |
fcad23 |
return SNMPERR_SUCCESS; /* active */
|
|
Packit |
fcad23 |
else
|
|
Packit |
fcad23 |
return SNMPERR_GENERR; /* excluded */
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return rc;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg(const char *token, const char *format, ...)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
if (debug_is_token_registered(token) == SNMPERR_SUCCESS) {
|
|
Packit |
fcad23 |
va_list debugargs;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
va_start(debugargs, format);
|
|
Packit |
fcad23 |
snmp_vlog(debug_log_level, format, debugargs);
|
|
Packit |
fcad23 |
va_end(debugargs);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_oid(const char *token, const oid * theoid, size_t len)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
u_char *buf = NULL;
|
|
Packit |
fcad23 |
size_t buf_len = 0, out_len = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (sprint_realloc_objid(&buf, &buf_len, &out_len, 1, theoid, len)) {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s [TRUNCATED]", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
free(buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_suboid(const char *token, const oid * theoid, size_t len)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
u_char *buf = NULL;
|
|
Packit |
fcad23 |
size_t buf_len = 0, out_len = 0;
|
|
Packit |
fcad23 |
int buf_overflow = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
netsnmp_sprint_realloc_objid(&buf, &buf_len, &out_len, 1,
|
|
Packit |
fcad23 |
&buf_overflow, theoid, len);
|
|
Packit |
fcad23 |
if(buf_overflow) {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s [TRUNCATED]", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
free(buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_var(const char *token, netsnmp_variable_list * var)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
u_char *buf = NULL;
|
|
Packit |
fcad23 |
size_t buf_len = 0, out_len = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (var == NULL || token == NULL) {
|
|
Packit |
fcad23 |
return;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (sprint_realloc_variable(&buf, &buf_len, &out_len, 1,
|
|
Packit |
fcad23 |
var->name, var->name_length, var)) {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s [TRUNCATED]", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
free(buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_oidrange(const char *token, const oid * theoid, size_t len,
|
|
Packit |
fcad23 |
size_t var_subid, oid range_ubound)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
u_char *buf = NULL;
|
|
Packit |
fcad23 |
size_t buf_len = 0, out_len = 0, i = 0;
|
|
Packit |
fcad23 |
int rc = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (var_subid == 0) {
|
|
Packit |
fcad23 |
rc = sprint_realloc_objid(&buf, &buf_len, &out_len, 1, theoid,
|
|
Packit |
fcad23 |
len);
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
char tmpbuf[128];
|
|
Packit |
fcad23 |
/* XXX - ? check for 0 == var_subid -1 ? */
|
|
Packit |
fcad23 |
rc = sprint_realloc_objid(&buf, &buf_len, &out_len, 1, theoid,
|
|
Packit |
fcad23 |
var_subid-1); /* Adjust for C's 0-based array indexing */
|
|
Packit |
fcad23 |
if (rc) {
|
|
Packit |
fcad23 |
sprintf(tmpbuf, ".%" NETSNMP_PRIo "u--%" NETSNMP_PRIo "u",
|
|
Packit |
fcad23 |
theoid[var_subid - 1], range_ubound);
|
|
Packit |
fcad23 |
rc = snmp_cstrcat(&buf, &buf_len, &out_len, 1, tmpbuf);
|
|
Packit |
fcad23 |
if (rc) {
|
|
Packit |
fcad23 |
for (i = var_subid; i < len; i++) {
|
|
Packit |
fcad23 |
sprintf(tmpbuf, ".%" NETSNMP_PRIo "u", theoid[i]);
|
|
Packit |
fcad23 |
if (!snmp_cstrcat(&buf, &buf_len, &out_len, 1, tmpbuf)) {
|
|
Packit |
fcad23 |
break;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s%s", buf, rc ? "" : " [TRUNCATED]");
|
|
Packit |
fcad23 |
free(buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_hex(const char *token, const u_char * thedata, size_t len)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
u_char *buf = NULL;
|
|
Packit |
fcad23 |
size_t buf_len = 0, out_len = 0;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (sprint_realloc_hexstring
|
|
Packit |
fcad23 |
(&buf, &buf_len, &out_len, 1, thedata, len)) {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token, "%s [TRUNCATED]", buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (buf != NULL) {
|
|
Packit |
fcad23 |
free(buf);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_hextli(const char *token, const u_char * thedata, size_t len)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
char buf[SPRINT_MAX_LEN], token2[SPRINT_MAX_LEN];
|
|
Packit |
fcad23 |
u_char *b3 = NULL;
|
|
Packit |
fcad23 |
size_t b3_len = 0, o3_len = 0;
|
|
Packit |
fcad23 |
int incr;
|
|
Packit |
fcad23 |
sprintf(token2, "dumpx_%s", token);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* XX tracing lines removed from this function DEBUGTRACE;
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
DEBUGIF(token2) {
|
|
Packit |
fcad23 |
for (incr = 16; len > 0; len -= incr, thedata += incr) {
|
|
Packit |
fcad23 |
if ((int) len < incr) {
|
|
Packit |
fcad23 |
incr = len;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* XXnext two lines were DEBUGPRINTINDENT(token);
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
sprintf(buf, "dumpx%s", token);
|
|
Packit |
fcad23 |
debugmsg(buf, "%s: %*s", token2, debug_indent_get(), "");
|
|
Packit |
fcad23 |
if (sprint_realloc_hexstring
|
|
Packit |
fcad23 |
(&b3, &b3_len, &o3_len, 1, thedata, incr)) {
|
|
Packit |
fcad23 |
if (b3 != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token2, "%s", b3);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
if (b3 != NULL) {
|
|
Packit |
fcad23 |
debugmsg(token2, "%s [TRUNCATED]", b3);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
o3_len = 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
if (b3 != NULL) {
|
|
Packit |
fcad23 |
free(b3);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsgtoken(const char *token, const char *format, ...)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
va_list debugargs;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
va_start(debugargs, format);
|
|
Packit |
fcad23 |
debugmsg(token, "%s: ", token);
|
|
Packit |
fcad23 |
va_end(debugargs);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_combo_nc(const char *token, const char *format, ...)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
va_list debugargs;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
va_start(debugargs, format);
|
|
Packit |
fcad23 |
snmp_log(debug_log_level, "%s: ", token);
|
|
Packit |
fcad23 |
snmp_vlog(debug_log_level, format, debugargs);
|
|
Packit |
fcad23 |
va_end(debugargs);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
/*
|
|
Packit |
fcad23 |
* for speed, these shouldn't be in default_storage space
|
|
Packit |
fcad23 |
*/
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
snmp_set_do_debugging(int val)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
dodebug = val;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_get_do_debugging(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return dodebug;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
snmp_debug_shutdown(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
int i;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
for (i = 0; i < debug_num_tokens; i++)
|
|
Packit |
fcad23 |
SNMP_FREE(dbg_tokens[i].token_name);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#else /* ! NETSNMP_NO_DEBUGGING */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int debug_indent_get(void) { return 0; }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
const char* debug_indent(void) { return ""; }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void debug_indent_add(int amount)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
NETSNMP_IMPORT void
|
|
Packit |
fcad23 |
debug_config_register_tokens(const char *configtoken, char *tokens);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_indent_reset(void)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_config_register_tokens(const char *configtoken, char *tokens)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#ifndef NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL
|
|
Packit |
fcad23 |
static void
|
|
Packit |
fcad23 |
debug_config_debug_log_level(const char *configtoken NETSNMP_ATTRIBUTE_UNUSED,
|
|
Packit |
fcad23 |
char *tokens NETSNMP_ATTRIBUTE_UNUSED)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
NETSNMP_IMPORT void
|
|
Packit |
fcad23 |
netsnmp_set_debug_log_level(int val NETSNMP_ATTRIBUTE_UNUSED)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
NETSNMP_IMPORT int
|
|
Packit |
fcad23 |
netsnmp_get_debug_log_level(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
#endif /* NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
NETSNMP_IMPORT void
|
|
Packit |
fcad23 |
debug_config_turn_on_debugging(const char *configtoken, char *line);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_config_turn_on_debugging(const char *configtokenu, char *line)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_register_tokens(const char *tokens)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_print_registered_tokens(void)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
debug_enable_token_logs (const char *token)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
debug_disable_token_logs (const char *token)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
debug_is_token_registered(const char *token)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return SNMPERR_GENERR;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg(const char *token, const char *format, ...)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void debugmsg_oid(const char *token, const oid * theoid, size_t len)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_suboid(const char *token, const oid * theoid, size_t len)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_var(const char *token, netsnmp_variable_list * var)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_oidrange(const char *token, const oid * theoid, size_t len,
|
|
Packit |
fcad23 |
size_t var_subid, oid range_ubound)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_hex(const char *token, const u_char * thedata, size_t len)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsg_hextli(const char *token, const u_char * thedata, size_t len)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debugmsgtoken(const char *token, const char *format, ...)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
debug_combo_nc(const char *token, const char *format, ...)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
snmp_set_do_debugging(int val)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
int
|
|
Packit |
fcad23 |
snmp_get_do_debugging(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
return 0;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
snmp_debug_shutdown(void)
|
|
Packit |
fcad23 |
{ }
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#endif /* NETSNMP_NO_DEBUGGING */
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
void
|
|
Packit |
fcad23 |
snmp_debug_init(void)
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
register_prenetsnmp_mib_handler("snmp", "doDebugging",
|
|
Packit |
fcad23 |
debug_config_turn_on_debugging, NULL,
|
|
Packit |
fcad23 |
"(1|0)");
|
|
Packit |
fcad23 |
register_prenetsnmp_mib_handler("snmp", "debugTokens",
|
|
Packit |
fcad23 |
debug_config_register_tokens, NULL,
|
|
Packit |
fcad23 |
"token[,token...]");
|
|
Packit |
fcad23 |
#ifndef NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL
|
|
Packit |
fcad23 |
register_prenetsnmp_mib_handler("snmp", "debugLogLevel",
|
|
Packit |
fcad23 |
debug_config_debug_log_level, NULL,
|
|
Packit |
fcad23 |
"(emerg|alert|crit|err|warning|notice|info|debug)");
|
|
Packit |
fcad23 |
#endif /* NETSNMP_DISABLE_DYNAMIC_LOG_LEVEL */
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|