xref: /minix3/usr.sbin/syslogd/syslogd.h (revision 686761dbbce7cc1bcf150ce26b1c3f0eed7d17c6)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: syslogd.h,v 1.7 2015/09/08 18:33:12 plunky Exp $	*/
23e07920fSDavid van Moolenbroek 
33e07920fSDavid van Moolenbroek /*-
43e07920fSDavid van Moolenbroek  * Copyright (c) 2008 The NetBSD Foundation, Inc.
53e07920fSDavid van Moolenbroek  * All rights reserved.
63e07920fSDavid van Moolenbroek  *
73e07920fSDavid van Moolenbroek  * This code is derived from software contributed to The NetBSD Foundation
83e07920fSDavid van Moolenbroek  * by Martin Sch�tte.
93e07920fSDavid van Moolenbroek  *
103e07920fSDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without
113e07920fSDavid van Moolenbroek  * modification, are permitted provided that the following conditions
123e07920fSDavid van Moolenbroek  * are met:
133e07920fSDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright
143e07920fSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer.
153e07920fSDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright
163e07920fSDavid van Moolenbroek  *    notice, this list of conditions and the following disclaimer in the
173e07920fSDavid van Moolenbroek  *    documentation and/or other materials provided with the distribution.
183e07920fSDavid van Moolenbroek  * 3. All advertising materials mentioning features or use of this software
193e07920fSDavid van Moolenbroek  *    must display the following acknowledgement:
203e07920fSDavid van Moolenbroek  *        This product includes software developed by the NetBSD
213e07920fSDavid van Moolenbroek  *        Foundation, Inc. and its contributors.
223e07920fSDavid van Moolenbroek  * 4. Neither the name of The NetBSD Foundation nor the names of its
233e07920fSDavid van Moolenbroek  *    contributors may be used to endorse or promote products derived
243e07920fSDavid van Moolenbroek  *    from this software without specific prior written permission.
253e07920fSDavid van Moolenbroek  *
263e07920fSDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
273e07920fSDavid van Moolenbroek  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
283e07920fSDavid van Moolenbroek  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
293e07920fSDavid van Moolenbroek  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
303e07920fSDavid van Moolenbroek  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
313e07920fSDavid van Moolenbroek  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
323e07920fSDavid van Moolenbroek  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
333e07920fSDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
343e07920fSDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
353e07920fSDavid van Moolenbroek  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
363e07920fSDavid van Moolenbroek  * POSSIBILITY OF SUCH DAMAGE.
373e07920fSDavid van Moolenbroek  */
383e07920fSDavid van Moolenbroek #ifndef SYSLOGD_H_
393e07920fSDavid van Moolenbroek #define SYSLOGD_H_
403e07920fSDavid van Moolenbroek /*
413e07920fSDavid van Moolenbroek  * hold common data structures and prototypes
423e07920fSDavid van Moolenbroek  * for syslogd.c and tls.c
433e07920fSDavid van Moolenbroek  *
443e07920fSDavid van Moolenbroek  */
453e07920fSDavid van Moolenbroek 
463e07920fSDavid van Moolenbroek #include <sys/cdefs.h>
473e07920fSDavid van Moolenbroek #define MAXLINE		1024		/* maximum line length */
483e07920fSDavid van Moolenbroek #define MAXSVLINE	120		/* maximum saved line length */
493e07920fSDavid van Moolenbroek #define DEFUPRI		(LOG_USER|LOG_NOTICE)
503e07920fSDavid van Moolenbroek #define DEFSPRI		(LOG_KERN|LOG_NOTICE)
513e07920fSDavid van Moolenbroek #define TIMERINTVL	30		/* interval for checking flush, mark */
523e07920fSDavid van Moolenbroek #define TTYMSGTIME	1		/* timeout passed to ttymsg */
533e07920fSDavid van Moolenbroek 
543e07920fSDavid van Moolenbroek #include <sys/param.h>
553e07920fSDavid van Moolenbroek #include <sys/socket.h>
563e07920fSDavid van Moolenbroek #include <sys/sysctl.h>
573e07920fSDavid van Moolenbroek #include <sys/types.h>
583e07920fSDavid van Moolenbroek #include <sys/un.h>
593e07920fSDavid van Moolenbroek #include <sys/wait.h>
603e07920fSDavid van Moolenbroek #include <sys/queue.h>
613e07920fSDavid van Moolenbroek #include <netinet/in.h>
623e07920fSDavid van Moolenbroek #include <sys/event.h>
633e07920fSDavid van Moolenbroek #include <event.h>
643e07920fSDavid van Moolenbroek 
653e07920fSDavid van Moolenbroek #include <assert.h>
663e07920fSDavid van Moolenbroek #include <ctype.h>
673e07920fSDavid van Moolenbroek #include <errno.h>
683e07920fSDavid van Moolenbroek #include <fcntl.h>
693e07920fSDavid van Moolenbroek #include <grp.h>
703e07920fSDavid van Moolenbroek #include <locale.h>
713e07920fSDavid van Moolenbroek #include <netdb.h>
723e07920fSDavid van Moolenbroek #include <pwd.h>
733e07920fSDavid van Moolenbroek #include <signal.h>
743e07920fSDavid van Moolenbroek #include <stdarg.h>
753e07920fSDavid van Moolenbroek #include <stdio.h>
763e07920fSDavid van Moolenbroek #include <stdlib.h>
773e07920fSDavid van Moolenbroek #include <string.h>
783e07920fSDavid van Moolenbroek #include <unistd.h>
793e07920fSDavid van Moolenbroek #include <stdbool.h>
803e07920fSDavid van Moolenbroek #include <utmp.h>
813e07920fSDavid van Moolenbroek #ifdef __NetBSD_Version__
823e07920fSDavid van Moolenbroek #include <util.h>
833e07920fSDavid van Moolenbroek #include "utmpentry.h"
843e07920fSDavid van Moolenbroek #endif /* __NetBSD_Version__ */
853e07920fSDavid van Moolenbroek #ifdef __FreeBSD_version
863e07920fSDavid van Moolenbroek #include <libutil.h>
873e07920fSDavid van Moolenbroek #include <sys/stat.h>
883e07920fSDavid van Moolenbroek #include <sys/uio.h>
893e07920fSDavid van Moolenbroek #include <limits.h>
903e07920fSDavid van Moolenbroek #endif /* __FreeBSD_version */
913e07920fSDavid van Moolenbroek 
923e07920fSDavid van Moolenbroek #ifndef DISABLE_TLS
933e07920fSDavid van Moolenbroek #include <netinet/tcp.h>
943e07920fSDavid van Moolenbroek #include <openssl/ssl.h>
953e07920fSDavid van Moolenbroek #endif /* !DISABLE_TLS */
963e07920fSDavid van Moolenbroek 
973e07920fSDavid van Moolenbroek #include <sys/stdint.h>
983e07920fSDavid van Moolenbroek #include <sys/resource.h>
993e07920fSDavid van Moolenbroek 
1003e07920fSDavid van Moolenbroek #include "pathnames.h"
1013e07920fSDavid van Moolenbroek #include <sys/syslog.h>
1023e07920fSDavid van Moolenbroek 
1033e07920fSDavid van Moolenbroek /* some differences between the BSDs  */
1043e07920fSDavid van Moolenbroek #ifdef __FreeBSD_version
1053e07920fSDavid van Moolenbroek #undef _PATH_UNIX
1063e07920fSDavid van Moolenbroek #define _PATH_UNIX "kernel"
1073e07920fSDavid van Moolenbroek #define HAVE_STRNDUP 0
1083e07920fSDavid van Moolenbroek #endif /* __FreeBSD_version */
1093e07920fSDavid van Moolenbroek 
1103e07920fSDavid van Moolenbroek #ifdef __NetBSD_Version__
1113e07920fSDavid van Moolenbroek #define HAVE_STRNDUP 1
1123e07920fSDavid van Moolenbroek #define HAVE_DEHUMANIZE_NUMBER 1
1133e07920fSDavid van Moolenbroek #endif /* __NetBSD_Version__ */
1143e07920fSDavid van Moolenbroek 
115*0a6a1f1dSLionel Sambuc #if defined(__minix)
1163e07920fSDavid van Moolenbroek #undef _PATH_UNIX
1173e07920fSDavid van Moolenbroek #define _PATH_UNIX "kernel"
118*0a6a1f1dSLionel Sambuc #endif /* defined(__minix) */
1193e07920fSDavid van Moolenbroek 
1203e07920fSDavid van Moolenbroek #ifndef HAVE_DEHUMANIZE_NUMBER	/* not in my 4.0-STABLE yet */
1213e07920fSDavid van Moolenbroek extern int dehumanize_number(const char *str, int64_t *size);
1223e07920fSDavid van Moolenbroek #endif /* !HAVE_DEHUMANIZE_NUMBER */
1233e07920fSDavid van Moolenbroek 
1243e07920fSDavid van Moolenbroek #if !HAVE_STRNDUP
1253e07920fSDavid van Moolenbroek char *strndup(const char *str, size_t n);
1263e07920fSDavid van Moolenbroek #endif /* !HAVE_STRNDUP */
1273e07920fSDavid van Moolenbroek 
1283e07920fSDavid van Moolenbroek #ifdef LIBWRAP
1293e07920fSDavid van Moolenbroek #include <tcpd.h>
1303e07920fSDavid van Moolenbroek #endif
1313e07920fSDavid van Moolenbroek 
1323e07920fSDavid van Moolenbroek #define FDMASK(fd)	(1 << (fd))
1333e07920fSDavid van Moolenbroek 
1343e07920fSDavid van Moolenbroek #define A_CNT(x)	(sizeof((x)) / sizeof((x)[0]))
1353e07920fSDavid van Moolenbroek 
1363e07920fSDavid van Moolenbroek /* debug messages with categories */
1373e07920fSDavid van Moolenbroek #define D_NONE	   0
1383e07920fSDavid van Moolenbroek #define D_CALL	   1	/* function calls */
1393e07920fSDavid van Moolenbroek #define D_DATA	   2	/* syslog message reading/formatting */
1403e07920fSDavid van Moolenbroek #define D_NET	   4	/* sockets/network */
1413e07920fSDavid van Moolenbroek #define D_FILE	   8	/* local files */
1423e07920fSDavid van Moolenbroek #define D_TLS	  16	/* TLS */
1433e07920fSDavid van Moolenbroek #define D_PARSE	  32	/* configuration/parsing */
1443e07920fSDavid van Moolenbroek #define D_EVENT	  64	/* libevent */
1453e07920fSDavid van Moolenbroek #define D_BUFFER 128	/* message queues */
1463e07920fSDavid van Moolenbroek #define D_MEM	 256	/* malloc/free */
1473e07920fSDavid van Moolenbroek #define D_MEM2	1024	/* every single malloc/free */
1483e07920fSDavid van Moolenbroek #define D_SIGN	2048	/* -sign */
1493e07920fSDavid van Moolenbroek #define D_MISC	4096	/* everything else */
1503e07920fSDavid van Moolenbroek #define D_ALL	(D_CALL | D_DATA | D_NET | D_FILE | D_TLS | D_PARSE |  \
1513e07920fSDavid van Moolenbroek 		 D_EVENT | D_BUFFER | D_MEM | D_MEM2 | D_SIGN | D_MISC)
1523e07920fSDavid van Moolenbroek #define D_DEFAULT (D_CALL | D_NET | D_FILE | D_TLS | D_MISC)
1533e07920fSDavid van Moolenbroek 
1543e07920fSDavid van Moolenbroek 
1553e07920fSDavid van Moolenbroek /* build with -DNDEBUG to remove all assert()s and DPRINTF()s */
1563e07920fSDavid van Moolenbroek #ifdef NDEBUG
1573e07920fSDavid van Moolenbroek #define DPRINTF(x, ...) (void)0
1583e07920fSDavid van Moolenbroek #else
159*0a6a1f1dSLionel Sambuc void dbprintf(const char *, const char *, size_t, const char *, ...)
160*0a6a1f1dSLionel Sambuc     __printflike(4, 5);
1613e07920fSDavid van Moolenbroek #define DPRINTF(x, ...) /*LINTED null effect */(void)(Debug & (x) \
162*0a6a1f1dSLionel Sambuc     ? dbprintf(__FILE__, __func__, __LINE__, __VA_ARGS__) : ((void)0))
1633e07920fSDavid van Moolenbroek #endif
1643e07920fSDavid van Moolenbroek 
1653e07920fSDavid van Moolenbroek /* shortcuts for libevent */
1663e07920fSDavid van Moolenbroek #define EVENT_ADD(x) do {						\
1673e07920fSDavid van Moolenbroek 	DPRINTF(D_EVENT, "event_add(%s@%p)\n", #x, x);			\
1683e07920fSDavid van Moolenbroek 	if (event_add(x, NULL) == -1) {					\
1693e07920fSDavid van Moolenbroek 		DPRINTF(D_EVENT, "Failure in event_add()\n");		\
1703e07920fSDavid van Moolenbroek 	}								\
1713e07920fSDavid van Moolenbroek } while (/*CONSTCOND*/0)
1723e07920fSDavid van Moolenbroek #define RETRYEVENT_ADD(x) do {						\
1733e07920fSDavid van Moolenbroek 	struct timeval _tv;						\
1743e07920fSDavid van Moolenbroek 	_tv.tv_sec = 0;							\
1753e07920fSDavid van Moolenbroek 	_tv.tv_usec = TLS_RETRY_EVENT_USEC;				\
1763e07920fSDavid van Moolenbroek 	DPRINTF(D_EVENT, "retryevent_add(%s@%p)\n", #x, x);		\
1773e07920fSDavid van Moolenbroek 	if (event_add(x, &_tv) == -1) {					\
1783e07920fSDavid van Moolenbroek 		DPRINTF(D_EVENT, "Failure in event_add()\n");		\
1793e07920fSDavid van Moolenbroek 	}								\
1803e07920fSDavid van Moolenbroek } while (/*CONSTCOND*/0)
1813e07920fSDavid van Moolenbroek #define DEL_EVENT(x) do {						\
1823e07920fSDavid van Moolenbroek 	DPRINTF(D_MEM2, "DEL_EVENT(%s@%p)\n", #x, x);			\
1833e07920fSDavid van Moolenbroek 	if ((x) && (event_del(x) == -1)) {				\
1843e07920fSDavid van Moolenbroek 		DPRINTF(D_EVENT, "Failure in event_del()\n");		\
1853e07920fSDavid van Moolenbroek 	}								\
1863e07920fSDavid van Moolenbroek } while (/*CONSTCOND*/0)
1873e07920fSDavid van Moolenbroek 
1883e07920fSDavid van Moolenbroek /* safe calls to free() */
1893e07920fSDavid van Moolenbroek #define FREEPTR(x)	if (x) {					\
1903e07920fSDavid van Moolenbroek 		DPRINTF(D_MEM2, "free(%s@%p)\n", #x, x);		\
1913e07920fSDavid van Moolenbroek 		free(x);	 x = NULL; }
1923e07920fSDavid van Moolenbroek #define FREE_SSL(x)	if (x) {					\
1933e07920fSDavid van Moolenbroek 		DPRINTF(D_MEM2, "SSL_free(%s@%p)\n", #x, x);		\
1943e07920fSDavid van Moolenbroek 		SSL_free(x);	 x = NULL; }
1953e07920fSDavid van Moolenbroek #define FREE_SSL_CTX(x) if (x) {					\
1963e07920fSDavid van Moolenbroek 		DPRINTF(D_MEM2, "SSL_CTX_free(%s@%p)\n", #x, x);	\
1973e07920fSDavid van Moolenbroek 		SSL_CTX_free(x); x = NULL; }
1983e07920fSDavid van Moolenbroek 
1993e07920fSDavid van Moolenbroek /* reference counting macros for buffers */
2003e07920fSDavid van Moolenbroek #define NEWREF(x) ((x) ? (DPRINTF(D_BUFFER, "inc refcount of " #x \
2013e07920fSDavid van Moolenbroek 			" @ %p: %zu --> %zu\n", (x), (x)->refcount, \
2023e07920fSDavid van Moolenbroek 			(x)->refcount + 1), (x)->refcount++, (x))\
2033e07920fSDavid van Moolenbroek 		       : (DPRINTF(D_BUFFER, "inc refcount of NULL!\n"), NULL))
2043e07920fSDavid van Moolenbroek #define DELREF(x) /*LINTED null effect*/(void)((x) ? (DPRINTF(D_BUFFER, "dec refcount of " #x \
2053e07920fSDavid van Moolenbroek 			" @ %p: %zu --> %zu\n", (x), (x)->refcount, \
2063e07920fSDavid van Moolenbroek 			(x)->refcount - 1), buf_msg_free(x), NULL) \
2073e07920fSDavid van Moolenbroek 		       : (DPRINTF(D_BUFFER, "dec refcount of NULL!\n"), NULL))
2083e07920fSDavid van Moolenbroek 
2093e07920fSDavid van Moolenbroek /* assumption:
2103e07920fSDavid van Moolenbroek  * - malloc()/calloc() only fails if not enough memory available
2113e07920fSDavid van Moolenbroek  * - once init() has set up all global variables etc.
2123e07920fSDavid van Moolenbroek  *   the bulk of available memory is used for buffers
2133e07920fSDavid van Moolenbroek  *   and can be freed if necessary
2143e07920fSDavid van Moolenbroek  */
2153e07920fSDavid van Moolenbroek #define MALLOC(ptr, size) do {						\
2163e07920fSDavid van Moolenbroek 	while(!(ptr = malloc(size))) {					\
2173e07920fSDavid van Moolenbroek 		DPRINTF(D_MEM, "Unable to allocate memory");		\
2183e07920fSDavid van Moolenbroek 		message_allqueues_purge();				\
2193e07920fSDavid van Moolenbroek 	}								\
2203e07920fSDavid van Moolenbroek 	DPRINTF(D_MEM2, "MALLOC(%s@%p, %zu)\n", #ptr, ptr, size);	\
2213e07920fSDavid van Moolenbroek } while (/*CONSTCOND*/0)
2223e07920fSDavid van Moolenbroek 
2233e07920fSDavid van Moolenbroek #define CALLOC(ptr, size) do {						\
2243e07920fSDavid van Moolenbroek 	while(!(ptr = calloc(1, size))) {				\
2253e07920fSDavid van Moolenbroek 		DPRINTF(D_MEM, "Unable to allocate memory");		\
2263e07920fSDavid van Moolenbroek 		message_allqueues_purge();				\
2273e07920fSDavid van Moolenbroek 	}								\
2283e07920fSDavid van Moolenbroek 	DPRINTF(D_MEM2, "CALLOC(%s@%p, %zu)\n", #ptr, ptr, size);	\
2293e07920fSDavid van Moolenbroek } while (/*CONSTCOND*/0)
2303e07920fSDavid van Moolenbroek 
2313e07920fSDavid van Moolenbroek /* define strlen(NULL) to be 0 */
2323e07920fSDavid van Moolenbroek #define SAFEstrlen(x) ((x) ? strlen(x) : 0)
2333e07920fSDavid van Moolenbroek 
2343e07920fSDavid van Moolenbroek /* shorthand to block/restore signals for the duration of one function */
2353e07920fSDavid van Moolenbroek #define BLOCK_SIGNALS(omask, newmask) do {				\
2363e07920fSDavid van Moolenbroek 	sigemptyset(&newmask);						\
2373e07920fSDavid van Moolenbroek 	sigaddset(&newmask, SIGHUP);					\
2383e07920fSDavid van Moolenbroek 	sigaddset(&newmask, SIGALRM);					\
2393e07920fSDavid van Moolenbroek 	sigprocmask(SIG_BLOCK, &newmask, &omask);			\
2403e07920fSDavid van Moolenbroek } while (/*CONSTCOND*/0)
2413e07920fSDavid van Moolenbroek 
2423e07920fSDavid van Moolenbroek #define RESTORE_SIGNALS(omask) sigprocmask(SIG_SETMASK, &omask, NULL)
2433e07920fSDavid van Moolenbroek 
2443e07920fSDavid van Moolenbroek /* small optimization to call send_queue() only if queue has elements */
2453e07920fSDavid van Moolenbroek #define SEND_QUEUE(f) do {						\
2463e07920fSDavid van Moolenbroek 	if ((f)->f_qelements)						\
2473e07920fSDavid van Moolenbroek 		send_queue(0, 0, f);	      				\
2483e07920fSDavid van Moolenbroek } while (/*CONSTCOND*/0)
2493e07920fSDavid van Moolenbroek 
2503e07920fSDavid van Moolenbroek #define MAXUNAMES		20	/* maximum number of user names */
2513e07920fSDavid van Moolenbroek #define BSD_TIMESTAMPLEN	14+1
2523e07920fSDavid van Moolenbroek #define MAX_TIMESTAMPLEN	31+1
2533e07920fSDavid van Moolenbroek 
2543e07920fSDavid van Moolenbroek /* maximum field lengths in syslog-protocol */
2553e07920fSDavid van Moolenbroek #define PRI_MAX	      5
2563e07920fSDavid van Moolenbroek #define HOST_MAX    255
2573e07920fSDavid van Moolenbroek #define APPNAME_MAX  48
2583e07920fSDavid van Moolenbroek #define PROCID_MAX  128
2593e07920fSDavid van Moolenbroek #define MSGID_MAX    32
2603e07920fSDavid van Moolenbroek /* longest possible header length */
2613e07920fSDavid van Moolenbroek #define HEADER_LEN_MAX (PRI_MAX + 1 + 1 + MAX_TIMESTAMPLEN + 1 + HOST_MAX \
2623e07920fSDavid van Moolenbroek 			+ 1 + APPNAME_MAX + 1 + PROCID_MAX + 1 + MSGID_MAX)
2633e07920fSDavid van Moolenbroek 
2643e07920fSDavid van Moolenbroek /* allowed number of priorities by IETF standards */
2653e07920fSDavid van Moolenbroek #define IETF_NUM_PRIVALUES  192
2663e07920fSDavid van Moolenbroek 
2673e07920fSDavid van Moolenbroek /* check if message with fac/sev belogs to a destination f */
2683e07920fSDavid van Moolenbroek #define MATCH_PRI(f, fac, sev) \
2693e07920fSDavid van Moolenbroek 	   (  (((f)->f_pcmp[fac] & PRI_EQ) && ((f)->f_pmask[fac] == (sev))) \
2703e07920fSDavid van Moolenbroek 	    ||(((f)->f_pcmp[fac] & PRI_LT) && ((f)->f_pmask[fac]  < (sev)))  \
2713e07920fSDavid van Moolenbroek 	    ||(((f)->f_pcmp[fac] & PRI_GT) && ((f)->f_pmask[fac]  > (sev)))  \
2723e07920fSDavid van Moolenbroek 	   )
2733e07920fSDavid van Moolenbroek 
2743e07920fSDavid van Moolenbroek /* shorthand to test Byte Order Mark which indicates UTF-8 content */
2753e07920fSDavid van Moolenbroek #define IS_BOM(p) ( \
2763e07920fSDavid van Moolenbroek     (p)[0] != '\0' && (unsigned char)(p)[0] == (unsigned char)0xEF && \
2773e07920fSDavid van Moolenbroek     (p)[1] != '\0' && (unsigned char)(p)[1] == (unsigned char)0xBB && \
2783e07920fSDavid van Moolenbroek     (p)[2] != '\0' && (unsigned char)(p)[2] == (unsigned char)0xBF)
2793e07920fSDavid van Moolenbroek 
2803e07920fSDavid van Moolenbroek /* message buffer container used for processing, formatting, and queueing */
2813e07920fSDavid van Moolenbroek struct buf_msg {
2823e07920fSDavid van Moolenbroek 	size_t	 refcount;
2833e07920fSDavid van Moolenbroek 	int	 pri;
2843e07920fSDavid van Moolenbroek 	int	 flags;
2853e07920fSDavid van Moolenbroek 	char	*timestamp;
2863e07920fSDavid van Moolenbroek 	char	*recvhost;
2873e07920fSDavid van Moolenbroek 	char	*host;
2883e07920fSDavid van Moolenbroek 	char	*prog;
2893e07920fSDavid van Moolenbroek 	char	*pid;
2903e07920fSDavid van Moolenbroek 	char	*msgid;
2913e07920fSDavid van Moolenbroek 	char	*sd;	    /* structured data */
2923e07920fSDavid van Moolenbroek 	char	*msg;	    /* message content */
2933e07920fSDavid van Moolenbroek 	char	*msgorig;   /* in case we advance *msg beyond header fields
2943e07920fSDavid van Moolenbroek 			       we still want to free() the original ptr  */
2953e07920fSDavid van Moolenbroek 	size_t	 msglen;    /* strlen(msg) */
2963e07920fSDavid van Moolenbroek 	size_t	 msgsize;   /* allocated memory size   */
2973e07920fSDavid van Moolenbroek 	size_t	 tlsprefixlen; /* bytes for the TLS length prefix */
2983e07920fSDavid van Moolenbroek 	size_t	 prilen;       /* bytes for priority and version  */
2993e07920fSDavid van Moolenbroek };
3003e07920fSDavid van Moolenbroek 
3013e07920fSDavid van Moolenbroek /* queue of messages */
3023e07920fSDavid van Moolenbroek struct buf_queue {
3033e07920fSDavid van Moolenbroek 	struct buf_msg* msg;
3043e07920fSDavid van Moolenbroek 	STAILQ_ENTRY(buf_queue) entries;
3053e07920fSDavid van Moolenbroek };
3063e07920fSDavid van Moolenbroek STAILQ_HEAD(buf_queue_head, buf_queue);
3073e07920fSDavid van Moolenbroek 
3083e07920fSDavid van Moolenbroek /* a pair of a socket and an associated event object */
3093e07920fSDavid van Moolenbroek struct socketEvent {
3103e07920fSDavid van Moolenbroek 	int fd;
3113e07920fSDavid van Moolenbroek 	int af;
3123e07920fSDavid van Moolenbroek 	struct event *ev;
3133e07920fSDavid van Moolenbroek };
3143e07920fSDavid van Moolenbroek 
3153e07920fSDavid van Moolenbroek /*
3163e07920fSDavid van Moolenbroek  * Flags to logmsg().
3173e07920fSDavid van Moolenbroek  */
3183e07920fSDavid van Moolenbroek #define IGN_CONS	0x001	/* don't print on console */
3193e07920fSDavid van Moolenbroek #define SYNC_FILE	0x002	/* do fsync on file after printing */
3203e07920fSDavid van Moolenbroek #define ADDDATE		0x004	/* add a date to the message */
3213e07920fSDavid van Moolenbroek #define MARK		0x008	/* this message is a mark */
3223e07920fSDavid van Moolenbroek #define ISKERNEL	0x010	/* kernel generated message */
3233e07920fSDavid van Moolenbroek #define BSDSYSLOG	0x020	/* line in traditional BSD Syslog format */
3243e07920fSDavid van Moolenbroek #define SIGN_MSG	0x040	/* syslog-sign data, not signed again */
3253e07920fSDavid van Moolenbroek 
3263e07920fSDavid van Moolenbroek /* strategies for message_queue_purge() */
3273e07920fSDavid van Moolenbroek #define PURGE_OLDEST		1
3283e07920fSDavid van Moolenbroek #define PURGE_BY_PRIORITY	2
3293e07920fSDavid van Moolenbroek 
3303e07920fSDavid van Moolenbroek /*
3313e07920fSDavid van Moolenbroek  * This structure represents the files that will have log
3323e07920fSDavid van Moolenbroek  * copies printed.
3333e07920fSDavid van Moolenbroek  * We require f_file to be valid if f_type is F_FILE, F_CONSOLE, F_TTY,
3343e07920fSDavid van Moolenbroek  * or if f_type is F_PIPE and f_pid > 0.
3353e07920fSDavid van Moolenbroek  */
3363e07920fSDavid van Moolenbroek 
3373e07920fSDavid van Moolenbroek struct filed {
3383e07920fSDavid van Moolenbroek 	struct	filed *f_next;		/* next in linked list */
3393e07920fSDavid van Moolenbroek 	short	f_type;			/* entry type, see below */
3403e07920fSDavid van Moolenbroek 	short	f_file;			/* file descriptor */
3413e07920fSDavid van Moolenbroek 	time_t	f_time;			/* time this was last written */
3423e07920fSDavid van Moolenbroek 	char	*f_host;		/* host from which to record */
3433e07920fSDavid van Moolenbroek 	u_char	f_pmask[LOG_NFACILITIES+1];	/* priority mask */
3443e07920fSDavid van Moolenbroek 	u_char	f_pcmp[LOG_NFACILITIES+1];	/* compare priority */
3453e07920fSDavid van Moolenbroek #define PRI_LT	0x1
3463e07920fSDavid van Moolenbroek #define PRI_EQ	0x2
3473e07920fSDavid van Moolenbroek #define PRI_GT	0x4
3483e07920fSDavid van Moolenbroek 	char	*f_program;		/* program this applies to */
3493e07920fSDavid van Moolenbroek 	union {
3503e07920fSDavid van Moolenbroek 		char	f_uname[MAXUNAMES][UT_NAMESIZE+1];
3513e07920fSDavid van Moolenbroek 		struct {
3523e07920fSDavid van Moolenbroek 			char	f_hname[MAXHOSTNAMELEN];
3533e07920fSDavid van Moolenbroek 			struct	addrinfo *f_addr;
3543e07920fSDavid van Moolenbroek 		} f_forw;		/* UDP forwarding address */
3553e07920fSDavid van Moolenbroek #ifndef DISABLE_TLS
3563e07920fSDavid van Moolenbroek 		struct {
3573e07920fSDavid van Moolenbroek 			SSL	*ssl;			/* SSL object  */
3583e07920fSDavid van Moolenbroek 			struct tls_conn_settings *tls_conn;  /* certificate info */
3593e07920fSDavid van Moolenbroek 		} f_tls;		/* TLS forwarding address */
3603e07920fSDavid van Moolenbroek #endif /* !DISABLE_TLS */
3613e07920fSDavid van Moolenbroek 		char	f_fname[MAXPATHLEN];
3623e07920fSDavid van Moolenbroek 		struct {
3633e07920fSDavid van Moolenbroek 			char	f_pname[MAXPATHLEN];
3643e07920fSDavid van Moolenbroek 			pid_t	f_pid;
3653e07920fSDavid van Moolenbroek 		} f_pipe;
3663e07920fSDavid van Moolenbroek 	} f_un;
3673e07920fSDavid van Moolenbroek #ifndef DISABLE_SIGN
3683e07920fSDavid van Moolenbroek 	struct signature_group_t *f_sg;	     /* one signature group */
3693e07920fSDavid van Moolenbroek #endif /* !DISABLE_SIGN */
3703e07920fSDavid van Moolenbroek 	struct buf_queue_head f_qhead;	     /* undelivered msgs queue */
3713e07920fSDavid van Moolenbroek 	size_t	      	      f_qelements;   /* elements in queue */
3723e07920fSDavid van Moolenbroek 	size_t		      f_qsize;	     /* size of queue in bytes */
3733e07920fSDavid van Moolenbroek 	struct buf_msg	     *f_prevmsg;     /* last message logged */
3743e07920fSDavid van Moolenbroek 	struct event	     *f_sq_event;    /* timer for send_queue() */
3753e07920fSDavid van Moolenbroek 	int		      f_prevcount;   /* repetition cnt of prevmsg */
3763e07920fSDavid van Moolenbroek 	int		      f_repeatcount; /* number of "repeated" msgs */
3773e07920fSDavid van Moolenbroek 	int		      f_lasterror;   /* last error on writev() */
3783e07920fSDavid van Moolenbroek 	int		      f_flags;	     /* file-specific flags */
3793e07920fSDavid van Moolenbroek #define FFLAG_SYNC	0x01	/* for F_FILE: fsync after every msg */
3803e07920fSDavid van Moolenbroek #define FFLAG_FULL	0x02	/* for F_FILE | F_PIPE: write PRI header */
3813e07920fSDavid van Moolenbroek #define FFLAG_SIGN	0x04	/* for syslog-sign with SG="3":
3823e07920fSDavid van Moolenbroek 				 * sign the messages to this destination */
3833e07920fSDavid van Moolenbroek };
3843e07920fSDavid van Moolenbroek 
3853e07920fSDavid van Moolenbroek #ifndef DISABLE_TLS
3863e07920fSDavid van Moolenbroek 
3873e07920fSDavid van Moolenbroek /* linked list for allowed TLS peer credentials
3883e07920fSDavid van Moolenbroek  * (one for fingerprint, one for cert-files)
3893e07920fSDavid van Moolenbroek  */
3903e07920fSDavid van Moolenbroek SLIST_HEAD(peer_cred_head, peer_cred);
3913e07920fSDavid van Moolenbroek struct peer_cred {
3923e07920fSDavid van Moolenbroek 	SLIST_ENTRY(peer_cred) entries;
3933e07920fSDavid van Moolenbroek 	char *data;
3943e07920fSDavid van Moolenbroek };
3953e07920fSDavid van Moolenbroek 
3963e07920fSDavid van Moolenbroek /* config options for TLS server-side */
3973e07920fSDavid van Moolenbroek struct tls_global_options_t {
3983e07920fSDavid van Moolenbroek 	SSL_CTX *global_TLS_CTX;
3993e07920fSDavid van Moolenbroek 	struct peer_cred_head fprint_head;  /* trusted client fingerprints */
4003e07920fSDavid van Moolenbroek 	struct peer_cred_head cert_head;    /* trusted client cert files   */
4013e07920fSDavid van Moolenbroek 	char *keyfile;	    /* file with private key	 */
4023e07920fSDavid van Moolenbroek 	char *certfile;	    /* file with own certificate */
4033e07920fSDavid van Moolenbroek 	char *CAfile;	    /* file with CA certificate	 */
4043e07920fSDavid van Moolenbroek 	char *CAdir;	    /* alternative: path to directory with CA certs */
4053e07920fSDavid van Moolenbroek 	char *x509verify;   /* level of peer verification */
4063e07920fSDavid van Moolenbroek 	char *bindhost;	    /* hostname/IP to bind to	  */
4073e07920fSDavid van Moolenbroek 	char *bindport;	    /* port/service to bind to	  */
4083e07920fSDavid van Moolenbroek 	char *server;	    /* if !NULL: do not listen to incoming TLS	  */
4093e07920fSDavid van Moolenbroek 	char *gen_cert;	    /* if !NULL: generate self-signed certificate */
4103e07920fSDavid van Moolenbroek };
4113e07920fSDavid van Moolenbroek 
4123e07920fSDavid van Moolenbroek /* TLS needs three sets of sockets:
4133e07920fSDavid van Moolenbroek  * - listening sockets: a fixed size array TLS_Listen_Set, just like finet for UDP.
4143e07920fSDavid van Moolenbroek  * - outgoing connections: managed as part of struct filed.
4153e07920fSDavid van Moolenbroek  * - incoming connections: variable sized, thus a linked list TLS_Incoming.
4163e07920fSDavid van Moolenbroek  */
4173e07920fSDavid van Moolenbroek /* every connection has its own input buffer with status
4183e07920fSDavid van Moolenbroek  * variables for message reading */
4193e07920fSDavid van Moolenbroek SLIST_HEAD(TLS_Incoming, TLS_Incoming_Conn);
4203e07920fSDavid van Moolenbroek 
4213e07920fSDavid van Moolenbroek struct TLS_Incoming_Conn {
4223e07920fSDavid van Moolenbroek 	SLIST_ENTRY(TLS_Incoming_Conn) entries;
4233e07920fSDavid van Moolenbroek 	struct tls_conn_settings *tls_conn;
4243e07920fSDavid van Moolenbroek 	int socket;
4253e07920fSDavid van Moolenbroek 	char *inbuf;		    /* input buffer */
4263e07920fSDavid van Moolenbroek 	size_t inbuflen;
4273e07920fSDavid van Moolenbroek 	size_t cur_msg_len;	    /* length of current msg */
4283e07920fSDavid van Moolenbroek 	size_t cur_msg_start;	    /* beginning of current msg */
4293e07920fSDavid van Moolenbroek 	size_t read_pos;	    /* ring buffer position to write to */
4303e07920fSDavid van Moolenbroek 	size_t errorcount;	    /* to close faulty connections */
4313e07920fSDavid van Moolenbroek 	bool closenow;		    /* close connection as soon as buffer processed */
4323e07920fSDavid van Moolenbroek 	bool dontsave;		    /* for receiving oversized messages w/o saving them */
4333e07920fSDavid van Moolenbroek };
4343e07920fSDavid van Moolenbroek 
4353e07920fSDavid van Moolenbroek #endif /* !DISABLE_TLS */
4363e07920fSDavid van Moolenbroek 
4373e07920fSDavid van Moolenbroek #endif /*SYSLOGD_H_*/
438