Blame src/debug.c

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 */