/contrib/ntp/libntp/msyslog.c
https://bitbucket.org/freebsd/freebsd-head/ · C · 206 lines · 149 code · 25 blank · 32 comment · 24 complexity · 4406a2f9f0457bc924565932bf3f29d4 MD5 · raw file
- /*
- * msyslog - either send a message to the terminal or print it on
- * the standard output.
- *
- * Converted to use varargs, much better ... jks
- */
- #ifdef HAVE_CONFIG_H
- # include <config.h>
- #endif
- #ifdef HAVE_SYS_TYPES_H
- # include <sys/types.h>
- #endif
- #ifdef HAVE_UNISTD_H
- # include <unistd.h>
- #endif
- #include <stdio.h>
- #include "ntp_types.h"
- #include "ntp_string.h"
- #include "ntp_syslog.h"
- #include "ntp_stdlib.h"
- #ifdef SYS_WINNT
- # include <stdarg.h>
- # include "..\ports\winnt\libntp\messages.h"
- #endif
- int syslogit = 1;
- FILE *syslog_file = NULL;
- u_long ntp_syslogmask = ~ (u_long) 0;
- #ifdef SYS_WINNT
- static char separator = '\\';
- #else
- static char separator = '/';
- #endif /* SYS_WINNT */
- extern char *progname;
- /* Declare the local functions */
- void addto_syslog P((int, char *));
- void format_errmsg P((char *, int, const char *, int));
- /*
- * This routine adds the contents of a buffer to the log
- */
- void
- addto_syslog(int level, char * buf)
- {
- char *prog;
- FILE *out_file = syslog_file;
- #if !defined(VMS) && !defined (SYS_VXWORKS)
- if (syslogit)
- syslog(level, "%s", buf);
- else
- #endif /* VMS && SYS_VXWORKS*/
- {
- out_file = syslog_file ? syslog_file: level <= LOG_ERR ? stderr : stdout;
- /* syslog() provides the timestamp, so if we're not using
- syslog, we must provide it. */
- prog = strrchr(progname, separator);
- if (prog == NULL)
- prog = progname;
- else
- prog++;
- (void) fprintf(out_file, "%s ", humanlogtime ());
- (void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
- fflush (out_file);
- }
- #if DEBUG
- if (debug && out_file != stdout && out_file != stderr)
- printf("addto_syslog: %s\n", buf);
- #endif
- }
- void
- format_errmsg(char *nfmt, int lennfmt, const char *fmt, int errval)
- {
- register char c;
- register char *n;
- register const char *f;
- char *err;
- n = nfmt;
- f = fmt;
- while ((c = *f++) != '\0' && n < (nfmt+lennfmt - 2)) {
- if (c != '%') {
- *n++ = c;
- continue;
- }
- if ((c = *f++) != 'm') {
- *n++ = '%';
- *n++ = c;
- continue;
- }
- err = 0;
- err = strerror(errval);
- /* Make sure we have enough space for the error message */
- if ((n + strlen(err)) < (nfmt + lennfmt -2)) {
- strcpy(n, err);
- n += strlen(err);
- }
- }
- #if !defined(VMS)
- if (!syslogit)
- #endif /* VMS */
- *n++ = '\n';
- *n = '\0';
- }
- /*
- * The externally called functions are defined here
- * but share the internal function above to fetch
- * any error message strings, This is done so that we can
- * have two different functions to perform the logging
- * since Windows gets it's error information from different
- * places depending on whether or not it's network I/O.
- * msyslog() is for general use while netsyslog() is for
- * network I/O functions. They are virtually identical
- * in implementation.
- */
- #if defined(__STDC__) || defined(HAVE_STDARG_H)
- void msyslog(int level, const char *fmt, ...)
- #else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
- /*VARARGS*/
- void msyslog(va_alist)
- va_dcl
- #endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
- {
- #if defined(__STDC__) || defined(HAVE_STDARG_H)
- #else
- int level;
- const char *fmt;
- #endif
- va_list ap;
- char buf[1025], nfmt[256];
- /*
- * Save the error value as soon as possible
- */
- #ifdef SYS_WINNT
- int errval = GetLastError();
- #else
- int errval = errno;
- #endif
- #if defined(__STDC__) || defined(HAVE_STDARG_H)
- va_start(ap, fmt);
- #else
- va_start(ap);
- level = va_arg(ap, int);
- fmt = va_arg(ap, char *);
- #endif
- format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
- vsnprintf(buf, sizeof(buf), nfmt, ap);
- addto_syslog(level, buf);
- va_end(ap);
- }
- #if defined(__STDC__) || defined(HAVE_STDARG_H)
- void netsyslog(int level, const char *fmt, ...)
- #else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
- /*VARARGS*/
- void netsyslog(va_alist)
- va_dcl
- #endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
- {
- #if defined(__STDC__) || defined(HAVE_STDARG_H)
- #else
- int level;
- const char *fmt;
- #endif
- va_list ap;
- char buf[1025], nfmt[256];
- /*
- * Save the error value as soon as possible
- */
- #ifdef SYS_WINNT
- int errval = WSAGetLastError();
- #else
- int errval = errno;
- #endif
- #if defined(__STDC__) || defined(HAVE_STDARG_H)
- va_start(ap, fmt);
- #else
- va_start(ap);
- level = va_arg(ap, int);
- fmt = va_arg(ap, char *);
- #endif
- format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
- vsnprintf(buf, sizeof(buf), nfmt, ap);
- addto_syslog(level, buf);
- va_end(ap);
- }