#include <sys/param.h>
#include <sys/types.h>
#include <sys/varargs.h>
#include <sys/systm.h>
#include <sys/cmn_err.h>
#include <sys/log.h>
#include <upanic.h>
#include <fakekernel.h>
void debug_enter(char *);
char *volatile panicstr;
va_list panicargs;
char panicbuf[512];
int aok;
static const int
ce_flags[CE_IGNORE] = { SL_NOTE, SL_NOTE, SL_WARN, SL_FATAL };
static const char
ce_prefix[CE_IGNORE][10] = { "", "NOTICE: ", "WARNING: ", "" };
static const char
ce_suffix[CE_IGNORE][2] = { "", "\n", "\n", "" };
void
fakekernel_putlog(char *msg, size_t len, int flags)
{
}
void
fakekernel_cprintf(const char *fmt, va_list adx, int flags,
const char *prefix, const char *suffix)
{
size_t bufsize = LOG_MSGSIZE;
char buf[LOG_MSGSIZE];
char *bufp = buf;
char *msgp, *bufend;
size_t len;
if (strchr("^!?", fmt[0]) != NULL) {
if (fmt[0] == '^')
flags |= SL_CONSONLY;
else if (fmt[0] == '!')
flags |= SL_LOGONLY;
fmt++;
}
bufend = bufp + bufsize;
msgp = bufp;
msgp += snprintf(msgp, bufend - msgp, "[fake_kernel] ");
msgp += snprintf(msgp, bufend - msgp, prefix);
msgp += vsnprintf(msgp, bufend - msgp, fmt, adx);
msgp += snprintf(msgp, bufend - msgp, suffix);
len = msgp - bufp;
fakekernel_putlog(bufp, len, flags);
}
void
vzprintf(zoneid_t zoneid, const char *fmt, va_list adx)
{
fakekernel_cprintf(fmt, adx, SL_CONSOLE | SL_NOTE, "", "");
}
void
zprintf(zoneid_t zoneid, const char *fmt, ...)
{
va_list adx;
va_start(adx, fmt);
vzprintf(zoneid, fmt, adx);
va_end(adx);
}
void
vpanic(const char *fmt, va_list adx)
{
va_list tmpargs;
panicstr = (char *)fmt;
va_copy(panicargs, adx);
va_copy(tmpargs, adx);
fakekernel_cprintf(fmt, tmpargs, SL_FATAL, "fatal: ", "\n");
(void) vsnprintf(panicbuf, sizeof (panicbuf), fmt, adx);
debug_enter(panicbuf);
upanic(panicbuf, sizeof (panicbuf));
}
void
panic(const char *fmt, ...)
{
va_list adx;
va_start(adx, fmt);
vpanic(fmt, adx);
va_end(adx);
}
void
fm_panic(const char *fmt, ...)
{
va_list adx;
va_start(adx, fmt);
vpanic(fmt, adx);
va_end(adx);
}
void
vcmn_err(int ce, const char *fmt, va_list adx)
{
if (ce == CE_PANIC)
vpanic(fmt, adx);
if (ce >= CE_IGNORE)
return;
fakekernel_cprintf(fmt, adx, ce_flags[ce] | SL_CONSOLE,
ce_prefix[ce], ce_suffix[ce]);
}
void
cmn_err(int ce, const char *fmt, ...)
{
va_list adx;
va_start(adx, fmt);
vcmn_err(ce, fmt, adx);
va_end(adx);
}
void
debug_enter(char *str)
{
}
void
assfail(const char *a, const char *f, int l)
{
if (!aok)
panic("assertion failed: %s, file: %s, line: %d", a, f, l);
fprintf(stderr, "ASSERTION CAUGHT: %s, file: %s, line: %d\n", a, f, l);
}
void
assfail3(const char *a, uintmax_t lv, const char *op, uintmax_t rv,
const char *f, int l)
{
if (!aok) {
panic("assertion failed: %s (0x%llx %s 0x%llx), file: %s, "
"line: %d", a, (u_longlong_t)lv, op, (u_longlong_t)rv,
f, l);
}
fprintf(stderr, "ASSERTION CAUGHT: %s (0x%llx %s 0x%llx), file: %s, "
"line: %d\n", a, (u_longlong_t)lv, op, (u_longlong_t)rv,
f, l);
}