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