/*
 * syslog.c
 *
 * Issue syslog messages via the kernel printk queue.
 */

#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <syslog.h>
#include <unistd.h>
#include <fcntl.h>

/* Maximum size for a kernel message */
#define BUFLEN 1024

/* Logging node */
#define LOGDEV "/dev/kmsg"

/* Max length of ID string */
#define MAXID 31

int __syslog_fd = -1;
static char id[MAXID+1];

void openlog(const char *ident, int option, int facility)
{
  int fd;

  (void)option; (void)facility;	/* Unused */
  
  if ( __syslog_fd == -1 ) {
    __syslog_fd = fd = open(LOGDEV, O_WRONLY);
    if ( fd == -1 )
      return;
    fcntl(fd, F_SETFD, (long)FD_CLOEXEC);
  }
  
  strncpy(id, ident?ident:"", MAXID);
  id[MAXID] = '\0';		/* Make sure it's null-terminated */
}

void vsyslog(int prio, const char *format, va_list ap)
{
  char buf[BUFLEN];
  int rv, len;
  int fd;

  if ( __syslog_fd == -1 )
    openlog(NULL, 0, 0);

  fd = __syslog_fd;
  if ( fd == -1 )
    fd = 2;			/* Failed to open log, write to stderr */

  buf[0] = '<';
  buf[1] = LOG_PRI(prio)+'0';
  buf[2] = '>';
  len = 3;

  if ( *id )
    len += sprintf(buf+3, "%s: ", id);

  rv = vsnprintf(buf+len, BUFLEN-len, format, ap);

  len += rv;
  if ( len > BUFLEN-1 ) len = BUFLEN-1;
  buf[len] = '\n';

  write(fd, buf, len+1);
}

void syslog(int prio, const char *format, ...)
{
  va_list ap;

  va_start(ap, format);
  vsyslog(prio, format, ap);
  va_end(ap);
}
