You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
5.3 KiB

/*
* $Id: debug.c,v 1.16 2006/10/12 14:21:22 desrod Exp $
*
* debug.c: Pilot-Link debug configuration and debug logging
*
* Copyright (c) 1996, Anonymous
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
* General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include "pi-debug.h"
#include "pi-threadsafe.h"
static int debug_types = PI_DBG_NONE;
static int debug_level = PI_DBG_LVL_NONE;
static FILE *debug_file = NULL;
static PI_MUTEX_DEFINE(logfile_mutex);
/***********************************************************************
*
* Function: pi_debug_get_types
*
* Summary: fetches the current debug types configuration
*
* Parameters: void
*
* Returns: debug_types
*
***********************************************************************/
int
pi_debug_get_types (void)
{
return debug_types;
}
/***********************************************************************
*
* Function: pi_debug_set_types
*
* Summary: sets the debug_types configuration
*
* Parameters: types
*
* Returns: void
*
***********************************************************************/
void
pi_debug_set_types (int types)
{
debug_types = types;
}
/***********************************************************************
*
* Function: pi_debug_get_types
*
* Summary: fetches the current debug level configuration
*
* Parameters: void
*
* Returns: debug_level
*
***********************************************************************/
int
pi_debug_get_level (void)
{
return debug_level;
}
/***********************************************************************
*
* Function: pi_debug_set_level
*
* Summary: sets the debug_level configuration
*
* Parameters: level
*
* Returns: void
*
***********************************************************************/
void
pi_debug_set_level (int level)
{
pi_mutex_lock(&logfile_mutex);
debug_level = level;
pi_mutex_unlock(&logfile_mutex);
}
/***********************************************************************
*
* Function: pi_debug_set_file
*
* Summary: sets the debug log file configuration
*
* Parameters: char* to logfile name
*
* Returns: void
*
***********************************************************************/
void
pi_debug_set_file (const char *path)
{
pi_mutex_lock(&logfile_mutex);
if (debug_file != NULL && debug_file != stderr)
fclose (debug_file);
debug_file = fopen (path, "a");
if (debug_file == NULL)
debug_file = stderr;
pi_mutex_unlock(&logfile_mutex);
}
/***********************************************************************
*
* Function: pi_log
*
* Summary: logs a debug message
*
* Parameters: type, level, format, ...
*
* Returns: void
*
***********************************************************************/
void
pi_log (int type, int level, const char *format, ...)
{
va_list ap;
if (!(debug_types & type) && type != PI_DBG_ALL)
return;
if (debug_level < level)
return;
pi_mutex_lock(&logfile_mutex);
if (debug_file == NULL)
debug_file = stderr;
#if HAVE_PTHREAD
fprintf(debug_file, "[thread 0x%08lx] ", pi_thread_id());
#endif
va_start(ap, format);
vfprintf(debug_file, format, ap);
va_end(ap);
fflush(debug_file);
pi_mutex_unlock(&logfile_mutex);
}
void
pi_dumpline(const char *buf, size_t len, unsigned int addr)
{
unsigned int i;
int offset;
char line[256];
offset = sprintf(line, " %.4x ", addr);
for (i = 0; i < 16; i++) {
if (i < len)
offset += sprintf(line+offset, "%.2x ",
0xff & (unsigned int) buf[i]);
else {
strcpy(line+offset, " ");
offset += 3;
}
}
strcpy(line+offset, " ");
offset += 2;
for (i = 0; i < len; i++) {
if (buf[i] == '%') {
/* since we're going through pi_log, we need to
* properly escape % characters
*/
line[offset++] = '%';
line[offset++] = '%';
} else if (isprint(buf[i]) && buf[i] >= 32 && buf[i] <= 126)
line[offset++] = buf[i];
else
line[offset++] = '.';
}
strcpy(line+offset,"\n");
LOG((PI_DBG_ALL, PI_DBG_LVL_NONE, line));
}
void
dumpline(const char *buf, size_t len, unsigned int addr)
{
/* this function will be removed in 0.13. Use pi_dumpline() instead. */
pi_dumpline(buf, len, addr);
}
void
pi_dumpdata(const char *buf, size_t len)
{
unsigned int i;
for (i = 0; i < len; i += 16)
pi_dumpline(buf + i, ((len - i) > 16) ? 16 : len - i, i);
}
void
dumpdata(const char *buf, size_t len)
{
/* this function will be removed in 0.13. Use pi_dumpdata() instead */
pi_dumpdata(buf, len);
}
/* vi: set ts=8 sw=4 sts=4 noexpandtab: cin */
/* ex: set tabstop=4 expandtab: */
/* Local Variables: */
/* indent-tabs-mode: t */
/* c-basic-offset: 8 */
/* End: */