X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fhelper%2Flog.c;h=b6fab016962e0941b0e451557379f89c1849ae5a;hb=690e054a3d8c8847432c31224743b0f9dbd0f1bf;hp=3799fb322b91cf00a9120d51c27ea64170edc682;hpb=29772ec37293e7fbc6f11cc8a73b5d4d820707c7;p=openocd diff --git a/src/helper/log.c b/src/helper/log.c index 3799fb32..b6fab016 100644 --- a/src/helper/log.c +++ b/src/helper/log.c @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * - * Copyright (C) 2007,2008 Øyvind Harboe * + * Copyright (C) 2007-2010 Øyvind Harboe * * oyvind.harboe@zylin.com * * * * Copyright (C) 2008 by Spencer Oliver * @@ -29,7 +29,7 @@ #include "time_support.h" // @todo the inclusion of server.h here is a layering violation -#include "server.h" +#include #include @@ -114,44 +114,6 @@ static void log_forward(const char *file, unsigned line, const char *function, c } } -void log_try(void) -{ - log_forward_count++; -} - -void log_catch(void) -{ - assert(log_forward_count>0); - log_forward_count--; -} - -void log_rethrow(void) -{ - log_catch(); - if (log_forward_count==0) - { - struct store_log_forward *log; - - log = log_head; - while (log != NULL) - { - log_forward(log->file, log->line, log->function, log->string); - - struct store_log_forward *t=log; - log = log->next; - - free((void *)t->file); - free((void *)t->function); - free((void *)t->string); - free(t); - - } - - log_head = NULL; - } -} - - /* The log_puts() serves to somewhat different goals: * * - logging @@ -177,7 +139,7 @@ static void log_puts(enum log_levels level, const char *file, int line, const ch if (f != NULL) file = f + 1; - if (strchr(string, '\n') != NULL) + if (strlen(string) > 0) { if (debug_level >= LOG_LVL_DEBUG) { @@ -197,21 +159,16 @@ static void log_puts(enum log_levels level, const char *file, int line, const ch #endif string); } - else if (server_use_pipes == 0) + else { /* if we are using gdb through pipes then we do not want any output * to the pipe otherwise we get repeated strings */ - if (strcmp(string, "\n") != 0) - { - /* print human readable output - but skip empty lines */ - fprintf(log_output, "%s%s", - (level > LOG_LVL_USER)?log_strings[level + 1]:"", string); - } + fprintf(log_output, "%s%s", + (level > LOG_LVL_USER)?log_strings[level + 1]:"", string); } } else { - /* only entire lines are logged. Otherwise it's - * single chars intended for the log callbacks. */ + /* Empty strings are sent to log callbacks to keep e.g. gdbserver alive, here we do nothing. */ } fflush(log_output); @@ -284,18 +241,6 @@ COMMAND_HANDLER(handle_debug_level_command) else if (CMD_ARGC > 1) return ERROR_COMMAND_SYNTAX_ERROR; - if (debug_level >= LOG_LVL_DEBUG && server_use_pipes == 1) - { - /* if we are enabling debug info then we need to write to a log file - * otherwise the pipe will get full and cause issues with gdb */ - FILE* file = fopen("openocd.log", "w"); - if (file) - { - log_output = file; - LOG_WARNING("enabling log output as we are using pipes"); - } - } - command_print(CMD_CTX, "debug_level: %i", debug_level); return ERROR_OK; @@ -319,42 +264,52 @@ COMMAND_HANDLER(handle_log_output_command) static struct command_registration log_command_handlers[] = { { .name = "log_output", - .handler = &handle_log_output_command, + .handler = handle_log_output_command, .mode = COMMAND_ANY, .help = "redirect logging to a file (default: stderr)", - .usage = "", + .usage = "file_name", }, { .name = "debug_level", - .handler = &handle_debug_level_command, + .handler = handle_debug_level_command, .mode = COMMAND_ANY, - .help = "sets the verbosity level of debugging output", - .usage = "", + .help = "Sets the verbosity level of debugging output. " + "0 shows errors only; 1 adds warnings; " + "2 (default) adds other info; 3 adds debugging.", + .usage = "number", }, COMMAND_REGISTRATION_DONE }; int log_register_commands(struct command_context *cmd_ctx) { - start = timeval_ms(); - return register_commands(cmd_ctx, NULL, log_command_handlers); } -int log_init(struct command_context *cmd_ctx) +void log_init(void) { - /* set defaults for daemon configuration, if not set by cmdline or cfgfile */ + /* set defaults for daemon configuration, + * if not set by cmdline or cfgfile */ if (debug_level == -1) debug_level = LOG_LVL_INFO; - if (log_output == NULL) + char *debug_env = getenv("OPENOCD_DEBUG_LEVEL"); + if (NULL != debug_env) { - log_output = stderr; + int value; + int retval = parse_int(debug_env, &value); + if (ERROR_OK == retval && + debug_level >= LOG_LVL_SILENT && + debug_level <= LOG_LVL_DEBUG) + { + debug_level = value; + } } - start = last_time = timeval_ms(); + if (log_output == NULL) + log_output = stderr; - return ERROR_OK; + start = last_time = timeval_ms(); } int set_log_output(struct command_context *cmd_ctx, FILE *output)