|
Packit |
9f0df5 |
/*
|
|
Packit |
9f0df5 |
debug.c: log (or not) messages
|
|
Packit |
9f0df5 |
Copyright (C) 2003-2011 Ludovic Rousseau
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
This library is free software; you can redistribute it and/or
|
|
Packit |
9f0df5 |
modify it under the terms of the GNU Lesser General Public
|
|
Packit |
9f0df5 |
License as published by the Free Software Foundation; either
|
|
Packit |
9f0df5 |
version 2.1 of the License, or (at your option) any later version.
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
This library is distributed in the hope that it will be useful,
|
|
Packit |
9f0df5 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
9f0df5 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
9f0df5 |
Lesser General Public License for more details.
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
9f0df5 |
along with this library; if not, write to the Free Software Foundation,
|
|
Packit |
9f0df5 |
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
Packit |
9f0df5 |
*/
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#include <config.h>
|
|
Packit |
9f0df5 |
#include "misc.h"
|
|
Packit |
9f0df5 |
#include "debug.h"
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#include <stdarg.h>
|
|
Packit |
9f0df5 |
#include <stdio.h>
|
|
Packit |
9f0df5 |
#include <string.h>
|
|
Packit |
9f0df5 |
#include <sys/time.h>
|
|
Packit |
9f0df5 |
#include <stdlib.h>
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#ifdef USE_SYSLOG
|
|
Packit |
9f0df5 |
#include <syslog.h>
|
|
Packit |
9f0df5 |
#endif
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#include "strlcpycat.h"
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#undef LOG_TO_STDERR
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#ifdef LOG_TO_STDERR
|
|
Packit |
9f0df5 |
#define LOG_STREAM stderr
|
|
Packit |
9f0df5 |
#else
|
|
Packit |
9f0df5 |
#define LOG_STREAM stdout
|
|
Packit |
9f0df5 |
#endif
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
void log_msg(const int priority, const char *fmt, ...)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
char debug_buffer[3 * 80]; /* up to 3 lines of 80 characters */
|
|
Packit |
9f0df5 |
va_list argptr;
|
|
Packit |
9f0df5 |
static struct timeval last_time = { 0, 0 };
|
|
Packit |
9f0df5 |
struct timeval new_time = { 0, 0 };
|
|
Packit |
9f0df5 |
struct timeval tmp;
|
|
Packit |
9f0df5 |
int delta;
|
|
Packit |
9f0df5 |
#ifdef USE_SYSLOG
|
|
Packit |
9f0df5 |
int syslog_level;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
switch(priority)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
case PCSC_LOG_CRITICAL:
|
|
Packit |
9f0df5 |
syslog_level = LOG_CRIT;
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
case PCSC_LOG_ERROR:
|
|
Packit |
9f0df5 |
syslog_level = LOG_ERR;
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
case PCSC_LOG_INFO:
|
|
Packit |
9f0df5 |
syslog_level = LOG_INFO;
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
default:
|
|
Packit |
9f0df5 |
syslog_level = LOG_DEBUG;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
#else
|
|
Packit |
9f0df5 |
const char *color_pfx = "", *color_sfx = "";
|
|
Packit |
9f0df5 |
const char *time_pfx = "", *time_sfx = "";
|
|
Packit |
9f0df5 |
static int initialized = 0;
|
|
Packit |
9f0df5 |
static int LogDoColor = 0;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
if (!initialized)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
char *term;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
initialized = 1;
|
|
Packit |
9f0df5 |
term = getenv("TERM");
|
|
Packit |
9f0df5 |
if (term)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
const char *terms[] = { "linux", "xterm", "xterm-color", "Eterm", "rxvt", "rxvt-unicode", "xterm-256color" };
|
|
Packit |
9f0df5 |
unsigned int i;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* for each known color terminal */
|
|
Packit |
9f0df5 |
for (i = 0; i < COUNT_OF(terms); i++)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
/* we found a supported term? */
|
|
Packit |
9f0df5 |
if (0 == strcmp(terms[i], term))
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
LogDoColor = 1;
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
if (LogDoColor)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
color_sfx = "\33[0m";
|
|
Packit |
9f0df5 |
time_sfx = color_sfx;
|
|
Packit |
9f0df5 |
time_pfx = "\33[36m"; /* Cyan */
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
switch (priority)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
case PCSC_LOG_CRITICAL:
|
|
Packit |
9f0df5 |
color_pfx = "\33[01;31m"; /* bright + Red */
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
case PCSC_LOG_ERROR:
|
|
Packit |
9f0df5 |
color_pfx = "\33[35m"; /* Magenta */
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
case PCSC_LOG_INFO:
|
|
Packit |
9f0df5 |
color_pfx = "\33[34m"; /* Blue */
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
case PCSC_LOG_DEBUG:
|
|
Packit |
9f0df5 |
color_pfx = ""; /* normal (black) */
|
|
Packit |
9f0df5 |
color_sfx = "";
|
|
Packit |
9f0df5 |
break;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
#endif
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
gettimeofday(&new_time, NULL);
|
|
Packit |
9f0df5 |
if (0 == last_time.tv_sec)
|
|
Packit |
9f0df5 |
last_time = new_time;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
tmp.tv_sec = new_time.tv_sec - last_time.tv_sec;
|
|
Packit |
9f0df5 |
tmp.tv_usec = new_time.tv_usec - last_time.tv_usec;
|
|
Packit |
9f0df5 |
if (tmp.tv_usec < 0)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
tmp.tv_sec--;
|
|
Packit |
9f0df5 |
tmp.tv_usec += 1000000;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
if (tmp.tv_sec < 100)
|
|
Packit |
9f0df5 |
delta = tmp.tv_sec * 1000000 + tmp.tv_usec;
|
|
Packit |
9f0df5 |
else
|
|
Packit |
9f0df5 |
delta = 99999999;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
last_time = new_time;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
va_start(argptr, fmt);
|
|
Packit |
9f0df5 |
(void)vsnprintf(debug_buffer, sizeof debug_buffer, fmt, argptr);
|
|
Packit |
9f0df5 |
va_end(argptr);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#ifdef USE_SYSLOG
|
|
Packit |
9f0df5 |
syslog(syslog_level, "%.8d %s", delta, debug_buffer);
|
|
Packit |
9f0df5 |
#else
|
|
Packit |
9f0df5 |
(void)fprintf(LOG_STREAM, "%s%.8d%s %s%s%s\n", time_pfx, delta, time_sfx,
|
|
Packit |
9f0df5 |
color_pfx, debug_buffer, color_sfx);
|
|
Packit |
9f0df5 |
fflush(LOG_STREAM);
|
|
Packit |
9f0df5 |
#endif
|
|
Packit |
9f0df5 |
} /* log_msg */
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
void log_xxd(const int priority, const char *msg, const unsigned char *buffer,
|
|
Packit |
9f0df5 |
const int len)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
int i;
|
|
Packit |
9f0df5 |
char *c, debug_buffer[len*3 + strlen(msg) +1];
|
|
Packit |
9f0df5 |
size_t l;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
(void)priority;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
l = strlcpy(debug_buffer, msg, sizeof debug_buffer);
|
|
Packit |
9f0df5 |
c = debug_buffer + l;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
for (i = 0; i < len; ++i)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
/* 2 hex characters, 1 space, 1 NUL : total 4 characters */
|
|
Packit |
9f0df5 |
(void)snprintf(c, 4, "%02X ", buffer[i]);
|
|
Packit |
9f0df5 |
c += 3;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#ifdef USE_SYSLOG
|
|
Packit |
9f0df5 |
syslog(LOG_DEBUG, "%s", debug_buffer);
|
|
Packit |
9f0df5 |
#else
|
|
Packit |
9f0df5 |
(void)fprintf(LOG_STREAM, "%s\n", debug_buffer);
|
|
Packit |
9f0df5 |
fflush(LOG_STREAM);
|
|
Packit |
9f0df5 |
#endif
|
|
Packit |
9f0df5 |
} /* log_xxd */
|