/* @@@HEAD@@@
// Procedures to handle logging and fatal errors.
*/

#include <stdio.h>
#include <sys/types.h>
#include <stdarg.h>
#include "config.h"
#include "defs.h"
#include "log.h"
#include "dump.h"
#include "cdc_types.h"
#include "util.h"

void panic(char *s) {
    static int panic_state = 0;

    fprintf(stderr, "[%s] %s: %s\n", timestamp(NULL),
            (panic_state ? "RECURSIVE PANIC" : "PANIC"), s);

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

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

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

    exit(1);
}

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

    va_start(arg, fmt);

    str = vformat(fmt, arg);

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

    fflush(stdout);

    string_discard(str);
    va_end(arg);
}

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

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

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

    string_discard(str);
}