msyslog.c revision 132451
154359Sroberto/*
254359Sroberto * msyslog - either send a message to the terminal or print it on
354359Sroberto *	     the standard output.
454359Sroberto *
554359Sroberto * Converted to use varargs, much better ... jks
654359Sroberto */
754359Sroberto
854359Sroberto#ifdef HAVE_CONFIG_H
954359Sroberto# include <config.h>
1054359Sroberto#endif
1154359Sroberto
1254359Sroberto#ifdef HAVE_SYS_TYPES_H
1354359Sroberto# include <sys/types.h>
1454359Sroberto#endif
1554359Sroberto#ifdef HAVE_UNISTD_H
1654359Sroberto# include <unistd.h>
1754359Sroberto#endif
1854359Sroberto
1954359Sroberto#include <stdio.h>
2054359Sroberto
2154359Sroberto#include "ntp_types.h"
2254359Sroberto#include "ntp_string.h"
2382498Sroberto#include "ntp_syslog.h"
2454359Sroberto#include "ntp_stdlib.h"
2554359Sroberto
2654359Sroberto#ifdef SYS_WINNT
27132451Sroberto# include <stdarg.h>
2854359Sroberto# include "..\ports\winnt\libntp\log.h"
2954359Sroberto# include "..\ports\winnt\libntp\messages.h"
3054359Sroberto#endif
3154359Sroberto
3254359Srobertoint syslogit = 1;
3354359Sroberto
3454359SrobertoFILE *syslog_file = NULL;
3554359Sroberto
3654359Srobertou_long ntp_syslogmask =  ~ (u_long) 0;
3754359Sroberto
3854359Sroberto#ifdef SYS_WINNT
39132451Srobertostatic char separator = '\\';
40132451Sroberto#else
41132451Srobertostatic char separator = '/';
4254359Sroberto#endif /* SYS_WINNT */
4354359Srobertoextern	char *progname;
4454359Sroberto
45132451Sroberto/* Declare the local functions */
46132451Srobertovoid	addto_syslog	P((int, char *));
47132451Srobertovoid	format_errmsg   P((char *, int, const char *, int));
48132451Sroberto
49132451Sroberto
50132451Sroberto/*
51132451Sroberto * This routine adds the contents of a buffer to the log
52132451Sroberto */
53132451Srobertovoid
54132451Srobertoaddto_syslog(int level, char * buf)
5554359Sroberto{
56132451Sroberto	char *prog;
57132451Sroberto	FILE *out_file = syslog_file;
58132451Sroberto
59132451Sroberto#if !defined(VMS) && !defined (SYS_VXWORKS)
60132451Sroberto	if (syslogit)
61132451Sroberto	    syslog(level, "%s", buf);
62132451Sroberto	else
63132451Sroberto#endif /* VMS  && SYS_VXWORKS*/
64132451Sroberto	{
65132451Sroberto		out_file = syslog_file ? syslog_file: level <= LOG_ERR ? stderr : stdout;
66132451Sroberto		/* syslog() provides the timestamp, so if we're not using
67132451Sroberto		   syslog, we must provide it. */
68132451Sroberto		prog = strrchr(progname, separator);
69132451Sroberto		if (prog == NULL)
70132451Sroberto		    prog = progname;
71132451Sroberto		else
72132451Sroberto		    prog++;
73132451Sroberto		(void) fprintf(out_file, "%s ", humanlogtime ());
74132451Sroberto		(void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
75132451Sroberto		fflush (out_file);
76132451Sroberto	}
77132451Sroberto#if DEBUG
78132451Sroberto	if (debug && out_file != stdout && out_file != stderr)
79132451Sroberto		printf("addto_syslog: %s\n", buf);
8054359Sroberto#endif
81132451Sroberto}
82132451Srobertovoid
83132451Srobertoformat_errmsg(char *nfmt, int lennfmt, const char *fmt, int errval)
84132451Sroberto{
85132451Sroberto	register char c;
86132451Sroberto	register char *n;
8754359Sroberto	register const char *f;
88132451Sroberto
8954359Sroberto	char *err;
9054359Sroberto
9154359Sroberto	n = nfmt;
9254359Sroberto	f = fmt;
93132451Sroberto	while ((c = *f++) != '\0' && n < (nfmt+lennfmt - 2)) {
9454359Sroberto		if (c != '%') {
9554359Sroberto			*n++ = c;
9654359Sroberto			continue;
9754359Sroberto		}
9854359Sroberto		if ((c = *f++) != 'm') {
9954359Sroberto			*n++ = '%';
10054359Sroberto			*n++ = c;
10154359Sroberto			continue;
10254359Sroberto		}
10354359Sroberto		err = 0;
104132451Sroberto		err = strerror(errval);
105132451Sroberto		/* Make sure we have enough space for the error message */
106132451Sroberto		if ((n + strlen(err)) < (nfmt + lennfmt -2)) {
10754359Sroberto			strcpy(n, err);
10854359Sroberto			n += strlen(err);
10954359Sroberto		}
11054359Sroberto	}
11154359Sroberto#if !defined(VMS)
11254359Sroberto	if (!syslogit)
11354359Sroberto#endif /* VMS */
11454359Sroberto	    *n++ = '\n';
11554359Sroberto	*n = '\0';
116132451Sroberto}
11754359Sroberto
118132451Sroberto/*
119132451Sroberto * The externally called functions are defined here
120132451Sroberto * but share the internal function above to fetch
121132451Sroberto * any error message strings, This is done so that we can
122132451Sroberto * have two different functions to perform the logging
123132451Sroberto * since Windows gets it's error information from different
124132451Sroberto * places depending on whether or not it's network I/O.
125132451Sroberto * msyslog() is for general use while netsyslog() is for
126132451Sroberto * network I/O functions. They are virtually identical
127132451Sroberto * in implementation.
128132451Sroberto */
129132451Sroberto
130132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
131132451Srobertovoid msyslog(int level, const char *fmt, ...)
132132451Sroberto#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
133132451Sroberto     /*VARARGS*/
134132451Sroberto     void msyslog(va_alist)
135132451Sroberto     va_dcl
136132451Sroberto#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
137132451Sroberto{
138132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
139132451Sroberto#else
140132451Sroberto	int level;
141132451Sroberto	const char *fmt;
142132451Sroberto#endif
143132451Sroberto	va_list ap;
144132451Sroberto	char buf[1025], nfmt[256];
145132451Sroberto
146132451Sroberto	/*
147132451Sroberto	 * Save the error value as soon as possible
148132451Sroberto	 */
149132451Sroberto#ifdef SYS_WINNT
150132451Sroberto	int errval = GetLastError();
151132451Sroberto#else
152132451Sroberto	int errval = errno;
153132451Sroberto#endif
154132451Sroberto
155132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
156132451Sroberto	va_start(ap, fmt);
157132451Sroberto#else
158132451Sroberto	va_start(ap);
159132451Sroberto
160132451Sroberto	level = va_arg(ap, int);
161132451Sroberto	fmt = va_arg(ap, char *);
162132451Sroberto#endif
163132451Sroberto	format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
164132451Sroberto
165106424Sroberto	vsnprintf(buf, sizeof(buf), nfmt, ap);
166132451Sroberto	addto_syslog(level, buf);
167132451Sroberto	va_end(ap);
168132451Sroberto}
169132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
170132451Srobertovoid netsyslog(int level, const char *fmt, ...)
171132451Sroberto#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
172132451Sroberto     /*VARARGS*/
173132451Sroberto     void netsyslog(va_alist)
174132451Sroberto     va_dcl
175132451Sroberto#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
176132451Sroberto{
177132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
17854359Sroberto#else
179132451Sroberto	int level;
180132451Sroberto	const char *fmt;
181132451Sroberto#endif
182132451Sroberto	va_list ap;
183132451Sroberto	char buf[1025], nfmt[256];
18454359Sroberto
185132451Sroberto	/*
186132451Sroberto	 * Save the error value as soon as possible
187132451Sroberto	 */
188132451Sroberto#ifdef SYS_WINNT
189132451Sroberto	int errval = WSAGetLastError();
190132451Sroberto#else
191132451Sroberto	int errval = errno;
192132451Sroberto#endif
193132451Sroberto
194132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
195132451Sroberto	va_start(ap, fmt);
196132451Sroberto#else
197132451Sroberto	va_start(ap);
198132451Sroberto
199132451Sroberto	level = va_arg(ap, int);
200132451Sroberto	fmt = va_arg(ap, char *);
201132451Sroberto#endif
202132451Sroberto	format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
203132451Sroberto
204132451Sroberto	vsnprintf(buf, sizeof(buf), nfmt, ap);
205132451Sroberto	addto_syslog(level, buf);
20654359Sroberto	va_end(ap);
20754359Sroberto}
208