#include "config.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include "librsync.h"
#include "trace.h"
#include "util.h"
rs_trace_fn_t *rs_trace_impl = rs_trace_stderr;
int rs_trace_level = RS_LOG_INFO;
#define MY_NAME "librsync"
static void rs_log_va(int level, char const *fn, char const *fmt, va_list va);
static const char *rs_severities[] = {
"EMERGENCY! ", "ALERT! ", "CRITICAL! ", "ERROR: ", "Warning: ",
"", "", ""
};
LIBRSYNC_EXPORT void rs_trace_to(rs_trace_fn_t *new_impl)
{
rs_trace_impl = new_impl;
}
LIBRSYNC_EXPORT void rs_trace_set_level(rs_loglevel level)
{
rs_trace_level = level;
}
static void rs_log_va(int flags, char const *fn, char const *fmt, va_list va)
{
int level = flags & RS_LOG_PRIMASK;
if (rs_trace_impl && level <= rs_trace_level) {
char buf[1000];
char full_buf[1040];
vsnprintf(buf, sizeof(buf), fmt, va);
if (flags & RS_LOG_NONAME || !(*fn)) {
snprintf(full_buf, sizeof(full_buf), "%s: %s%s\n", MY_NAME,
rs_severities[level], buf);
} else {
snprintf(full_buf, sizeof(full_buf), "%s: %s(%s) %s\n", MY_NAME,
rs_severities[level], fn, buf);
}
rs_trace_impl(level, full_buf);
}
}
void rs_log0(int level, char const *fn, char const *fmt, ...)
{
va_list va;
va_start(va, fmt);
rs_log_va(level, fn, fmt, va);
va_end(va);
}
LIBRSYNC_EXPORT void rs_trace_stderr(rs_loglevel UNUSED(level), char const *msg)
{
fputs(msg, stderr);
}
LIBRSYNC_EXPORT int rs_supports_trace(void)
{
#ifdef DO_RS_TRACE
return 1;
#else
return 0;
#endif
}