Initial import from FreeBSD RELENG_4:
[dragonfly.git] / usr.sbin / atm / scspd / scsp_log.c
1 /*
2  *
3  * ===================================
4  * HARP  |  Host ATM Research Platform
5  * ===================================
6  *
7  *
8  * This Host ATM Research Platform ("HARP") file (the "Software") is
9  * made available by Network Computing Services, Inc. ("NetworkCS")
10  * "AS IS".  NetworkCS does not provide maintenance, improvements or
11  * support of any kind.
12  *
13  * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14  * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15  * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16  * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17  * In no event shall NetworkCS be responsible for any damages, including
18  * but not limited to consequential damages, arising from or relating to
19  * any use of the Software or related support.
20  *
21  * Copyright 1994-1998 Network Computing Services, Inc.
22  *
23  * Copies of this Software may be made, however, the above copyright
24  * notice must be reproduced on all copies.
25  *
26  *      @(#) $FreeBSD: src/usr.sbin/atm/scspd/scsp_log.c,v 1.3 1999/08/28 01:15:33 peter Exp $
27  *
28  */
29
30
31 /*
32  * Server Cache Synchronization Protocol (SCSP) Support
33  * ----------------------------------------------------
34  *
35  * SCSP logging routines
36  *
37  */
38
39 #include <sys/types.h>
40 #include <sys/param.h>
41 #include <sys/socket.h>
42 #include <net/if.h>
43 #include <netinet/in.h>
44 #include <netatm/port.h> 
45 #include <netatm/queue.h> 
46 #include <netatm/atm.h>
47 #include <netatm/atm_if.h>
48 #include <netatm/atm_sap.h>
49 #include <netatm/atm_sys.h>
50 #include <netatm/atm_ioctl.h>
51   
52 #include <errno.h>
53 #include <libatm.h>
54 #if __STDC__
55 #include <stdarg.h>
56 #else
57 #include <varargs.h>
58 #endif
59 #include <stdio.h>
60 #include <stdlib.h>
61 #include <string.h>
62 #include <syslog.h>
63 #include <unistd.h>
64
65 #include "scsp_msg.h"
66 #include "scsp_if.h"
67 #include "scsp_var.h"
68
69 #ifndef lint
70 __RCSID("@(#) $FreeBSD: src/usr.sbin/atm/scspd/scsp_log.c,v 1.3 1999/08/28 01:15:33 peter Exp $");
71 #endif
72
73
74 /*
75  * Global variables
76  */
77 FILE    *scsp_trace_file = (FILE *)0;
78
79
80 /*
81  * Write a message to SCSP's log
82  *
83  * Arguments:
84  *      level   pointer to an SCSP cache key structure
85  *      fmt     printf-style format string
86  *      ...     parameters for printf-style use according to fmt
87  *
88  * Returns:
89  *      none
90  *
91  */
92 void
93 #if __STDC__
94 scsp_log(const int level, const char *fmt, ...)
95 #else
96 scsp_log(level, fmt, va_alist)
97         int     level;
98         char    *fmt;
99         va_dcl
100 #endif
101 {
102         va_list ap;
103
104 #if __STDC__
105         va_start(ap, fmt);
106 #else
107         va_start(ap);
108 #endif
109
110         /*
111          * In debug mode, just write to stdout
112          */
113         if (scsp_debug_mode) {
114                 vprintf(fmt, ap);
115                 printf("\n");
116                 return;
117         }
118
119         /*
120          * Write to syslog if it's active or if no log file is set up
121          */
122         if (scsp_log_syslog || !scsp_log_file) {
123                 vsyslog(level, fmt, ap);
124         }
125
126         /*
127          * Write to the log file if there's one set up
128          */
129         if (scsp_log_file) {
130                 vfprintf(scsp_log_file, fmt, ap);
131                 fprintf(scsp_log_file, "\n");
132         }
133
134         va_end(ap);
135 }
136
137
138 /*
139  * Open SCSP's trace file
140  *
141  * Arguments:
142  *      none
143  *
144  * Returns:
145  *      none
146  *
147  */
148 void
149 scsp_open_trace()
150 {
151         char    fname[64];
152
153         /*
154          * Build a file name
155          */
156         UM_ZERO(fname, sizeof(fname));
157         sprintf(fname, "/tmp/scspd.%d.trace", getpid());
158
159         /*
160          * Open the trace file.  If the open fails, log an error, but
161          * keep going.  The trace routine will notice that the file
162          * isn't open and won't try to write to it.
163          */
164         scsp_trace_file = fopen(fname, "w");
165         if (scsp_trace_file == (FILE *)0) {
166                 scsp_log(LOG_ERR, "Can't open trace file");
167         }
168 }
169
170
171 /*
172  * Write a message to SCSP's trace file
173  *
174  * Arguments:
175  *      fmt     printf-style format string
176  *      ...     parameters for printf-style use according to fmt
177  *
178  * Returns:
179  *      none
180  *
181  */
182 void
183 #if __STDC__
184 scsp_trace(const char *fmt, ...)
185 #else
186 scsp_trace(fmt, va_alist)
187         char    *fmt;
188         va_dcl
189 #endif
190 {
191         va_list ap;
192
193 #if __STDC__
194         va_start(ap, fmt);
195 #else
196         va_start(ap);
197 #endif
198
199         /*
200          * Write the message to the trace file, if it's open
201          */
202         if (scsp_trace_file) {
203                 vfprintf(scsp_trace_file, fmt, ap);
204         }
205
206         va_end(ap);
207 }
208
209
210 /*
211  * Write an SCSP message to SCSP's trace file
212  *
213  * Arguments:
214  *      dcsp    pointer to DCS block for the message
215  *      msg     pointer to the message
216  *      dir     a direction indicator--0 for sending, 1 for receiving
217  *
218  * Returns:
219  *      none
220  *
221  */
222 void
223 scsp_trace_msg(dcsp, msg, dir)
224         Scsp_dcs        *dcsp;
225         Scsp_msg        *msg;
226         int             dir;
227 {
228         struct in_addr  addr;
229
230         /*
231          * Copy the remote IP address into a struct in_addr
232          */
233         UM_COPY(dcsp->sd_dcsid.id, &addr.s_addr,
234                         sizeof(struct in_addr));
235         
236         /*
237          * Write the message to the trace file, if it's open
238          */
239         if (scsp_trace_file) {
240                 scsp_trace("SCSP message at 0x%x %s %s\n",
241                                 (u_long)msg,
242                                 (dir ? "received from" : "sent to"),
243                                 format_ip_addr(&addr));
244                 print_scsp_msg(scsp_trace_file, msg);
245         }
246 }
247
248
249 /*
250  * Log a memory error and exit
251  *
252  * Arguments:
253  *      cp      message to log
254  *
255  * Returns:
256  *      exits, does not return
257  *
258  */
259 void
260 scsp_mem_err(cp)
261         char    *cp;
262 {
263         scsp_log(LOG_CRIT, "out of memory: %s", cp);
264         exit(2);
265 }