#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <syslog.h>
#include <string.h>
#include <cryptoutil.h>
#define CRYPTO_DEBUG_ENV "SUNW_CRYPTO_DEBUG"
static char *_cryptodebug_prefix = NULL;
static int _cryptodebug_enabled = -1;
static int _cryptoerror_enabled = 1;
static boolean_t _cryptodebug_syslog = B_TRUE;
void
cryptodebug(const char *fmt, ...)
{
va_list args;
char fmtbuf[BUFSIZ];
char msgbuf[BUFSIZ];
if (fmt == NULL || _cryptodebug_enabled != 1)
return;
va_start(args, fmt);
if (_cryptodebug_prefix == NULL) {
(void) vsnprintf(msgbuf, sizeof (msgbuf), fmt, args);
} else {
(void) snprintf(fmtbuf, sizeof (fmtbuf), "%s: %s",
_cryptodebug_prefix, fmt);
(void) vsnprintf(msgbuf, sizeof (msgbuf), fmtbuf, args);
}
if (_cryptodebug_syslog) {
syslog(LOG_DEBUG, msgbuf);
} else {
(void) fprintf(stderr, "%s\n", msgbuf);
}
va_end(args);
}
void
cryptoerror(int priority, const char *fmt, ...)
{
char fmtbuf[BUFSIZ];
char msgbuf[BUFSIZ];
va_list args;
if (fmt == NULL || _cryptoerror_enabled == 0)
return;
va_start(args, fmt);
if (_cryptodebug_prefix == NULL) {
(void) vsnprintf(msgbuf, sizeof (msgbuf), fmt, args);
} else {
(void) snprintf(fmtbuf, sizeof (fmtbuf), "%s: %s",
_cryptodebug_prefix, fmt);
(void) vsnprintf(msgbuf, sizeof (msgbuf), fmtbuf, args);
}
if ((priority == LOG_STDERR) || (priority < 0)) {
(void) fprintf(stderr, "%s\n", msgbuf);
} else {
syslog(priority, msgbuf);
}
va_end(args);
}
void
cryptoerror_off()
{
_cryptoerror_enabled = 0;
}
void
cryptoerror_on()
{
_cryptoerror_enabled = 1;
}
void
cryptodebug_init(const char *prefix)
{
char *envval = NULL;
if (prefix != NULL) {
_cryptodebug_prefix = strdup(prefix);
}
if (_cryptodebug_enabled == -1) {
envval = getenv(CRYPTO_DEBUG_ENV);
if (envval == NULL || (strcmp(envval, "") == 0)) {
_cryptodebug_enabled = 0;
return;
} else if (strcmp(envval, "stderr") == 0) {
_cryptodebug_syslog = B_FALSE;
_cryptodebug_enabled = 1;
} else if (strcmp(envval, "syslog") == 0) {
_cryptodebug_syslog = B_TRUE;
_cryptodebug_enabled = 1;
}
}
openlog(_cryptodebug_prefix, LOG_PID, LOG_USER);
}
#pragma fini(_cryptodebug_fini)
static void
_cryptodebug_fini(void)
{
if (_cryptodebug_prefix != NULL)
free(_cryptodebug_prefix);
}