#ifndef TINC_LOGGER_H
#define TINC_LOGGER_H

/*
    logger.h -- header file for logger.c
    Copyright (C) 1998-2005 Ivo Timmermans
                  2000-2017 Guus Sliepen <guus@tinc-vpn.org>

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

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

typedef enum debug_t {
	DEBUG_NOTHING = 0,              /* Quiet mode, only show starting/stopping of the daemon */
	DEBUG_ALWAYS = 0,
	DEBUG_CONNECTIONS = 1,          /* Show (dis)connects of other tinc daemons via TCP */
	DEBUG_ERROR = 2,                /* Show error messages received from other hosts */
	DEBUG_STATUS = 2,               /* Show status messages received from other hosts */
	DEBUG_PROTOCOL = 3,             /* Show the requests that are sent/received */
	DEBUG_META = 4,                 /* Show contents of every request that is sent/received */
	DEBUG_TRAFFIC = 5,              /* Show network traffic information */
	DEBUG_PACKET = 6,               /* Show contents of each packet that is being sent/received */
	DEBUG_SCARY_THINGS = 10         /* You have been warned */
} debug_t;

typedef enum logmode_t {
	LOGMODE_NULL,
	LOGMODE_STDERR,
	LOGMODE_FILE,
	LOGMODE_SYSLOG
} logmode_t;

#ifdef HAVE_MINGW
#define LOG_EMERG EVENTLOG_ERROR_TYPE
#define LOG_ALERT EVENTLOG_ERROR_TYPE
#define LOG_CRIT EVENTLOG_ERROR_TYPE
#define LOG_ERR EVENTLOG_ERROR_TYPE
#define LOG_WARNING EVENTLOG_WARNING_TYPE
#define LOG_NOTICE EVENTLOG_INFORMATION_TYPE
#define LOG_INFO EVENTLOG_INFORMATION_TYPE
#define LOG_DEBUG EVENTLOG_INFORMATION_TYPE
#else
#ifndef HAVE_SYSLOG_H
enum {
	LOG_EMERG,
	LOG_ALERT,
	LOG_CRIT,
	LOG_ERR,
	LOG_WARNING,
	LOG_NOTICE,
	LOG_INFO,
	LOG_DEBUG,
};
#endif
#endif

#include <stdbool.h>

extern int debug_level;
extern bool logcontrol;
extern int umbilical;
extern void openlogger(const char *ident, logmode_t mode);
extern void reopenlogger(void);
extern void logger(int level, int priority, const char *format, ...) __attribute__((__format__(printf, 3, 4)));
extern void closelogger(void);

#endif
