static FILE* log_output;
static log_callback_t *log_callbacks = NULL;
-static time_t start;
+static long long start;
static char *log_strings[5] =
{
if (debug_level >= LOG_DEBUG)
{
/* print with count and time information */
- int t=(int)(time(NULL)-start);
+ int t=(int)(timeval_ms()-start);
fprintf(log_output, "%s %d %d %s:%d %s(): %s", log_strings[level+1], count, t, file, line, function, string);
}
else
va_list ap;
va_start(ap, format);
- string = alloc_printf(format, ap);
+ string = alloc_vprintf(format, ap);
if (string != NULL)
{
log_puts(level, file, line, function, string);
va_list ap;
va_start(ap, format);
- string = alloc_printf(format, ap);
+ string = alloc_vprintf(format, ap);
if (string != NULL)
{
- strcat(string, "\n"); /* alloc_printf guaranteed the buffer to be at least one char longer */
+ strcat(string, "\n"); /* alloc_vprintf guaranteed the buffer to be at least one char longer */
log_puts(level, file, line, function, string);
free(string);
}
int log_register_commands(struct command_context_s *cmd_ctx)
{
- start = time(NULL);
+ 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,
}
/* return allocated string w/printf() result */
-char *alloc_printf(const char *fmt, va_list ap)
+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 minimal length to exercise all the code paths */
- int size = 1;
+ /* start with buffer size suitable for typical messages */
+ int size = 128;
for (;;)
{
- size *= 2; /* double the buffer size */
-
- char *t = string;
- string = realloc(string, size);
- if (string == NULL)
- {
- if (t != NULL)
- free(t);
- return NULL;
- }
+ char *t = string;
+ string = realloc(string, size);
+ if (string == NULL)
+ {
+ if (t != NULL)
+ free(t);
+ return NULL;
+ }
- va_list ap_copy;
- va_copy(ap_copy, ap);
+ va_list ap_copy;
+ va_copy(ap_copy, ap);
int ret;
ret = vsnprintf(string, size, fmt, ap_copy);
break;
/* there was just enough or not enough space, allocate more in the next round */
+ size *= 2; /* double the buffer size */
}
/* the returned buffer is by principle guaranteed to be at least one character longer */
return string;
}
+
+char *alloc_printf(const char *format, ...)
+{
+ char *string;
+ va_list ap;
+ va_start(ap, format);
+ string = alloc_vprintf(format, ap);
+ va_end(ap);
+ return string;
+}