#include "config.h"
#endif
-#include "log.h"
#include "time_support.h"
// @todo the inclusion of server.h here is a layering violation
#include "server.h"
int debug_level = -1;
static FILE* log_output;
-static log_callback_t *log_callbacks = NULL;
+static struct log_callback *log_callbacks = NULL;
static long long last_time;
static long long current_time;
};
/* either forward the log to the listeners or store it for possible forwarding later */
-static void log_forward(const char *file, int line, const char *function, const char *string)
+static void log_forward(const char *file, unsigned line, const char *function, const char *string)
{
if (log_forward_count==0)
{
- log_callback_t *cb, *next;
+ struct log_callback *cb, *next;
cb = log_callbacks;
/* DANGER!!!! the log callback can remove itself!!!! */
while (cb)
}
-void log_printf(enum log_levels level, const char *file, int line, const char *function, const char *format, ...)
+void log_printf(enum log_levels level, const char *file, unsigned line, const char *function, const char *format, ...)
{
char *string;
va_list ap;
va_end(ap);
}
-void log_printf_lf(enum log_levels level, const char *file, int line, const char *function, const char *format, ...)
+void log_printf_lf(enum log_levels level, const char *file, unsigned line, const char *function, const char *format, ...)
{
char *string;
va_list ap;
*/
COMMAND_HANDLER(handle_debug_level_command)
{
- if (argc == 1)
+ if (CMD_ARGC == 1)
{
unsigned new_level;
- COMMAND_PARSE_NUMBER(uint, args[0], new_level);
+ COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], new_level);
debug_level = MIN(new_level, LOG_LVL_DEBUG);
}
- else if (argc > 1)
+ else if (CMD_ARGC > 1)
return ERROR_COMMAND_SYNTAX_ERROR;
if (debug_level >= LOG_LVL_DEBUG && server_use_pipes == 1)
}
}
- command_print(cmd_ctx, "debug_level: %i", debug_level);
+ command_print(CMD_CTX, "debug_level: %i", debug_level);
return ERROR_OK;
}
COMMAND_HANDLER(handle_log_output_command)
{
- if (argc == 1)
+ if (CMD_ARGC == 1)
{
- FILE* file = fopen(args[0], "w");
+ FILE* file = fopen(CMD_ARGV[0], "w");
if (file)
{
return ERROR_OK;
}
-int log_register_commands(struct command_context_s *cmd_ctx)
-{
- start = timeval_ms();
- register_command(cmd_ctx, NULL, "log_output", handle_log_output_command,
- COMMAND_ANY, "redirect logging to <file> (default: stderr)");
- register_command(cmd_ctx, NULL, "debug_level", handle_debug_level_command,
- COMMAND_ANY, "adjust debug level <0-3>");
+static struct command_registration log_command_handlers[] = {
+ {
+ .name = "log_output",
+ .handler = &handle_log_output_command,
+ .mode = COMMAND_ANY,
+ .help = "redirect logging to a file (default: stderr)",
+ .usage = "<file_name>",
+ },
+ {
+ .name = "debug_level",
+ .handler = &handle_debug_level_command,
+ .mode = COMMAND_ANY,
+ .help = "sets the verbosity level of debugging output",
+ .usage = "<level:0-3>",
+ },
+ COMMAND_REGISTRATION_DONE
+};
- return ERROR_OK;
+int log_register_commands(struct command_context *cmd_ctx)
+{
+ return register_commands(cmd_ctx, NULL, log_command_handlers);
}
-int log_init(struct command_context_s *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_s *cmd_ctx, FILE *output)
+int set_log_output(struct command_context *cmd_ctx, FILE *output)
{
log_output = output;
return ERROR_OK;
/* add/remove log callback handler */
int log_add_callback(log_callback_fn fn, void *priv)
{
- log_callback_t *cb;
+ struct log_callback *cb;
/* prevent the same callback to be registered more than once, just for sure */
for (cb = log_callbacks; cb; cb = cb->next)
}
/* alloc memory, it is safe just to return in case of an error, no need for the caller to check this */
- if ((cb = malloc(sizeof(log_callback_t))) == NULL)
+ if ((cb = malloc(sizeof(struct log_callback))) == NULL)
return ERROR_BUF_TOO_SMALL;
/* add item to the beginning of the linked list */
int log_remove_callback(log_callback_fn fn, void *priv)
{
- log_callback_t *cb, **p;
+ struct log_callback *cb, **p;
for (p = &log_callbacks; (cb = *p); p = &(*p)->next)
{
/* return allocated string w/printf() result */
char *alloc_vprintf(const char *fmt, va_list ap)
{
- /* no buffer at the beginning, force realloc to do the job */
- char *string = NULL;
-
- /* start with buffer size suitable for typical messages */
- int size = 128;
-
- for (;;)
- {
- char *t = string;
- va_list ap_copy;
- int ret;
- string = realloc(string, size);
- if (string == NULL)
- {
- if (t != NULL)
- free(t);
- return NULL;
- }
+ va_list ap_copy;
+ int len;
+ char *string;
- va_copy(ap_copy, ap);
+ /* determine the length of the buffer needed */
+ va_copy(ap_copy, ap);
+ len = vsnprintf(NULL, 0, fmt, ap_copy);
+ va_end(ap_copy);
- ret = vsnprintf(string, size, fmt, ap_copy);
- /* NB! The result of the vsnprintf() might be an *EMPTY* string! */
- if ((ret >= 0) && ((ret + 1) < size))
- break;
+ /* allocate and make room for terminating zero. */
+ /* FIXME: The old version always allocated at least one byte extra and
+ * other code depend on that. They should be probably be fixed, but for
+ * now reserve the extra byte. */
+ string = malloc(len + 2);
+ if (string == NULL)
+ return NULL;
- /* there was just enough or not enough space, allocate more in the next round */
- size *= 2; /* double the buffer size */
- }
+ /* do the real work */
+ vsnprintf(string, len + 1, fmt, ap);
- /* the returned buffer is by principle guaranteed to be at least one character longer */
return string;
}
}
/* if we sleep for extended periods of time, we must invoke keep_alive() intermittantly */
-void alive_sleep(int ms)
+void alive_sleep(uint64_t ms)
{
- int i;
- int napTime = 10;
- for (i = 0; i < ms; i += napTime)
+ uint64_t napTime = 10;
+ for (uint64_t i = 0; i < ms; i += napTime)
{
- int sleep_a_bit = ms-i;
+ uint64_t sleep_a_bit = ms - i;
if (sleep_a_bit > napTime)
- {
sleep_a_bit = napTime;
- }
- usleep(sleep_a_bit*1000);
+
+ usleep(sleep_a_bit * 1000);
keep_alive();
}
}
-void busy_sleep(int ms)
+void busy_sleep(uint64_t ms)
{
- long long then;
- then = timeval_ms();
- while ((timeval_ms()-then) < ms)
+ uint64_t then = timeval_ms();
+ while (timeval_ms() - then < ms)
{
/* busy wait */
}