1/*	$NetBSD$	*/
2
3/*++
4/* NAME
5/*	debug_peer 3
6/* SUMMARY
7/*	increase verbose logging for specific peers
8/* SYNOPSIS
9/*	#include <debug_peer.h>
10/*
11/*	void	debug_peer_init(void)
12/*
13/*	int	peer_debug_check(peer_name, peer_addr)
14/*	const char *peer_name;
15/*	const char *peer_addr;
16/*
17/*	void	debug_peer_restore()
18/* DESCRIPTION
19/*	This module implements increased verbose logging for specific
20/*	network peers.
21/*
22/*	The \fIdebug_peer_list\fR configuration parameter
23/*	specifies what peers receive this special treatment; see
24/*	namadr_list(3) for a description of the matching process.
25/*
26/*	The \fIdebug_peer_level\fR configuration parameter specifies
27/*	by what amount the verbose logging level should increase when
28/*	a peer is listed in \fIdebug_peer_list\fR.
29/*
30/*	debug_peer_init() performs initializations that must be
31/*	performed once at the start of the program.
32/*
33/*	debug_peer_check() increases the verbose logging level when the
34/*	client name or address matches the debug_peer_list pattern.
35/*	The result is non-zero when the noise leven was increased.
36/*
37/*	debug_peer_restore() restores the verbose logging level.
38/*	This routine has no effect when debug_peer_check() had no
39/*	effect; this routine can safely be called multiple times.
40/* DIAGNOSTICS
41/*	Panic: interface violations.
42/*	Fatal errors: unable to access a peer_list file; invalid
43/*	peer_list pattern; invalid verbosity level increment.
44/* SEE ALSO
45/*	msg(3) the msg_verbose variable
46/*	namadr_list(3) match host by name or by address
47/* CONFIG PARAMETERS
48/*	debug_peer_list, patterns as described in namadr_list(3)
49/*	debug_peer_level, verbose logging level
50/* LICENSE
51/* .ad
52/* .fi
53/*	The Secure Mailer license must be distributed with this software.
54/* AUTHOR(S)
55/*	Wietse Venema
56/*	IBM T.J. Watson Research
57/*	P.O. Box 704
58/*	Yorktown Heights, NY 10598, USA
59/*--*/
60
61/* System library. */
62
63#include <sys_defs.h>
64
65/* Utility library. */
66
67#include <msg.h>
68
69/* Global library. */
70
71#include <mail_params.h>
72#include <namadr_list.h>
73#include <debug_peer.h>
74#include <match_parent_style.h>
75
76/* Application-specific. */
77
78#define UNUSED_SAVED_LEVEL	(-1)
79
80static NAMADR_LIST *debug_peer_list;
81static int saved_level = UNUSED_SAVED_LEVEL;
82
83/* debug_peer_init - initialize */
84
85void    debug_peer_init(void)
86{
87    const char *myname = "debug_peer_init";
88
89    /*
90     * Sanity check.
91     */
92    if (debug_peer_list)
93	msg_panic("%s: repeated call", myname);
94    if (var_debug_peer_list == 0)
95	msg_panic("%s: uninitialized %s", myname, VAR_DEBUG_PEER_LIST);
96    if (var_debug_peer_level <= 0)
97	msg_fatal("%s: %s <= 0", myname, VAR_DEBUG_PEER_LEVEL);
98
99    /*
100     * Finally.
101     */
102    if (*var_debug_peer_list)
103	debug_peer_list =
104	    namadr_list_init(match_parent_style(VAR_DEBUG_PEER_LIST),
105			     var_debug_peer_list);
106}
107
108/* debug_peer_check - see if this peer needs verbose logging */
109
110int     debug_peer_check(const char *name, const char *addr)
111{
112
113    /*
114     * Crank up the noise when this peer is listed.
115     */
116    if (debug_peer_list != 0
117	&& saved_level == UNUSED_SAVED_LEVEL
118	&& namadr_list_match(debug_peer_list, name, addr) != 0) {
119	saved_level = msg_verbose;
120	msg_verbose += var_debug_peer_level;
121	return (1);
122    }
123    return (0);
124}
125
126/* debug_peer_restore - restore logging level */
127
128void    debug_peer_restore(void)
129{
130    if (saved_level != UNUSED_SAVED_LEVEL) {
131	msg_verbose = saved_level;
132	saved_level = UNUSED_SAVED_LEVEL;
133    }
134}
135