summaryrefslogtreecommitdiff
path: root/diag.c
diff options
context:
space:
mode:
Diffstat (limited to 'diag.c')
-rw-r--r--diag.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/diag.c b/diag.c
new file mode 100644
index 0000000..e0bd792
--- /dev/null
+++ b/diag.c
@@ -0,0 +1,69 @@
+ /*
+ * Routines to report various classes of problems. Each report is decorated
+ * with the current context (file name and line number), if available.
+ *
+ * tcpd_warn() reports a problem and proceeds.
+ *
+ * tcpd_jump() reports a problem and jumps.
+ *
+ * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#) diag.c 1.1 94/12/28 17:42:20";
+#endif
+
+/* System libraries */
+
+#include <syslog.h>
+#include <stdio.h>
+#include <setjmp.h>
+
+/* Local stuff */
+
+#include "tcpd.h"
+#include "mystdarg.h"
+
+struct tcpd_context tcpd_context;
+jmp_buf tcpd_buf;
+
+/* tcpd_diag - centralize error reporter */
+
+static void tcpd_diag(severity, tag, format, ap)
+int severity;
+char *tag;
+char *format;
+va_list ap;
+{
+ char fmt[BUFSIZ];
+
+ if (tcpd_context.file)
+ sprintf(fmt, "%s: %s, line %d: %s",
+ tag, tcpd_context.file, tcpd_context.line, format);
+ else
+ sprintf(fmt, "%s: %s", tag, format);
+ vsyslog(severity, fmt, ap);
+}
+
+/* tcpd_warn - report problem of some sort and proceed */
+
+void VARARGS(tcpd_warn, char *, format)
+{
+ va_list ap;
+
+ VASTART(ap, char *, format);
+ tcpd_diag(LOG_ERR, "warning", format, ap);
+ VAEND(ap);
+}
+
+/* tcpd_jump - report serious problem and jump */
+
+void VARARGS(tcpd_jump, char *, format)
+{
+ va_list ap;
+
+ VASTART(ap, char *, format);
+ tcpd_diag(LOG_ERR, "error", format, ap);
+ VAEND(ap);
+ longjmp(tcpd_buf, AC_ERROR);
+}