msyslog.c revision 54359
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_stdlib.h"
24#include "ntp_syslog.h"
25
26#ifdef SYS_WINNT
27# include "..\ports\winnt\libntp\log.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
38HANDLE  hEventSource;
39LPTSTR lpszStrings[1];
40static WORD event_type[] = {
41	EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE,
42	EVENTLOG_WARNING_TYPE,
43	EVENTLOG_INFORMATION_TYPE, EVENTLOG_INFORMATION_TYPE, EVENTLOG_INFORMATION_TYPE,
44};
45#endif /* SYS_WINNT */
46extern	char *progname;
47
48#if defined(__STDC__) || defined(HAVE_STDARG_H)
49void msyslog(int level, const char *fmt, ...)
50#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
51     /*VARARGS*/
52     void msyslog(va_alist)
53     va_dcl
54#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
55{
56#if defined(__STDC__) || defined(HAVE_STDARG_H)
57#else
58	int level;
59	const char *fmt;
60#endif
61	va_list ap;
62	char buf[1025], nfmt[256];
63#if !defined(VMS)
64	char xerr[50];
65#endif
66	register int c;
67	register char *n, *prog;
68	register const char *f;
69#ifdef CHAR_SYS_ERRLIST
70	extern int sys_nerr;
71	extern char *sys_errlist[];
72#endif
73	int olderrno;
74	char *err;
75
76#if defined(__STDC__) || defined(HAVE_STDARG_H)
77	va_start(ap, fmt);
78#else
79	va_start(ap);
80
81	level = va_arg(ap, int);
82	fmt = va_arg(ap, char *);
83#endif
84
85	olderrno = errno;
86	n = nfmt;
87	f = fmt;
88	while ((c = *f++) != '\0' && c != '\n' && n < &nfmt[252]) {
89		if (c != '%') {
90			*n++ = c;
91			continue;
92		}
93		if ((c = *f++) != 'm') {
94			*n++ = '%';
95			*n++ = c;
96			continue;
97		}
98		err = 0;
99#if !defined(VMS) && !defined(SYS_WINNT) && !defined (SYS_VXWORKS)
100		if ((unsigned)olderrno > sys_nerr)
101		    sprintf((char *)(err = xerr), "error %d", olderrno);
102		else
103		    err = (char*)sys_errlist[olderrno];
104#elif defined(VMS) || defined (SYS_VXWORKS)
105		err = strerror(olderrno);
106#else  /* SYS_WINNT */
107		err = xerr;
108		FormatMessage(
109			FORMAT_MESSAGE_FROM_SYSTEM,
110			NULL,
111			GetLastError(),
112			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
113			(LPTSTR) err,
114			sizeof(xerr),
115			NULL);
116
117#endif /* VMS && SYS_WINNT */
118		if ((n + strlen(err)) < &nfmt[254]) {
119			strcpy(n, err);
120			n += strlen(err);
121		}
122	}
123#if !defined(VMS)
124	if (!syslogit)
125#endif /* VMS */
126	    *n++ = '\n';
127	*n = '\0';
128
129	vsprintf(buf, nfmt, ap);
130#if !defined(VMS) && !defined (SYS_VXWORKS)
131	if (syslogit)
132#ifndef SYS_WINNT
133	    syslog(level, "%s", buf);
134#else
135	{
136		lpszStrings[0] = buf;
137
138		switch (event_type[level])
139		{
140		    case EVENTLOG_ERROR_TYPE:
141			reportAnEEvent(NTP_ERROR,1,lpszStrings);
142			break;
143		    case EVENTLOG_INFORMATION_TYPE:
144			reportAnIEvent(NTP_INFO,1,lpszStrings);
145			break;
146		    case EVENTLOG_WARNING_TYPE:
147			reportAnWEvent(NTP_WARNING,1,lpszStrings);
148			break;
149		} /* switch end */
150
151	}
152#endif /* SYS_WINNT */
153	else
154#endif /* VMS  && SYS_VXWORKS*/
155	{
156		FILE *out_file = syslog_file ? syslog_file
157			: level <= LOG_ERR ? stderr : stdout;
158		/* syslog() provides the timestamp, so if we're not using
159		   syslog, we must provide it. */
160		prog = strrchr(progname, '/');
161		if (prog == NULL)
162		    prog = progname;
163		else
164		    prog++;
165		(void) fprintf(out_file, "%s ", humanlogtime ());
166		(void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
167		fflush (out_file);
168	}
169	va_end(ap);
170}
171