freewtp/lib/logging.c

213 lines
4.8 KiB
C

#include <ctype.h>
#include "capwap.h"
#include "logging.h"
#ifdef CAPWAP_MULTITHREADING_ENABLE
#include "lock.h"
static capwap_lock_t l_loglock;
#endif
/* */
static int logginglevel = LOG_NONE;
static int loggingoutputstdout = 0;
static int loggingoutputstderr = 0;
/* */
static char logginglevelid[] = { 'N', 'F', 'E', 'W', 'I', 'D' };
/* */
static void prefix_logging(int level, char* buffer) {
time_t timenow;
struct tm* tmnow;
#ifdef CAPWAP_MULTITHREADING_ENABLE
pthread_t threadid = pthread_self();
#endif
time(&timenow);
tmnow = localtime(&timenow);
#ifdef CAPWAP_MULTITHREADING_ENABLE
sprintf(buffer, "[%02d/%02d/%04d %02d:%02d:%02d] [%08x] <%c> ", tmnow->tm_mday, tmnow->tm_mon + 1, tmnow->tm_year + 1900, tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec, (unsigned int)threadid, logginglevelid[level]);
#else
sprintf(buffer, "[%02d/%02d/%04d %02d:%02d:%02d] <%c> ", tmnow->tm_mday, tmnow->tm_mon + 1, tmnow->tm_year + 1900, tmnow->tm_hour, tmnow->tm_min, tmnow->tm_sec, logginglevelid[level]);
#endif
}
/* */
void capwap_logging_init() {
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_init(&l_loglock);
#endif
#ifdef LOG_TO_SYSLOG
openlog("capwap", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_DAEMON);
#endif
}
/* */
void capwap_logging_close() {
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_destroy(&l_loglock);
#endif
#ifdef LOG_TO_SYSLOG
closelog();
#endif
}
/* */
void capwap_logging_verboselevel(int level) {
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_enter(&l_loglock);
#endif
logginglevel = level;
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_exit(&l_loglock);
#endif
}
/* */
void capwap_logging_disable_allinterface() {
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_enter(&l_loglock);
#endif
loggingoutputstdout = 0;
loggingoutputstderr = 0;
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_exit(&l_loglock);
#endif
}
/* */
void capwap_logging_enable_console(int error) {
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_enter(&l_loglock);
#endif
/* Enable only one of stdout/stderr */
loggingoutputstdout = (error ? 0 : 1);
loggingoutputstderr = !loggingoutputstdout;
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_exit(&l_loglock);
#endif
}
/* */
void capwap_logging_disable_console(void) {
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_enter(&l_loglock);
#endif
loggingoutputstdout = 0;
loggingoutputstderr = 0;
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_exit(&l_loglock);
#endif
}
/* */
#ifdef ENABLE_LOGGING
void __log_syslog(int level, const char* format, ...)
{
int errsv = errno;
va_list args;
va_start(args, format);
vsyslog(level, format, args);
va_end(args);
errno = errsv;
}
void __log_printf(int level, const char* format, ...)
{
int errsv = errno;
va_list args;
char prefix[256];
va_start(args, format);
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_enter(&l_loglock);
#endif
if (level <= logginglevel) {
prefix_logging(level, prefix);
if (loggingoutputstdout || loggingoutputstderr) {
FILE* output = (loggingoutputstdout ? stdout : stderr);
fprintf(output, "%s", prefix);
vfprintf(output, format, args);
fprintf(output, "\n");
fflush(output);
}
}
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_exit(&l_loglock);
#endif
va_end(args);
errno = errsv;
}
void __log_hexdump(int level, const char *title, const unsigned char *data, size_t len)
{
int errsv = errno;
char prefix[256];
if (level > logginglevel)
return;
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_enter(&l_loglock);
#endif
prefix_logging(level, prefix);
if (loggingoutputstdout || loggingoutputstderr) {
FILE* output = (loggingoutputstdout ? stdout : stderr);
const uint8_t *pos = data;
fprintf(output, "%s%s - hexdump(len=%zd):\n", prefix, title, len);
while (len) {
size_t llen;
int i;
llen = len > 16 ? 16 : len;
fprintf(output, "%s ", prefix);
for (i = 0; i < llen; i++)
fprintf(output, " %02x", pos[i]);
for (i = llen; i < 16; i++)
fprintf(output, " ");
fprintf(output, " ");
for (i = 0; i < llen; i++) {
if (isprint(pos[i]))
fprintf(output, "%c", pos[i]);
else
fprintf(output, ".");
}
for (i = llen; i < 16; i++)
fprintf(output, " ");
fprintf(output, "\n");
pos += llen;
len -= llen;
}
fflush(output);
}
#ifdef CAPWAP_MULTITHREADING_ENABLE
capwap_lock_exit(&l_loglock);
#endif
errno = errsv;
}
#endif