/* GNU Mailutils -- a suite of utilities for electronic mail
   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA  */

#include "mu_scm.h"

#include <syslog.h>

SCM_DEFINE(mu_openlog, "mu-openlog", 3, 0, 0,
	   (SCM IDENT, SCM OPTION, SCM FACILITY),
	   "Opens a connection to the system logger for Guile program.")
#define FUNC_NAME s_mu_openlog
{
  char *ident;
  int option, facility;

  if (IDENT == SCM_BOOL_F)
    ident = "libmu_scm";
  else
    {
      SCM_ASSERT (SCM_NIMP (IDENT) && SCM_STRINGP (IDENT),
		 IDENT, SCM_ARG1, FUNC_NAME);
      ident = SCM_STRING_CHARS (IDENT);
    }
	
  if (SCM_IMP (OPTION) && SCM_INUMP (OPTION))
    option = SCM_INUM (OPTION);
  else if (SCM_BIGP (OPTION)) 
    option = (int) scm_i_big2dbl (OPTION);
  else 
    SCM_ASSERT (0, OPTION, SCM_ARG2, FUNC_NAME);

  if (SCM_IMP (FACILITY) && SCM_INUMP (FACILITY)) 
    facility = SCM_INUM (FACILITY);
  else if (SCM_BIGP (FACILITY)) 
    facility = (int) scm_i_big2dbl (FACILITY);
  else
    SCM_ASSERT (0, FACILITY, SCM_ARG3, FUNC_NAME);

  openlog (ident, option, facility);
  return SCM_UNSPECIFIED;
}
#undef FUNC_NAME

SCM_DEFINE (mu_logger, "mu-logger", 2, 0, 0,
	   (SCM PRIO, SCM TEXT),
	   "Generates a log message to be distributed via syslogd.")
#define FUNC_NAME s_mu_logger
{
  int prio;

  if (PRIO == SCM_BOOL_F) 
    prio = LOG_INFO;
  else if (SCM_IMP (PRIO) && SCM_INUMP (PRIO)) 
    prio = SCM_INUM (PRIO);
  else if (SCM_BIGP (PRIO)) 
    prio = (int) scm_i_big2dbl (PRIO);
  else
    SCM_ASSERT (0, PRIO, SCM_ARG1, FUNC_NAME);
  
  SCM_ASSERT (SCM_NIMP (TEXT) && SCM_STRINGP (TEXT),
	     TEXT, SCM_ARG2, FUNC_NAME);
  syslog (prio, "%s", SCM_STRING_CHARS (TEXT));
  return SCM_UNSPECIFIED;
}
#undef FUNC_NAME

SCM_DEFINE (mu_closelog, "mu-closelog", 0, 0, 0,
	   (),
	   "Closes the channel to the system logger open by mu-openlog.")
#define FUNC_NAME s_mu_closelog
{
  closelog ();
  return SCM_UNSPECIFIED;
}
#undef FUNC_NAME


static struct
{
  char *name;
  int facility;
} syslog_kw[] = {
  { "LOG_USER",    LOG_USER },   
  { "LOG_DAEMON",  LOG_DAEMON },
  { "LOG_AUTH",	   LOG_AUTH },  
  { "LOG_LOCAL0",  LOG_LOCAL0 },
  { "LOG_LOCAL1",  LOG_LOCAL1 },
  { "LOG_LOCAL2",  LOG_LOCAL2 },
  { "LOG_LOCAL3",  LOG_LOCAL3 },
  { "LOG_LOCAL4",  LOG_LOCAL4 },
  { "LOG_LOCAL5",  LOG_LOCAL5 },
  { "LOG_LOCAL6",  LOG_LOCAL6 },
  { "LOG_LOCAL7",  LOG_LOCAL7 },
  /* severity */
  { "LOG_EMERG",   LOG_EMERG },    
  { "LOG_ALERT",   LOG_ALERT },   
  { "LOG_CRIT",	   LOG_CRIT },    
  { "LOG_ERR",	   LOG_ERR },     
  { "LOG_WARNING", LOG_WARNING }, 
  { "LOG_NOTICE",  LOG_NOTICE },  
  { "LOG_INFO",	   LOG_INFO },    
  { "LOG_DEBUG",   LOG_DEBUG },   
  /* options */
  { "LOG_CONS",    LOG_CONS },   
  { "LOG_NDELAY",  LOG_NDELAY }, 
  { "LOG_PID",     LOG_PID }
};

void
mu_scm_logger_init ()
{
  int i;
  
  for (i = 0; i < sizeof (syslog_kw)/sizeof (syslog_kw[0]); i++)
    scm_c_define (syslog_kw[i].name, SCM_MAKINUM (syslog_kw[i].facility));
#include <mu_logger.x>
}