mirror of
https://github.com/ChronosX88/netsukuku.git
synced 2025-02-16 20:26:28 +00:00
* Style varied wildly between files and within files. * find . -name "*.c" -exec indent {} -ut -ts4 -kr -psl \; * find . -name "*.h" -exec indent {} -ut -ts4 -kr -psl \;
194 lines
3.7 KiB
C
194 lines
3.7 KiB
C
/* This file is part of Netsukuku
|
|
* (c) Copyright 2005 Andrea Lo Pumo aka AlpT <alpt@freaknet.org>
|
|
*
|
|
* This source code 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 source code 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.
|
|
* Please refer to the GNU Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Public License along with
|
|
* this source code; if not, write to:
|
|
* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <syslog.h>
|
|
#include <errno.h>
|
|
|
|
#ifdef DEBUG
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
#include "log.h"
|
|
|
|
char *__argv0;
|
|
int dbg_lvl;
|
|
int log_to_stderr;
|
|
static int log_facility = LOG_DAEMON;
|
|
int log_file_opened = 0;
|
|
FILE *log_file, *log_fd;
|
|
|
|
void
|
|
log_init(char *prog, int dbg, int log_stderr)
|
|
{
|
|
__argv0 = prog;
|
|
dbg_lvl = dbg;
|
|
log_to_stderr = log_stderr;
|
|
if (log_stderr)
|
|
log_fd = stderr;
|
|
if (!log_file_opened)
|
|
log_file = 0;
|
|
|
|
if (!log_to_stderr)
|
|
openlog(__argv0, dbg ? LOG_PID : 0, log_facility);
|
|
}
|
|
|
|
/*
|
|
* log_to_file
|
|
*
|
|
* If `filename' is not null, it is opened and set as the logfile.
|
|
* When `filename' is null, it just updates the `log_fd' global variable.
|
|
*
|
|
* On errors it returns -1;
|
|
*/
|
|
int
|
|
log_to_file(char *filename)
|
|
{
|
|
if (!filename) {
|
|
if (log_file)
|
|
log_fd = log_file;
|
|
else
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
if (!(log_file = fopen(filename, "w"))) {
|
|
log_fd = stderr;
|
|
error("Cannot open the \"%s\" logfile: %s",
|
|
filename, strerror(errno));
|
|
return -1;
|
|
}
|
|
|
|
log_fd = log_file;
|
|
log_file_opened = 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
close_log_file(void)
|
|
{
|
|
if (log_file) {
|
|
fflush(log_file);
|
|
fclose(log_file);
|
|
}
|
|
}
|
|
|
|
/* Life is fatal! */
|
|
void
|
|
fatal(const char *fmt, ...)
|
|
{
|
|
char str[strlen(fmt) + 3];
|
|
va_list args;
|
|
|
|
if (fmt) {
|
|
str[0] = '!';
|
|
str[1] = ' ';
|
|
strncpy(str + 2, fmt, strlen(fmt));
|
|
str[strlen(fmt) + 2] = 0;
|
|
|
|
va_start(args, fmt);
|
|
print_log(LOG_CRIT, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
/** Flush the stream if we want to read something */
|
|
if (log_to_stderr || log_file)
|
|
fflush(log_fd);
|
|
if (log_file)
|
|
close_log_file();
|
|
/**/
|
|
#ifdef DEBUG
|
|
/* Useful to catch the error in gdb */
|
|
kill(getpid(), SIGSEGV);
|
|
#endif
|
|
exit(1);
|
|
}
|
|
|
|
/* Misc errors */
|
|
void
|
|
error(const char *fmt, ...)
|
|
{
|
|
char str[strlen(fmt) + 3];
|
|
va_list args;
|
|
|
|
str[0] = '*';
|
|
str[1] = ' ';
|
|
strncpy(str + 2, fmt, strlen(fmt));
|
|
str[strlen(fmt) + 2] = 0;
|
|
|
|
va_start(args, fmt);
|
|
print_log(LOG_ERR, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
/* Let's give some news */
|
|
void
|
|
loginfo(const char *fmt, ...)
|
|
{
|
|
char str[strlen(fmt) + 3];
|
|
va_list args;
|
|
|
|
str[0] = '+';
|
|
str[1] = ' ';
|
|
strncpy(str + 2, fmt, strlen(fmt));
|
|
str[strlen(fmt) + 2] = 0;
|
|
|
|
va_start(args, fmt);
|
|
print_log(LOG_INFO, str, args);
|
|
va_end(args);
|
|
}
|
|
|
|
/* "Debugging is twice as hard as writing the code in the first place.
|
|
* Therefore, if you write the code as cleverly as possible, you are,
|
|
* by definition, not smart enough to debug it." - Brian W. Kernighan
|
|
* Damn!
|
|
*/
|
|
|
|
void
|
|
debug(int lvl, const char *fmt, ...)
|
|
{
|
|
char str[strlen(fmt) + 3];
|
|
va_list args;
|
|
|
|
if (lvl <= dbg_lvl) {
|
|
str[0] = '#';
|
|
str[1] = ' ';
|
|
strncpy(str + 2, fmt, strlen(fmt));
|
|
str[strlen(fmt) + 2] = 0;
|
|
|
|
va_start(args, fmt);
|
|
print_log(LOG_DEBUG, str, args);
|
|
va_end(args);
|
|
}
|
|
}
|
|
|
|
void
|
|
print_log(int level, const char *fmt, va_list args)
|
|
{
|
|
if (log_to_stderr || log_file) {
|
|
vfprintf(log_fd, fmt, args);
|
|
fprintf(log_fd, "\n");
|
|
} else
|
|
vsyslog(level | log_facility, fmt, args);
|
|
}
|