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