msyslog.c revision 54359
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"
2354359Sroberto#include "ntp_stdlib.h"
2454359Sroberto#include "ntp_syslog.h"
2554359Sroberto
2654359Sroberto#ifdef SYS_WINNT
2754359Sroberto# include "..\ports\winnt\libntp\log.h"
2854359Sroberto# include "..\ports\winnt\libntp\messages.h"
2954359Sroberto#endif
3054359Sroberto
3154359Srobertoint syslogit = 1;
3254359Sroberto
3354359SrobertoFILE *syslog_file = NULL;
3454359Sroberto
3554359Srobertou_long ntp_syslogmask =  ~ (u_long) 0;
3654359Sroberto
3754359Sroberto#ifdef SYS_WINNT
3854359SrobertoHANDLE  hEventSource;
3954359SrobertoLPTSTR lpszStrings[1];
4054359Srobertostatic WORD event_type[] = {
4154359Sroberto	EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE, EVENTLOG_ERROR_TYPE,
4254359Sroberto	EVENTLOG_WARNING_TYPE,
4354359Sroberto	EVENTLOG_INFORMATION_TYPE, EVENTLOG_INFORMATION_TYPE, EVENTLOG_INFORMATION_TYPE,
4454359Sroberto};
4554359Sroberto#endif /* SYS_WINNT */
4654359Srobertoextern	char *progname;
4754359Sroberto
4854359Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
4954359Srobertovoid msyslog(int level, const char *fmt, ...)
5054359Sroberto#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
5154359Sroberto     /*VARARGS*/
5254359Sroberto     void msyslog(va_alist)
5354359Sroberto     va_dcl
5454359Sroberto#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
5554359Sroberto{
5654359Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
5754359Sroberto#else
5854359Sroberto	int level;
5954359Sroberto	const char *fmt;
6054359Sroberto#endif
6154359Sroberto	va_list ap;
6254359Sroberto	char buf[1025], nfmt[256];
6354359Sroberto#if !defined(VMS)
6454359Sroberto	char xerr[50];
6554359Sroberto#endif
6654359Sroberto	register int c;
6754359Sroberto	register char *n, *prog;
6854359Sroberto	register const char *f;
6954359Sroberto#ifdef CHAR_SYS_ERRLIST
7054359Sroberto	extern int sys_nerr;
7154359Sroberto	extern char *sys_errlist[];
7254359Sroberto#endif
7354359Sroberto	int olderrno;
7454359Sroberto	char *err;
7554359Sroberto
7654359Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H)
7754359Sroberto	va_start(ap, fmt);
7854359Sroberto#else
7954359Sroberto	va_start(ap);
8054359Sroberto
8154359Sroberto	level = va_arg(ap, int);
8254359Sroberto	fmt = va_arg(ap, char *);
8354359Sroberto#endif
8454359Sroberto
8554359Sroberto	olderrno = errno;
8654359Sroberto	n = nfmt;
8754359Sroberto	f = fmt;
8854359Sroberto	while ((c = *f++) != '\0' && c != '\n' && n < &nfmt[252]) {
8954359Sroberto		if (c != '%') {
9054359Sroberto			*n++ = c;
9154359Sroberto			continue;
9254359Sroberto		}
9354359Sroberto		if ((c = *f++) != 'm') {
9454359Sroberto			*n++ = '%';
9554359Sroberto			*n++ = c;
9654359Sroberto			continue;
9754359Sroberto		}
9854359Sroberto		err = 0;
9954359Sroberto#if !defined(VMS) && !defined(SYS_WINNT) && !defined (SYS_VXWORKS)
10054359Sroberto		if ((unsigned)olderrno > sys_nerr)
10154359Sroberto		    sprintf((char *)(err = xerr), "error %d", olderrno);
10254359Sroberto		else
10354359Sroberto		    err = (char*)sys_errlist[olderrno];
10454359Sroberto#elif defined(VMS) || defined (SYS_VXWORKS)
10554359Sroberto		err = strerror(olderrno);
10654359Sroberto#else  /* SYS_WINNT */
10754359Sroberto		err = xerr;
10854359Sroberto		FormatMessage(
10954359Sroberto			FORMAT_MESSAGE_FROM_SYSTEM,
11054359Sroberto			NULL,
11154359Sroberto			GetLastError(),
11254359Sroberto			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
11354359Sroberto			(LPTSTR) err,
11454359Sroberto			sizeof(xerr),
11554359Sroberto			NULL);
11654359Sroberto
11754359Sroberto#endif /* VMS && SYS_WINNT */
11854359Sroberto		if ((n + strlen(err)) < &nfmt[254]) {
11954359Sroberto			strcpy(n, err);
12054359Sroberto			n += strlen(err);
12154359Sroberto		}
12254359Sroberto	}
12354359Sroberto#if !defined(VMS)
12454359Sroberto	if (!syslogit)
12554359Sroberto#endif /* VMS */
12654359Sroberto	    *n++ = '\n';
12754359Sroberto	*n = '\0';
12854359Sroberto
12954359Sroberto	vsprintf(buf, nfmt, ap);
13054359Sroberto#if !defined(VMS) && !defined (SYS_VXWORKS)
13154359Sroberto	if (syslogit)
13254359Sroberto#ifndef SYS_WINNT
13354359Sroberto	    syslog(level, "%s", buf);
13454359Sroberto#else
13554359Sroberto	{
13654359Sroberto		lpszStrings[0] = buf;
13754359Sroberto
13854359Sroberto		switch (event_type[level])
13954359Sroberto		{
14054359Sroberto		    case EVENTLOG_ERROR_TYPE:
14154359Sroberto			reportAnEEvent(NTP_ERROR,1,lpszStrings);
14254359Sroberto			break;
14354359Sroberto		    case EVENTLOG_INFORMATION_TYPE:
14454359Sroberto			reportAnIEvent(NTP_INFO,1,lpszStrings);
14554359Sroberto			break;
14654359Sroberto		    case EVENTLOG_WARNING_TYPE:
14754359Sroberto			reportAnWEvent(NTP_WARNING,1,lpszStrings);
14854359Sroberto			break;
14954359Sroberto		} /* switch end */
15054359Sroberto
15154359Sroberto	}
15254359Sroberto#endif /* SYS_WINNT */
15354359Sroberto	else
15454359Sroberto#endif /* VMS  && SYS_VXWORKS*/
15554359Sroberto	{
15654359Sroberto		FILE *out_file = syslog_file ? syslog_file
15754359Sroberto			: level <= LOG_ERR ? stderr : stdout;
15854359Sroberto		/* syslog() provides the timestamp, so if we're not using
15954359Sroberto		   syslog, we must provide it. */
16054359Sroberto		prog = strrchr(progname, '/');
16154359Sroberto		if (prog == NULL)
16254359Sroberto		    prog = progname;
16354359Sroberto		else
16454359Sroberto		    prog++;
16554359Sroberto		(void) fprintf(out_file, "%s ", humanlogtime ());
16654359Sroberto		(void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
16754359Sroberto		fflush (out_file);
16854359Sroberto	}
16954359Sroberto	va_end(ap);
17054359Sroberto}
171