#include <stddef.h>
#include <assert.h>
#include <string.h>
#include <syslog.h>
#include "jsyslog.h"
#define ILL_ARG_EX_CLASS_DESC "java/lang/IllegalArgumentException"
#define THROWABLE_CLASS_DESC "java/lang/Throwable"
#define CLASS_FIELD_DESC(class_desc) "L" class_desc ";"
static char jsyslog_ident[32];
JNIEXPORT void JNICALL
Java_com_sun_solaris_service_logging_SyslogHandler_syslog(JNIEnv *env,
jclass clazz, jint severity, jstring messageObj)
{
const char *message;
if (messageObj == NULL) {
jclass exceptionClass;
if (!(exceptionClass = (*env)->FindClass(env,
ILL_ARG_EX_CLASS_DESC)))
return;
(*env)->Throw(env, (*env)->NewObject(env, exceptionClass,
(*env)->GetStaticMethodID(env, exceptionClass, "<init>",
"()" CLASS_FIELD_DESC(THROWABLE_CLASS_DESC))));
return;
}
if (!(message = (*env)->GetStringUTFChars(env, messageObj, NULL)))
return;
syslog(severity, "%s", message);
(*env)->ReleaseStringUTFChars(env, messageObj, message);
}
JNIEXPORT void JNICALL
Java_com_sun_solaris_service_logging_SyslogHandler_openlog(JNIEnv *env,
jclass clazz, jstring identObj, jint logopt, jint facility)
{
const char *ident;
if (identObj == NULL) {
jclass exceptionClass;
if (!(exceptionClass = (*env)->FindClass(env,
ILL_ARG_EX_CLASS_DESC)))
return;
(*env)->Throw(env, (*env)->NewObject(env, exceptionClass,
(*env)->GetStaticMethodID(env, exceptionClass, "<init>",
"()" CLASS_FIELD_DESC(THROWABLE_CLASS_DESC))));
return;
}
if (!(ident = (*env)->GetStringUTFChars(env, identObj, NULL)))
return;
(void) strlcpy(jsyslog_ident, ident, sizeof (jsyslog_ident));
openlog(jsyslog_ident, logopt, facility);
(*env)->ReleaseStringUTFChars(env, identObj, ident);
}
JNIEXPORT void JNICALL
Java_com_sun_solaris_service_logging_SyslogHandler_closelog(JNIEnv *env,
jclass clazz)
{
closelog();
}