mirror of
https://github.com/samba-team/samba.git
synced 2025-02-02 09:47:23 +03:00
debug: Add infrastructure for supporting multiple backends
Signed-off-by: Christof Schmitt <cs@samba.org> Reviewed-by: Amitay Isaacs <amitay@gmail.com>
This commit is contained in:
parent
364e8768d6
commit
289a7b41bc
152
lib/util/debug.c
152
lib/util/debug.c
@ -126,6 +126,152 @@ static int debug_level_to_priority(int level)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* -------------------------------------------------------------------------- **
|
||||
* Debug backends. When logging to DEBUG_FILE, send the log entries to
|
||||
* all active backends.
|
||||
*/
|
||||
|
||||
static struct debug_backend {
|
||||
const char *name;
|
||||
int log_level;
|
||||
int new_log_level;
|
||||
void (*reload)(bool enabled, bool prev_enabled, const char *prog_name);
|
||||
void (*log)(int msg_level, const char *msg, const char *msg_no_nl);
|
||||
} debug_backends[] = {
|
||||
};
|
||||
|
||||
static struct debug_backend *debug_find_backend(const char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
|
||||
if (strcmp(name, debug_backends[i].name) == 0) {
|
||||
return &debug_backends[i];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* parse "backend[:option][@loglevel]
|
||||
*/
|
||||
static void debug_backend_parse_token(char *tok)
|
||||
{
|
||||
char *backend_name_option, *backend_name,*backend_level, *saveptr;
|
||||
struct debug_backend *b;
|
||||
|
||||
/*
|
||||
* First parse into backend[:option] and loglevel
|
||||
*/
|
||||
backend_name_option = strtok_r(tok, "@\0", &saveptr);
|
||||
if (backend_name_option == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
backend_level = strtok_r(NULL, "\0", &saveptr);
|
||||
|
||||
/*
|
||||
* Now parse backend[:option]
|
||||
*/
|
||||
backend_name = strtok_r(backend_name_option, ":\0", &saveptr);
|
||||
if (backend_name == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* No backend is using the option yet.
|
||||
*/
|
||||
#if 0
|
||||
backend_option = strtok_r(NULL, "\0", &saveptr);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Find and update backend
|
||||
*/
|
||||
b = debug_find_backend(backend_name);
|
||||
if (b == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (backend_level == NULL) {
|
||||
b->new_log_level = MAX_DEBUG_LEVEL;
|
||||
} else {
|
||||
b->new_log_level = atoi(backend_level);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* parse "backend1[:option1][@loglevel1] backend2[option2][@loglevel2] ... "
|
||||
* and enable/disable backends accordingly
|
||||
*/
|
||||
static void debug_set_backends(const char *param)
|
||||
{
|
||||
size_t str_len = strlen(param);
|
||||
char str[str_len+1];
|
||||
char *tok, *saveptr;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* initialize new_log_level to detect backends that have been
|
||||
* disabled
|
||||
*/
|
||||
for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
|
||||
debug_backends[i].new_log_level = -1;
|
||||
}
|
||||
|
||||
memcpy(str, param, str_len + 1);
|
||||
|
||||
tok = strtok_r(str, LIST_SEP, &saveptr);
|
||||
if (tok == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
while (tok != NULL) {
|
||||
debug_backend_parse_token(tok);
|
||||
tok = strtok_r(NULL, LIST_SEP, &saveptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Let backends react to config changes
|
||||
*/
|
||||
for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
|
||||
struct debug_backend *b = &debug_backends[i];
|
||||
|
||||
if (b->reload) {
|
||||
bool enabled = b->new_log_level > -1;
|
||||
bool previously_enabled = b->log_level > -1;
|
||||
|
||||
b->reload(enabled, previously_enabled, state.prog_name);
|
||||
}
|
||||
b->log_level = b->new_log_level;
|
||||
}
|
||||
}
|
||||
|
||||
static void debug_backends_log(const char *msg, int msg_level)
|
||||
{
|
||||
char msg_no_nl[FORMAT_BUFR_SIZE];
|
||||
int i, len;
|
||||
|
||||
/*
|
||||
* Some backends already add an extra newline, so also provide
|
||||
* a buffer without the newline character.
|
||||
*/
|
||||
len = MIN(strlen(msg), FORMAT_BUFR_SIZE - 1);
|
||||
if (msg[len - 1] == '\n') {
|
||||
len--;
|
||||
}
|
||||
|
||||
memcpy(msg_no_nl, msg, len);
|
||||
msg_no_nl[len] = '\0';
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
|
||||
if (msg_level <= debug_backends[i].log_level) {
|
||||
debug_backends[i].log(msg_level, msg, msg_no_nl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- **
|
||||
* External variables.
|
||||
*/
|
||||
@ -464,6 +610,7 @@ Init debugging (one time stuff)
|
||||
|
||||
static void debug_init(void)
|
||||
{
|
||||
int i;
|
||||
const char **p;
|
||||
|
||||
if (state.initialized)
|
||||
@ -476,6 +623,11 @@ static void debug_init(void)
|
||||
for(p = default_classname_table; *p; p++) {
|
||||
debug_add_class(*p);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
|
||||
debug_backends[i].log_level = -1;
|
||||
debug_backends[i].new_log_level = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* This forces in some smb.conf derived values into the debug system.
|
||||
|
Loading…
x
Reference in New Issue
Block a user