msyslog.c revision 132451
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" 2382498Sroberto#include "ntp_syslog.h" 2454359Sroberto#include "ntp_stdlib.h" 2554359Sroberto 2654359Sroberto#ifdef SYS_WINNT 27132451Sroberto# include <stdarg.h> 2854359Sroberto# include "..\ports\winnt\libntp\log.h" 2954359Sroberto# include "..\ports\winnt\libntp\messages.h" 3054359Sroberto#endif 3154359Sroberto 3254359Srobertoint syslogit = 1; 3354359Sroberto 3454359SrobertoFILE *syslog_file = NULL; 3554359Sroberto 3654359Srobertou_long ntp_syslogmask = ~ (u_long) 0; 3754359Sroberto 3854359Sroberto#ifdef SYS_WINNT 39132451Srobertostatic char separator = '\\'; 40132451Sroberto#else 41132451Srobertostatic char separator = '/'; 4254359Sroberto#endif /* SYS_WINNT */ 4354359Srobertoextern char *progname; 4454359Sroberto 45132451Sroberto/* Declare the local functions */ 46132451Srobertovoid addto_syslog P((int, char *)); 47132451Srobertovoid format_errmsg P((char *, int, const char *, int)); 48132451Sroberto 49132451Sroberto 50132451Sroberto/* 51132451Sroberto * This routine adds the contents of a buffer to the log 52132451Sroberto */ 53132451Srobertovoid 54132451Srobertoaddto_syslog(int level, char * buf) 5554359Sroberto{ 56132451Sroberto char *prog; 57132451Sroberto FILE *out_file = syslog_file; 58132451Sroberto 59132451Sroberto#if !defined(VMS) && !defined (SYS_VXWORKS) 60132451Sroberto if (syslogit) 61132451Sroberto syslog(level, "%s", buf); 62132451Sroberto else 63132451Sroberto#endif /* VMS && SYS_VXWORKS*/ 64132451Sroberto { 65132451Sroberto out_file = syslog_file ? syslog_file: level <= LOG_ERR ? stderr : stdout; 66132451Sroberto /* syslog() provides the timestamp, so if we're not using 67132451Sroberto syslog, we must provide it. */ 68132451Sroberto prog = strrchr(progname, separator); 69132451Sroberto if (prog == NULL) 70132451Sroberto prog = progname; 71132451Sroberto else 72132451Sroberto prog++; 73132451Sroberto (void) fprintf(out_file, "%s ", humanlogtime ()); 74132451Sroberto (void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf); 75132451Sroberto fflush (out_file); 76132451Sroberto } 77132451Sroberto#if DEBUG 78132451Sroberto if (debug && out_file != stdout && out_file != stderr) 79132451Sroberto printf("addto_syslog: %s\n", buf); 8054359Sroberto#endif 81132451Sroberto} 82132451Srobertovoid 83132451Srobertoformat_errmsg(char *nfmt, int lennfmt, const char *fmt, int errval) 84132451Sroberto{ 85132451Sroberto register char c; 86132451Sroberto register char *n; 8754359Sroberto register const char *f; 88132451Sroberto 8954359Sroberto char *err; 9054359Sroberto 9154359Sroberto n = nfmt; 9254359Sroberto f = fmt; 93132451Sroberto while ((c = *f++) != '\0' && n < (nfmt+lennfmt - 2)) { 9454359Sroberto if (c != '%') { 9554359Sroberto *n++ = c; 9654359Sroberto continue; 9754359Sroberto } 9854359Sroberto if ((c = *f++) != 'm') { 9954359Sroberto *n++ = '%'; 10054359Sroberto *n++ = c; 10154359Sroberto continue; 10254359Sroberto } 10354359Sroberto err = 0; 104132451Sroberto err = strerror(errval); 105132451Sroberto /* Make sure we have enough space for the error message */ 106132451Sroberto if ((n + strlen(err)) < (nfmt + lennfmt -2)) { 10754359Sroberto strcpy(n, err); 10854359Sroberto n += strlen(err); 10954359Sroberto } 11054359Sroberto } 11154359Sroberto#if !defined(VMS) 11254359Sroberto if (!syslogit) 11354359Sroberto#endif /* VMS */ 11454359Sroberto *n++ = '\n'; 11554359Sroberto *n = '\0'; 116132451Sroberto} 11754359Sroberto 118132451Sroberto/* 119132451Sroberto * The externally called functions are defined here 120132451Sroberto * but share the internal function above to fetch 121132451Sroberto * any error message strings, This is done so that we can 122132451Sroberto * have two different functions to perform the logging 123132451Sroberto * since Windows gets it's error information from different 124132451Sroberto * places depending on whether or not it's network I/O. 125132451Sroberto * msyslog() is for general use while netsyslog() is for 126132451Sroberto * network I/O functions. They are virtually identical 127132451Sroberto * in implementation. 128132451Sroberto */ 129132451Sroberto 130132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H) 131132451Srobertovoid msyslog(int level, const char *fmt, ...) 132132451Sroberto#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */ 133132451Sroberto /*VARARGS*/ 134132451Sroberto void msyslog(va_alist) 135132451Sroberto va_dcl 136132451Sroberto#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */ 137132451Sroberto{ 138132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H) 139132451Sroberto#else 140132451Sroberto int level; 141132451Sroberto const char *fmt; 142132451Sroberto#endif 143132451Sroberto va_list ap; 144132451Sroberto char buf[1025], nfmt[256]; 145132451Sroberto 146132451Sroberto /* 147132451Sroberto * Save the error value as soon as possible 148132451Sroberto */ 149132451Sroberto#ifdef SYS_WINNT 150132451Sroberto int errval = GetLastError(); 151132451Sroberto#else 152132451Sroberto int errval = errno; 153132451Sroberto#endif 154132451Sroberto 155132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H) 156132451Sroberto va_start(ap, fmt); 157132451Sroberto#else 158132451Sroberto va_start(ap); 159132451Sroberto 160132451Sroberto level = va_arg(ap, int); 161132451Sroberto fmt = va_arg(ap, char *); 162132451Sroberto#endif 163132451Sroberto format_errmsg(nfmt, sizeof(nfmt), fmt, errval); 164132451Sroberto 165106424Sroberto vsnprintf(buf, sizeof(buf), nfmt, ap); 166132451Sroberto addto_syslog(level, buf); 167132451Sroberto va_end(ap); 168132451Sroberto} 169132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H) 170132451Srobertovoid netsyslog(int level, const char *fmt, ...) 171132451Sroberto#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */ 172132451Sroberto /*VARARGS*/ 173132451Sroberto void netsyslog(va_alist) 174132451Sroberto va_dcl 175132451Sroberto#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */ 176132451Sroberto{ 177132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H) 17854359Sroberto#else 179132451Sroberto int level; 180132451Sroberto const char *fmt; 181132451Sroberto#endif 182132451Sroberto va_list ap; 183132451Sroberto char buf[1025], nfmt[256]; 18454359Sroberto 185132451Sroberto /* 186132451Sroberto * Save the error value as soon as possible 187132451Sroberto */ 188132451Sroberto#ifdef SYS_WINNT 189132451Sroberto int errval = WSAGetLastError(); 190132451Sroberto#else 191132451Sroberto int errval = errno; 192132451Sroberto#endif 193132451Sroberto 194132451Sroberto#if defined(__STDC__) || defined(HAVE_STDARG_H) 195132451Sroberto va_start(ap, fmt); 196132451Sroberto#else 197132451Sroberto va_start(ap); 198132451Sroberto 199132451Sroberto level = va_arg(ap, int); 200132451Sroberto fmt = va_arg(ap, char *); 201132451Sroberto#endif 202132451Sroberto format_errmsg(nfmt, sizeof(nfmt), fmt, errval); 203132451Sroberto 204132451Sroberto vsnprintf(buf, sizeof(buf), nfmt, ap); 205132451Sroberto addto_syslog(level, buf); 20654359Sroberto va_end(ap); 20754359Sroberto} 208