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