1 1.18 andvar /* $NetBSD: diag.c,v 1.18 2024/02/09 22:08:31 andvar Exp $ */ 2 1.3 christos 3 1.1 mrg /* 4 1.1 mrg * Routines to report various classes of problems. Each report is decorated 5 1.1 mrg * with the current context (file name and line number), if available. 6 1.5 simonb * 7 1.1 mrg * tcpd_warn() reports a problem and proceeds. 8 1.5 simonb * 9 1.1 mrg * tcpd_jump() reports a problem and jumps. 10 1.5 simonb * 11 1.1 mrg * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. 12 1.1 mrg */ 13 1.1 mrg 14 1.3 christos #include <sys/cdefs.h> 15 1.1 mrg #ifndef lint 16 1.3 christos #if 0 17 1.1 mrg static char sccsid[] = "@(#) diag.c 1.1 94/12/28 17:42:20"; 18 1.3 christos #else 19 1.18 andvar __RCSID("$NetBSD: diag.c,v 1.18 2024/02/09 22:08:31 andvar Exp $"); 20 1.3 christos #endif 21 1.1 mrg #endif 22 1.1 mrg 23 1.1 mrg /* System libraries */ 24 1.1 mrg 25 1.1 mrg #include <syslog.h> 26 1.9 matt #include <stdarg.h> 27 1.1 mrg #include <stdio.h> 28 1.10 joerg #include <stdlib.h> 29 1.1 mrg #include <setjmp.h> 30 1.7 atatat #include <string.h> 31 1.7 atatat #include <errno.h> 32 1.1 mrg 33 1.1 mrg /* Local stuff */ 34 1.1 mrg 35 1.1 mrg #include "tcpd.h" 36 1.16 christos #include "expandm.h" 37 1.1 mrg 38 1.1 mrg struct tcpd_context tcpd_context; 39 1.1 mrg jmp_buf tcpd_buf; 40 1.3 christos 41 1.9 matt static void tcpd_diag(int, const char *, const char *, va_list) 42 1.11 christos __sysloglike(3,0); 43 1.1 mrg 44 1.1 mrg /* tcpd_diag - centralize error reporter */ 45 1.1 mrg 46 1.9 matt static void 47 1.10 joerg tcpd_diag(int severity, const char *tag, const char *fmt, va_list ap) 48 1.1 mrg { 49 1.17 christos char *buf, *bufx; 50 1.16 christos 51 1.17 christos if (vasprintf(&buf, expandm(fmt, NULL, &bufx), ap) == -1) 52 1.17 christos buf = __UNCONST(fmt); 53 1.17 christos free(bufx); 54 1.12 christos 55 1.18 andvar /* construct the tag for the log entry */ 56 1.15 christos if (tcpd_context.file) 57 1.16 christos syslog(severity, "%s: %s, line %d: %s", 58 1.17 christos tag, tcpd_context.file, tcpd_context.line, buf); 59 1.15 christos else 60 1.17 christos syslog(severity, "%s: %s", tag, buf); 61 1.7 atatat 62 1.10 joerg if (buf != fmt) 63 1.17 christos free(buf); 64 1.1 mrg } 65 1.1 mrg 66 1.1 mrg /* tcpd_warn - report problem of some sort and proceed */ 67 1.1 mrg 68 1.9 matt void 69 1.9 matt tcpd_warn(const char *format, ...) 70 1.1 mrg { 71 1.1 mrg va_list ap; 72 1.1 mrg 73 1.9 matt va_start(ap, format); 74 1.1 mrg tcpd_diag(LOG_ERR, "warning", format, ap); 75 1.9 matt va_end(ap); 76 1.1 mrg } 77 1.1 mrg 78 1.1 mrg /* tcpd_jump - report serious problem and jump */ 79 1.1 mrg 80 1.9 matt void 81 1.9 matt tcpd_jump(const char *format, ...) 82 1.1 mrg { 83 1.1 mrg va_list ap; 84 1.1 mrg 85 1.9 matt va_start(ap, format); 86 1.1 mrg tcpd_diag(LOG_ERR, "error", format, ap); 87 1.9 matt va_end(ap); 88 1.1 mrg longjmp(tcpd_buf, AC_ERROR); 89 1.1 mrg } 90