144743Smarkm /*
244743Smarkm  * Routines to report various classes of problems. Each report is decorated
344743Smarkm  * with the current context (file name and line number), if available.
444743Smarkm  *
544743Smarkm  * tcpd_warn() reports a problem and proceeds.
644743Smarkm  *
744743Smarkm  * tcpd_jump() reports a problem and jumps.
844743Smarkm  *
944743Smarkm  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
1044743Smarkm  */
1144743Smarkm
1244743Smarkm#ifndef lint
1344743Smarkmstatic char sccsid[] = "@(#) diag.c 1.1 94/12/28 17:42:20";
1444743Smarkm#endif
1544743Smarkm
1644743Smarkm/* System libraries */
1744743Smarkm
1844743Smarkm#include <syslog.h>
1944743Smarkm#include <stdio.h>
2044743Smarkm#include <setjmp.h>
2144743Smarkm
2244743Smarkm/* Local stuff */
2344743Smarkm
2444743Smarkm#include "tcpd.h"
2544743Smarkm#include "mystdarg.h"
2644743Smarkm
2744743Smarkmstruct tcpd_context tcpd_context;
2844743Smarkmjmp_buf tcpd_buf;
2944743Smarkm
3044743Smarkm/* tcpd_diag - centralize error reporter */
3144743Smarkm
3244743Smarkmstatic void tcpd_diag(severity, tag, format, ap)
3344743Smarkmint     severity;
3444743Smarkmchar   *tag;
3544743Smarkmchar   *format;
3644743Smarkmva_list ap;
3744743Smarkm{
3844743Smarkm    char    fmt[BUFSIZ];
3944743Smarkm
4044743Smarkm    if (tcpd_context.file)
4144743Smarkm	sprintf(fmt, "%s: %s, line %d: %s",
4244743Smarkm		tag, tcpd_context.file, tcpd_context.line, format);
4344743Smarkm    else
4444743Smarkm	sprintf(fmt, "%s: %s", tag, format);
4544743Smarkm    vsyslog(severity, fmt, ap);
4644743Smarkm}
4744743Smarkm
4844743Smarkm/* tcpd_warn - report problem of some sort and proceed */
4944743Smarkm
5044743Smarkmvoid    VARARGS(tcpd_warn, char *, format)
5144743Smarkm{
5244743Smarkm    va_list ap;
5344743Smarkm
5444743Smarkm    VASTART(ap, char *, format);
5544743Smarkm    tcpd_diag(LOG_ERR, "warning", format, ap);
5644743Smarkm    VAEND(ap);
5744743Smarkm}
5844743Smarkm
5944743Smarkm/* tcpd_jump - report serious problem and jump */
6044743Smarkm
6144743Smarkmvoid    VARARGS(tcpd_jump, char *, format)
6244743Smarkm{
6344743Smarkm    va_list ap;
6444743Smarkm
6544743Smarkm    VASTART(ap, char *, format);
6644743Smarkm    tcpd_diag(LOG_ERR, "error", format, ap);
6744743Smarkm    VAEND(ap);
6844743Smarkm    longjmp(tcpd_buf, AC_ERROR);
6944743Smarkm}
70