#ifndef _SYSLOG_H
#define _SYSLOG_H

#ifdef __cplusplus
extern "C" {
#endif

#include <features.h>

#define LOG_EMERG   0
#define LOG_ALERT   1
#define LOG_CRIT    2
#define LOG_ERR     3
#define LOG_WARNING 4
#define LOG_NOTICE  5
#define LOG_INFO    6
#define LOG_DEBUG   7

#define LOG_PRIMASK 7
#define LOG_PRI(p) ((p)&LOG_PRIMASK)
#define	LOG_MAKEPRI(f, p) (((f)<<3)|(p))

#define LOG_MASK(p) (1<<(p))
#define LOG_UPTO(p) ((1<<((p)+1))-1)

#define LOG_KERN     (0<<3)
#define LOG_USER     (1<<3)
#define LOG_MAIL     (2<<3)
#define LOG_DAEMON   (3<<3)
#define LOG_AUTH     (4<<3)
#define LOG_SYSLOG   (5<<3)
#define LOG_LPR      (6<<3)
#define LOG_NEWS     (7<<3)
#define LOG_UUCP     (8<<3)
#define LOG_CRON     (9<<3)
#define	LOG_AUTHPRIV (10<<3)
#define	LOG_FTP      (11<<3)

#define LOG_LOCAL0   (16<<3)
#define LOG_LOCAL1   (17<<3)
#define LOG_LOCAL2   (18<<3)
#define LOG_LOCAL3   (19<<3)
#define LOG_LOCAL4   (20<<3)
#define LOG_LOCAL5   (21<<3)
#define LOG_LOCAL6   (22<<3)
#define LOG_LOCAL7   (23<<3)

#define LOG_NFACILITIES 24
#define LOG_FACMASK 0x3f8
#define LOG_FAC(p) (((p)&LOG_FACMASK)>>3)

#define LOG_PID    0x01
#define LOG_CONS   0x02
#define LOG_ODELAY 0x04
#define LOG_NDELAY 0x08
#define LOG_NOWAIT 0x10
#define LOG_PERROR 0x20

#if __GNUC__ >= 3
#define __fp(x, y) __attribute__ ((__format__ (__printf__, x, y)))
#else
#define __fp(x, y)
#endif

void closelog (void);
void openlog (const char *, int, int);
int setlogmask (int);
void syslog (int, const char *, ...) __fp(2, 3);

#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
#define _PATH_LOG "/dev/log"
#define __NEED_va_list
#include <bits/alltypes.h>
void vsyslog (int, const char *, va_list) __fp(2, 0);
#if defined(SYSLOG_NAMES)
#define	INTERNAL_NOPRI 0x10
#define	INTERNAL_MARK (LOG_NFACILITIES<<3)
typedef struct {
	char *c_name;
	int c_val;
} CODE;
#define prioritynames ((CODE *)(const CODE []){ \
	{ "alert", LOG_ALERT }, { "crit", LOG_CRIT }, { "debug", LOG_DEBUG }, \
	{ "emerg", LOG_EMERG }, { "err", LOG_ERR }, { "error", LOG_ERR }, \
	{ "info", LOG_INFO }, { "none", INTERNAL_NOPRI }, \
	{ "notice", LOG_NOTICE }, { "panic", LOG_EMERG }, \
	{ "warn", LOG_WARNING }, { "warning", LOG_WARNING }, { 0, -1 } })
#define facilitynames ((CODE *)(const CODE []){ \
	{ "auth", LOG_AUTH }, { "authpriv", LOG_AUTHPRIV }, \
	{ "cron", LOG_CRON }, { "daemon", LOG_DAEMON }, { "ftp", LOG_FTP }, \
	{ "kern", LOG_KERN }, { "lpr", LOG_LPR }, { "mail", LOG_MAIL }, \
	{ "mark", INTERNAL_MARK }, { "news", LOG_NEWS }, \
	{ "security", LOG_AUTH }, { "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 }, { 0, -1 } })
#endif
#endif

#undef __fp

#ifdef __cplusplus
}
#endif

#endif
