msyslog.c revision 182007
1/*
2 * msyslog - either send a message to the terminal or print it on
3 *	     the standard output.
4 *
5 * Converted to use varargs, much better ... jks
6 */
7
8#ifdef HAVE_CONFIG_H
9# include <config.h>
10#endif
11
12#ifdef HAVE_SYS_TYPES_H
13# include <sys/types.h>
14#endif
15#ifdef HAVE_UNISTD_H
16# include <unistd.h>
17#endif
18
19#include <stdio.h>
20
21#include "ntp_types.h"
22#include "ntp_string.h"
23#include "ntp_syslog.h"
24#include "ntp_stdlib.h"
25
26#ifdef SYS_WINNT
27# include <stdarg.h>
28# include "..\ports\winnt\libntp\messages.h"
29#endif
30
31int syslogit = 1;
32
33FILE *syslog_file = NULL;
34
35u_long ntp_syslogmask =  ~ (u_long) 0;
36
37#ifdef SYS_WINNT
38static char separator = '\\';
39#else
40static char separator = '/';
41#endif /* SYS_WINNT */
42extern	char *progname;
43
44/* Declare the local functions */
45void	addto_syslog	P((int, char *));
46void	format_errmsg   P((char *, int, const char *, int));
47
48
49/*
50 * This routine adds the contents of a buffer to the log
51 */
52void
53addto_syslog(int level, char * buf)
54{
55	char *prog;
56	FILE *out_file = syslog_file;
57
58#if !defined(VMS) && !defined (SYS_VXWORKS)
59	if (syslogit)
60	    syslog(level, "%s", buf);
61	else
62#endif /* VMS  && SYS_VXWORKS*/
63	{
64		out_file = syslog_file ? syslog_file: level <= LOG_ERR ? stderr : stdout;
65		/* syslog() provides the timestamp, so if we're not using
66		   syslog, we must provide it. */
67		prog = strrchr(progname, separator);
68		if (prog == NULL)
69		    prog = progname;
70		else
71		    prog++;
72		(void) fprintf(out_file, "%s ", humanlogtime ());
73		(void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
74		fflush (out_file);
75	}
76#if DEBUG
77	if (debug && out_file != stdout && out_file != stderr)
78		printf("addto_syslog: %s\n", buf);
79#endif
80}
81void
82format_errmsg(char *nfmt, int lennfmt, const char *fmt, int errval)
83{
84	register char c;
85	register char *n;
86	register const char *f;
87
88	char *err;
89
90	n = nfmt;
91	f = fmt;
92	while ((c = *f++) != '\0' && n < (nfmt+lennfmt - 2)) {
93		if (c != '%') {
94			*n++ = c;
95			continue;
96		}
97		if ((c = *f++) != 'm') {
98			*n++ = '%';
99			*n++ = c;
100			continue;
101		}
102		err = 0;
103		err = strerror(errval);
104		/* Make sure we have enough space for the error message */
105		if ((n + strlen(err)) < (nfmt + lennfmt -2)) {
106			strcpy(n, err);
107			n += strlen(err);
108		}
109	}
110#if !defined(VMS)
111	if (!syslogit)
112#endif /* VMS */
113	    *n++ = '\n';
114	*n = '\0';
115}
116
117/*
118 * The externally called functions are defined here
119 * but share the internal function above to fetch
120 * any error message strings, This is done so that we can
121 * have two different functions to perform the logging
122 * since Windows gets it's error information from different
123 * places depending on whether or not it's network I/O.
124 * msyslog() is for general use while netsyslog() is for
125 * network I/O functions. They are virtually identical
126 * in implementation.
127 */
128
129#if defined(__STDC__) || defined(HAVE_STDARG_H)
130void msyslog(int level, const char *fmt, ...)
131#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
132     /*VARARGS*/
133     void msyslog(va_alist)
134     va_dcl
135#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
136{
137#if defined(__STDC__) || defined(HAVE_STDARG_H)
138#else
139	int level;
140	const char *fmt;
141#endif
142	va_list ap;
143	char buf[1025], nfmt[256];
144
145	/*
146	 * Save the error value as soon as possible
147	 */
148#ifdef SYS_WINNT
149	int errval = GetLastError();
150#else
151	int errval = errno;
152#endif
153
154#if defined(__STDC__) || defined(HAVE_STDARG_H)
155	va_start(ap, fmt);
156#else
157	va_start(ap);
158
159	level = va_arg(ap, int);
160	fmt = va_arg(ap, char *);
161#endif
162	format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
163
164	vsnprintf(buf, sizeof(buf), nfmt, ap);
165	addto_syslog(level, buf);
166	va_end(ap);
167}
168#if defined(__STDC__) || defined(HAVE_STDARG_H)
169void netsyslog(int level, const char *fmt, ...)
170#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
171     /*VARARGS*/
172     void netsyslog(va_alist)
173     va_dcl
174#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
175{
176#if defined(__STDC__) || defined(HAVE_STDARG_H)
177#else
178	int level;
179	const char *fmt;
180#endif
181	va_list ap;
182	char buf[1025], nfmt[256];
183
184	/*
185	 * Save the error value as soon as possible
186	 */
187#ifdef SYS_WINNT
188	int errval = WSAGetLastError();
189#else
190	int errval = errno;
191#endif
192
193#if defined(__STDC__) || defined(HAVE_STDARG_H)
194	va_start(ap, fmt);
195#else
196	va_start(ap);
197
198	level = va_arg(ap, int);
199	fmt = va_arg(ap, char *);
200#endif
201	format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
202
203	vsnprintf(buf, sizeof(buf), nfmt, ap);
204	addto_syslog(level, buf);
205	va_end(ap);
206}
207