#include <stdio.h>
#include <sys/types.h>
#include <sys/varargs.h>
#include <bsm/audit.h>
#include <bsm/libbsm.h>
#include <bsm/audit_record.h>
#include "praudit.h"
int
pr_adr_char(pr_context_t *context, char *cp, int count)
{
int err;
adr_t *adr = context->audit_adr;
adrf_t *adrf = context->audit_adrf;
if (context->data_mode == FILEMODE) {
err = adrf_char(adrf, cp, count);
if (err) {
errno = EIO;
return (-1);
} else
return (0);
}
if (!pr_input_remaining(context, (sizeof (char) * count))) {
errno = EIO;
return (-1);
}
adrm_char(adr, cp, count);
return (0);
}
int
pr_adr_short(pr_context_t *context, short *sp, int count)
{
int err;
adr_t *adr = context->audit_adr;
adrf_t *adrf = context->audit_adrf;
if (context->data_mode == FILEMODE) {
err = adrf_short(adrf, sp, count);
if (err) {
errno = EIO;
return (-1);
} else
return (0);
}
if (!pr_input_remaining(context, (sizeof (short) * count))) {
errno = EIO;
return (-1);
}
adrm_short(adr, sp, count);
return (0);
}
int
pr_adr_int32(pr_context_t *context, int32_t *lp, int count)
{
int err;
adr_t *adr = context->audit_adr;
adrf_t *adrf = context->audit_adrf;
if (context->data_mode == FILEMODE) {
err = adrf_int32(adrf, lp, count);
if (err) {
errno = EIO;
return (-1);
} else
return (0);
}
if (!pr_input_remaining(context, (sizeof (int32_t) * count))) {
errno = EIO;
return (-1);
}
adrm_int32(adr, lp, count);
return (0);
}
int
pr_adr_int64(pr_context_t *context, int64_t *lp, int count)
{
int err;
adr_t *adr = context->audit_adr;
adrf_t *adrf = context->audit_adrf;
if (context->data_mode == FILEMODE) {
err = adrf_int64(adrf, lp, count);
if (err) {
errno = EIO;
return (-1);
} else
return (0);
}
if (!pr_input_remaining(context, (sizeof (int64_t) * count))) {
errno = EIO;
return (-1);
}
adrm_int64(adr, lp, count);
return (0);
}
int
pr_adr_u_int32(pr_context_t *context, uint32_t *cp, int count)
{
return (pr_adr_int32(context, (int32_t *)cp, count));
}
int
pr_adr_u_char(pr_context_t *context, uchar_t *cp, int count)
{
return (pr_adr_char(context, (char *)cp, count));
}
int
pr_adr_u_int64(pr_context_t *context, uint64_t *lp, int count)
{
return (pr_adr_int64(context, (int64_t *)lp, count));
}
int
pr_adr_u_short(pr_context_t *context, ushort_t *sp, int count)
{
return (pr_adr_short(context, (short *)sp, count));
}
int
pr_putchar(pr_context_t *context, char c)
{
if (context->data_mode == FILEMODE) {
(void) putchar(c);
return (0);
}
if (context->outbuf_remain_len < 2) {
errno = ENOSPC;
return (-1);
}
*(context->outbuf_p) = c;
context->outbuf_p += 1;
context->outbuf_remain_len -= 1;
return (0);
}
int
pr_printf(pr_context_t *context, const char *fmt, ...)
{
int addlen;
va_list ap;
va_start(ap, fmt);
if (context->data_mode == FILEMODE) {
(void) vprintf(fmt, ap);
va_end(ap);
return (0);
}
if (context->outbuf_remain_len < 2) {
va_end(ap);
errno = ENOSPC;
return (-1);
}
addlen = vsnprintf(context->outbuf_p, context->outbuf_remain_len - 1,
fmt, ap);
va_end(ap);
if (addlen < 0) {
errno = EPERM;
return (-1);
}
if (addlen >= context->outbuf_remain_len - 1) {
errno = ENOSPC;
return (-1);
}
if (addlen >= 1) {
context->outbuf_remain_len -= addlen;
context->outbuf_p += addlen;
}
return (0);
}
int
pr_input_remaining(pr_context_t *context, size_t size)
{
adr_t *adr = context->audit_adr;
if (context->data_mode != BUFMODE)
return (1);
if ((adr_count(adr) + size) > context->inbuf_totalsize)
return (0);
else
return (1);
}