www.nico.schottelius.org/software/cinit/browse_source/cinit-0.3pre15/contrib+tools/error.c

125 lines
2.9 KiB
C

/**
(c) 2005 Peter Portmann (pp at bluewin.ch)
error.c
This script is written for the clinux-System and published
under the terms of GPL 2.0
Version: 0.1
ChangeLog:
Todo:
Features:
*/
#include "error.h"
#include <errno.h>
#include <stdio.h>
#include <stdarg.h>
#include <syslog.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR 4096
int debug; /* Aufrufer von log_msg oder log_open muss debug setzen:
0, wenn interaktiv; 1, wenn Daemon-Prozess */
/*---- Lokale Routinen zur Abarbeitung der Argumentliste --------------------*/
static void msg_err(int sys_msg, const char *fmt, va_list az)
{
int fehler_nr = errno;
char puffer[MAX_CHAR];
vsprintf(puffer, fmt, az);
if (sys_msg)
sprintf(puffer+strlen(puffer), ": %s ", strerror(fehler_nr));
fflush(stdout); /* fuer Fall, dass stdout und stderr gleich sind */
fprintf(stderr, "%s\n", puffer);
fflush(NULL); /* alle Ausgabepuffer flushen */
return;
}
static void msg_log(int sys_msg, int prio, const char *fmt, va_list az)
{
int fehler_nr = errno;
char puffer[MAX_CHAR];
vsprintf(puffer, fmt, az);
if (sys_msg)
sprintf(puffer+strlen(puffer), ": %s ", strerror(fehler_nr));
if (debug) {
fflush(stdout); /* fuer Fall, dass stdout und stderr gleich sind */
fprintf(stderr, "%s\n", puffer);
fflush(NULL); /* alle Ausgabepuffer flushen */
} else {
strcat(puffer, "\n");
syslog(prio, puffer);
}
return;
}
/*---- Global aufrufbare Fehlerroutinen -------------------------------------*/
void err_msg(int kennung, const char *fmt, ...)
{
va_list az;
va_start(az, fmt);
switch (kennung) {
case WARNING:
case FATAL:
msg_err(0, fmt, az);
break;
case WARNING_SYS:
case FATAL_SYS:
case DUMP:
msg_err(1, fmt, az);
break;
default:
msg_err(1, "Falscher Aufruf von err_msg...", az);
exit(3);
}
va_end(az);
if (kennung==WARNING || kennung==WARNING_SYS)
return;
else if (kennung==DUMP)
abort(); /* core dump */
exit(1);
}
void log_msg(int kennung, const char *fmt, ...)
{
va_list az;
va_start(az, fmt);
switch (kennung) {
case WARNING:
case FATAL:
msg_log(0, LOG_ERR, fmt, az);
break;
case WARNING_SYS:
case FATAL_SYS:
msg_log(1, LOG_ERR, fmt, az);
break;
default:
msg_log(1, LOG_ERR, "Falscher Aufruf von log_msg...", az);
exit(3);
}
va_end(az);
if (kennung==WARNING || kennung==WARNING_SYS)
return;
exit(2);
}
/*---- log_open ---------------------------------------------------------------
initialisiert syslog() bei einem Daemon-Prozess */
void log_open(const char *kennung, int option, int facility)
{
if (debug==0)
openlog(kennung, option, facility);
}