/*
Copyright (C) 1999-2004 IC & S dbmail@ic-s.nl
Copyright (c) 2004-2006 NFG Net Facilities Group BV support@nfg.nl
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: debug.c 2207 2006-07-24 15:35:35Z paul $
*
* Debugging and memory checking functions */
#include "dbmail.h"
/* the debug variables */
static trace_t TRACE_SYSLOG = TRACE_ERROR; /* default: errors, warnings, fatals */
static trace_t TRACE_STDERR = TRACE_FATAL; /* default: fatal errors only */
/*
* configure the debug settings
*/
void configure_debug(trace_t trace_syslog, trace_t trace_stderr)
{
TRACE_SYSLOG = trace_syslog;
TRACE_STDERR = trace_stderr;
}
void func_memtst(const char *filename, int line, int tst)
{
if (tst != 0)
trace(TRACE_FATAL,
"func_memtst(): fatal: %s:%d Memory error, result should not be NULL)",
filename, line);
}
/* Make sure that these match trace_t. */
static const char * const trace_text[] = {
"FATAL",
"Error",
"Warning",
"Message",
"Info",
"Debug"
};
static const char * trace_to_text(trace_t level)
{
return trace_text[level];
}
/* Call me like this:
*
* TRACE(TRACE_ERROR, "Something happened with error code [%d]", resultvar);
*
* Please #define THIS_MODULE "mymodule" at the top of each file.
* Arguments for __FILE__ and __func__ are added by the TRACE macro.
*
* trace() and TRACE() are macros in debug.h
*
*/
void newtrace(trace_t level, const char * module,
const char * file, const char * function,
char *formatstring, ...)
{
va_list argp;
gchar *message;
size_t l;
va_start(argp, formatstring);
/* TODO: make use of the module, file, function arguments.
if (TRACE_SYSLOG >= 5) {
// If the global trace level is really high
formatstring_verbose = g_strdup_printf("from %s, %s, %s: %s",
module, file, function, formatstring);
} else {
// If the global trace level is really low
formatstring = g_strdup_printf("%s: %s",
module, formatstring);
}
*/
message = g_strdup_vprintf(formatstring, argp);
va_end(argp);
l = strlen(message);
if (level <= TRACE_STDERR) {
fprintf(stderr, "%s %s", trace_to_text(level), message);
if (message[l] != '\n')
fprintf(stderr, "\n");
fflush(stderr);
}
if (level <= TRACE_SYSLOG) {
if (message[l] == '\n')
message[l] = '\0';
if (level <= TRACE_WARNING) {
/* set LOG_ALERT at warnings */
syslog(LOG_ALERT, "%s %s", trace_to_text(level), message);
} else
syslog(LOG_NOTICE, "%s %s", trace_to_text(level), message);
}
g_free(message);
/* Bail out on fatal errors. */
if (level == TRACE_FATAL)
exit(EX_TEMPFAIL);
}
syntax highlighted by Code2HTML, v. 0.9.1