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