/
Genesis-1.0p36-DEV/
Genesis-1.0p36-DEV/bin/
Genesis-1.0p36-DEV/doc/
Genesis-1.0p36-DEV/etc/
Genesis-1.0p36-DEV/src/data/
/*
// Full copyright information is available in the file ../doc/CREDITS
//
// Procedures to handle logging and fatal errors.
*/

#include "defs.h"

#include <sys/types.h>
#include <stdarg.h>
#include "cache.h"
#include "util.h"

void panic(char * s, ...) {
    va_list vargs;
    static Bool panic_state = NO;

    va_start(vargs,s);
    fprintf(errfile, "[%s] %s: ", timestamp(NULL),
            (panic_state ? "RECURSIVE PANIC" : "PANIC"));
    vfprintf(errfile,s,vargs);
    va_end(vargs);
    fputc('\n',errfile);

    if (!panic_state) {
	panic_state = YES;
        fprintf(errfile, "[%s] doing binary dump...", timestamp(NULL));
	cache_sync();
        fputs("Done\n", errfile);
    }
    exit(1);
}

void abort(void) {
  panic("Aborted");
  exit(1);  /* Never reached.  Avoids warnings on some compilers, tho */
}

void fail_to_start(char *s) {
    fprintf(errfile, "[%s] FAILED TO START: %s\n", timestamp(NULL), s);

    exit(1);
}

void write_log(char *fmt, ...) {
    va_list arg;
    cStr *str;

    va_start(arg, fmt);

    str = vformat(fmt, arg);

    fputs(string_chars(str), logfile);
    fputc('\n', logfile);

    fflush(logfile);

    string_discard(str);
    va_end(arg);
}

void write_err(char *fmt, ...) {
    va_list arg;
    cStr *str;

    va_start(arg, fmt);
    str = vformat(fmt, arg);
    va_end(arg);

    fprintf(errfile, "[%s] %s\n", timestamp(NULL), string_chars(str));
    fflush(errfile);

    string_discard(str);
}