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