#ifndef LIBRARIES_SYSLOG_H
#define LIBRARIES_SYSLOG_H

/*
**      $VER: syslog.h 1.00 (20.10.95)
**      SysLog Release 1.00
**
**      syslog.library definitions
**
**      Copyright © 1995 Petri Nordlund. All rights reserved.
**
**      $Id: syslog.h 1.10 1995/11/04 17:15:35 petrin Exp petrin $
**
*/

#ifndef EXEC_TYPES_H
#include "exec/types.h"
#endif /* EXEC_TYPES_H */

#ifndef EXEC_PORTS_H
#include "exec/ports.h"
#endif /* EXEC_PORTS_H */

#ifndef DEVICES_TIMER_H
#include "devices/timer.h"
#endif /* DEVICES_TIMER_H */

#include <stdarg.h>


#define SYSLOGNAME		"syslog.library"
#define SYSLOGVERSION	1L


/*
 * Priority and facility form a single 32-bit value. The bottom 3 bits
 * are used for the priority (0-7) and the top 28 bits are used for the
 * facility. Both the priorities and the facilities correspond to ascii
 * strings that are included in this file.
 *
 */

/*
 * Priorities
 *
 */
#define	LOG_EMERG	0	/* system is unusable */
#define	LOG_ALERT	1	/* action must be taken immediately */
#define	LOG_CRIT	2	/* critical conditions */
#define	LOG_ERR		3	/* error conditions */
#define	LOG_WARNING	4	/* warning conditions */
#define	LOG_NOTICE	5	/* normal but significant condition */
#define	LOG_INFO	6	/* informational */
#define	LOG_DEBUG	7	/* debug-level messages */


/*
 * Facilities
 *
 */
#define	LOG_NOFAC		(0<<3)	/* no facility */
#define	LOG_KERN		(1<<3)	/* kernel/system messages */
#define	LOG_USER		(2<<3)	/* random user-level messages */
#define	LOG_MAIL		(3<<3)	/* mail system */
#define	LOG_DAEMON		(4<<3)	/* system daemons/commodities */
#define	LOG_AUTH		(5<<3)	/* security/authorization messages */
#define	LOG_SYSLOG		(6<<3)	/* messages generated internally by SyslogDaemon */
#define	LOG_NEWS		(7<<3)	/* network news subsystem */
#define	LOG_UUCP		(8<<3)	/* UUCP subsystem */
#define	LOG_CRON		(9<<3)	/* cron utility */
#define	LOG_AUTHPRIV	(10<<3)	/* security/authorization messages (private) */
#define	LOG_FTP			(11<<3)	/* ftp daemon */

/* other codes through 15 reserved for system use */
#define	LOG_LOCAL0		(16<<3)	/* reserved for local use */
#define	LOG_LOCAL1		(17<<3)	/* reserved for local use */
#define	LOG_LOCAL2		(18<<3)	/* reserved for local use */
#define	LOG_LOCAL3		(19<<3)	/* reserved for local use */
#define	LOG_LOCAL4		(20<<3)	/* reserved for local use */
#define	LOG_LOCAL5		(21<<3)	/* reserved for local use */
#define	LOG_LOCAL6		(22<<3)	/* reserved for local use */
#define	LOG_LOCAL7		(23<<3)	/* reserved for local use */


/*
 * Macros
 *
 */

#define	LOG_PRIMASK	0x07								/* mask to extract priority part */
#define	LOG_PRI(p) ((p) & LOG_PRIMASK)					/* Extract priority */
#define	LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri))	/* Form a single value from facility and priority */
#define	LOG_NFACILITIES	24								/* current number of facilities */
#define	LOG_FACMASK	0x03f8								/* mask to extract facility part */
#define	LOG_FAC(p) (((p) & LOG_FACMASK) >> 3)			/* facility of pri */
#define	INTERNAL_NOPRI 0x10								/* the "no priority" priority */


/*
 * Symbolic names for priorities and facilities
 *
 */

#ifdef SYSLOG_NAMES
struct SysLogName {
	char		*name;
	int			value;
};

struct SysLogName priority_names[] = {
	"alert",	LOG_ALERT,
	"crit",		LOG_CRIT,
	"debug",	LOG_DEBUG,
	"emerg",	LOG_EMERG,
	"err",		LOG_ERR,
	"info",		LOG_INFO,
	"none",		INTERNAL_NOPRI,		/* INTERNAL */
	"notice",	LOG_NOTICE,
	"warning",	LOG_WARNING,
	NULL,		-1,
};

struct SysLogName facility_names[] = {
	"auth",		LOG_AUTH,
	"authpriv",	LOG_AUTHPRIV,
	"cron", 	LOG_CRON,
	"daemon",	LOG_DAEMON,
	"ftp",		LOG_FTP,
	"kern",		LOG_KERN,
	"mail",		LOG_MAIL,
	"mark", 	LOG_MAKEPRI(LOG_NFACILITIES,0),		/* INTERNAL */
	"news",		LOG_NEWS,
	"syslog",	LOG_SYSLOG,
	"user",		LOG_USER,
	"uucp",		LOG_UUCP,
	"local0",	LOG_LOCAL0,
	"local1",	LOG_LOCAL1,
	"local2",	LOG_LOCAL2,
	"local3",	LOG_LOCAL3,
	"local4",	LOG_LOCAL4,
	"local5",	LOG_LOCAL5,
	"local6",	LOG_LOCAL6,
	"local7",	LOG_LOCAL7,
	NULL,		-1,
};
#endif


/*
 * Arguments to setlogmask
 *
 */

#define	LOG_MASK(pri)	(1 << (pri))			/* mask for one priority */
#define	LOG_UPTO(pri)	((1 << ((pri)+1)) - 1)	/* all priorities through pri */


/*
 * Option flags for OpenLog() and Log().
 */

#define	LOG_PID		0x01	/* log the pid with each message */
#define	LOG_CONS	0x02	/* log on the console if errors in sending */
#define	LOG_PERROR	0x04	/* log to stderr as well */


/*
 * SysLog Spy structure
 *
 */

struct SysLogSpy {
	struct MsgPort 	*Spy_port;		/* this will be allocated for you by AddSysLogSpy() */
};


/*
 * Message sent to spies
 *
 */

struct SysLogMessage {
	struct Message	ExecMessage;
	LONG			pri;
	char			*msg;			/* A newline character is always included */
	struct timeval	logtime;
};


/*
 * syslog.lib prototypes
 *
 */

void SysLog(LONG priority, STRPTR format, ...);
void VSysLog(LONG priority, STRPTR format, va_list args);
void OpenLog(STRPTR tag, LONG options, LONG facility);
void CloseLog(void);
LONG SetLogMask(LONG mask);


#ifdef LOWERCASE_SYSLOG_NAMES
#define syslog		SysLog
#define vsyslog		VSysLog
#define openlog 	OpenLog
#define closelog	CloseLog
#define setlogmask	SetLogMask
#endif


#endif /* LIBRARIES_SYSLOG_H */
