xref: /minix3/lib/libwrap/diag.c (revision f1fab66e7dda396e0a899dafaddb9c3ac4edfcfe)
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