xref: /freebsd/contrib/ntp/libntp/msyslog.c (revision daf1cffce2e07931f27c6c6998652e90df6ba87e)
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 
31 int syslogit = 1;
32 
33 FILE *syslog_file = NULL;
34 
35 u_long ntp_syslogmask =  ~ (u_long) 0;
36 
37 #ifdef SYS_WINNT
38 HANDLE  hEventSource;
39 LPTSTR lpszStrings[1];
40 static 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 */
46 extern	char *progname;
47 
48 #if defined(__STDC__) || defined(HAVE_STDARG_H)
49 void 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