#include  <errno.h>
#include  <stdarg.h>
#include  <syslog.h>
#include  "eighdr.h"

int  debug; /* Aufrufer von log_meld oder log_open muss debug setzen:
               0, wenn interaktiv; 1, wenn Daemon-Prozess */

/* Lokale Routinen zur Abarbeitung der Argumentliste */
static void  fehl_meldung(int sys_meld, const char *fmt, va_list az)
{
    int  fehler_nr = errno;
    char puffer[MAX_ZEICHEN];

    vsprintf(puffer, fmt, az);
    if (sys_meld)
	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  log_meldung(int sys_meld, int prio, const char *fmt, va_list az)
{
    int  fehler_nr = errno;
    char puffer[MAX_ZEICHEN];

    vsprintf(puffer, fmt, az);
    if (sys_meld)
	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 */
    } //if (debug) 
    else {
	strcat(puffer, "\n");
        syslog(prio, puffer);
    } //else 
    return;
} //

/* Global aufrufbare Fehlerroutinen */
void  fehler_meld(int kennung, const char *fmt, ...)
{
    va_list     az;
   
    va_start(az, fmt);
    switch (kennung) {
	case WARNUNG:
	    case FATAL:
	    fehl_meldung(0, fmt, az);
	    break;
	    case WARNUNG_SYS:
	    case FATAL_SYS:
	    case DUMP:
	    fehl_meldung(1, fmt, az);
	    break;
	    default:
	    fehl_meldung(1, "Falscher Aufruf von fehler_meld...", az);
	    exit(3);
    } //switch (kennung) 
    va_end(az);
    
    if (kennung==WARNUNG || kennung==WARNUNG_SYS)
	return;
    else if (kennung==DUMP)
	abort();  
    exit(1);
} //


void  log_meld(int kennung, const char *fmt, ...)
{
    va_list     az;
    
    va_start(az, fmt);
    switch (kennung) {
	case WARNUNG:
	    case FATAL:
	    log_meldung(0, LOG_ERR, fmt, az);
	    break;
	    case WARNUNG_SYS:
	    case FATAL_SYS:
	    log_meldung(1, LOG_ERR, fmt, az);
	    break;
	    default:
	    log_meldung(1, LOG_ERR, "Falscher Aufruf von fehler_meld...", az);
	    exit(3);
    } //switch (kennung) 
    
    va_end(az);
    if (kennung==WARNUNG || kennung==WARNUNG_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);
} //
