aboutsummaryrefslogtreecommitdiff
path: root/libntp/msyslog.c
diff options
context:
space:
mode:
Diffstat (limited to 'libntp/msyslog.c')
-rw-r--r--libntp/msyslog.c309
1 files changed, 196 insertions, 113 deletions
diff --git a/libntp/msyslog.c b/libntp/msyslog.c
index fe4d979e1267..60f8a1309e86 100644
--- a/libntp/msyslog.c
+++ b/libntp/msyslog.c
@@ -9,198 +9,281 @@
# include <config.h>
#endif
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
+#include <sys/types.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
-
#include <stdio.h>
-#include "ntp_types.h"
+#include "ntp.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;
+int syslogit = 1;
+int msyslog_term = FALSE; /* duplicate to stdout/err */
+FILE * syslog_file;
-u_long ntp_syslogmask = ~ (u_long) 0;
+u_int32 ntp_syslogmask = ~(u_int32)0; /* libntp default is all lit */
-#ifdef SYS_WINNT
-static char separator = '\\';
-#else
-static char separator = '/';
-#endif /* SYS_WINNT */
-extern char *progname;
+extern char * progname;
/* Declare the local functions */
-void addto_syslog P((int, char *));
-void format_errmsg P((char *, int, const char *, int));
+void addto_syslog (int, const char *);
+void format_errmsg (char *, size_t, const char *, int);
/*
- * This routine adds the contents of a buffer to the log
+ * This routine adds the contents of a buffer to the syslog or an
+ * application-specific logfile.
*/
void
-addto_syslog(int level, char * buf)
+addto_syslog(
+ int level,
+ const char * msg
+ )
{
- char *prog;
- FILE *out_file = syslog_file;
+ static char * prevcall_progname;
+ static char * prog;
+ const char nl[] = "\n";
+ const char empty[] = "";
+ FILE * term_file;
+ int log_to_term;
+ int log_to_file;
+ const char * nl_or_empty;
+ const char * human_time;
-#if !defined(VMS) && !defined (SYS_VXWORKS)
+ /* setup program basename static var prog if needed */
+ if (progname != prevcall_progname) {
+ prevcall_progname = progname;
+ prog = strrchr(progname, DIR_SEP);
+ if (prog != NULL)
+ prog++;
+ else
+ prog = progname;
+ }
+
+ log_to_term = msyslog_term;
+ log_to_file = FALSE;
+#if !defined(VMS) && !defined(SYS_VXWORKS)
if (syslogit)
- syslog(level, "%s", buf);
+ syslog(level, "%s", msg);
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;
+#endif
+ if (syslog_file != NULL)
+ log_to_file = TRUE;
else
- prog++;
- (void) fprintf(out_file, "%s ", humanlogtime ());
- (void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
- fflush (out_file);
- }
+ log_to_term = TRUE;
#if DEBUG
- if (debug && out_file != stdout && out_file != stderr)
- printf("addto_syslog: %s\n", buf);
+ if (debug > 0)
+ log_to_term = TRUE;
#endif
+ if (!(log_to_file || log_to_term))
+ return;
+
+ /* syslog() adds the timestamp, name, and pid */
+ human_time = humanlogtime();
+
+ /* syslog() adds trailing \n if not present */
+ if ('\n' != msg[strlen(msg) - 1])
+ nl_or_empty = nl;
+ else
+ nl_or_empty = empty;
+
+ if (log_to_term) {
+ term_file = (level <= LOG_ERR)
+ ? stderr
+ : stdout;
+ fprintf(term_file, "%s %s[%d]: %s%s", human_time, prog,
+ (int)getpid(), msg, nl_or_empty);
+ fflush(term_file);
+ }
+
+ if (log_to_file) {
+ fprintf(syslog_file, "%s %s[%d]: %s%s", human_time,
+ prog, (int)getpid(), msg, nl_or_empty);
+ fflush(syslog_file);
+ }
}
+
+
void
-format_errmsg(char *nfmt, int lennfmt, const char *fmt, int errval)
+format_errmsg(
+ char * nfmt,
+ size_t lennfmt,
+ const char * fmt,
+ int errval
+ )
{
- register char c;
- register char *n;
- register const char *f;
-
+ char c;
+ char *n;
+ const char *f;
+ size_t len;
char *err;
n = nfmt;
f = fmt;
- while ((c = *f++) != '\0' && n < (nfmt+lennfmt - 2)) {
+ while ((c = *f++) != '\0' && n < (nfmt + lennfmt - 1)) {
if (c != '%') {
*n++ = c;
continue;
}
if ((c = *f++) != 'm') {
*n++ = '%';
+ if ('\0' == c)
+ break;
*n++ = c;
continue;
}
- err = 0;
err = strerror(errval);
+ len = strlen(err);
+
/* Make sure we have enough space for the error message */
- if ((n + strlen(err)) < (nfmt + lennfmt -2)) {
- strcpy(n, err);
- n += strlen(err);
+ if ((n + len) < (nfmt + lennfmt - 1)) {
+ memcpy(n, err, len);
+ n += len;
}
}
-#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) */
+int
+mvsnprintf(
+ char * buf,
+ size_t bufsiz,
+ const char * fmt,
+ va_list ap
+ )
{
-#if defined(__STDC__) || defined(HAVE_STDARG_H)
+#ifndef VSNPRINTF_PERCENT_M
+ char nfmt[256];
#else
- int level;
- const char *fmt;
+ const char * nfmt = fmt;
#endif
- va_list ap;
- char buf[1025], nfmt[256];
+ int errval;
/*
* Save the error value as soon as possible
*/
#ifdef SYS_WINNT
- int errval = GetLastError();
-#else
- int errval = errno;
-#endif
+ errval = GetLastError();
+ if (NO_ERROR == errval)
+#endif /* SYS_WINNT */
+ errval = errno;
-#if defined(__STDC__) || defined(HAVE_STDARG_H)
- va_start(ap, fmt);
+#ifndef VSNPRINTF_PERCENT_M
+ format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
#else
- va_start(ap);
-
- level = va_arg(ap, int);
- fmt = va_arg(ap, char *);
+ errno = errval;
#endif
- format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
-
- vsnprintf(buf, sizeof(buf), nfmt, ap);
- addto_syslog(level, buf);
- va_end(ap);
+ return vsnprintf(buf, bufsiz, nfmt, 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) */
+
+
+int
+mvfprintf(
+ FILE * fp,
+ const char * fmt,
+ va_list ap
+ )
{
-#if defined(__STDC__) || defined(HAVE_STDARG_H)
+#ifndef VSNPRINTF_PERCENT_M
+ char nfmt[256];
#else
- int level;
- const char *fmt;
+ const char * nfmt = fmt;
#endif
- va_list ap;
- char buf[1025], nfmt[256];
+ int errval;
/*
* Save the error value as soon as possible
*/
#ifdef SYS_WINNT
- int errval = WSAGetLastError();
+ errval = GetLastError();
+ if (NO_ERROR == errval)
+#endif /* SYS_WINNT */
+ errval = errno;
+
+#ifndef VSNPRINTF_PERCENT_M
+ format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
#else
- int errval = errno;
+ errno = errval;
#endif
+ return vfprintf(fp, nfmt, ap);
+}
+
+
+int
+mfprintf(
+ FILE * fp,
+ const char * fmt,
+ ...
+ )
+{
+ va_list ap;
+ int rc;
-#if defined(__STDC__) || defined(HAVE_STDARG_H)
va_start(ap, fmt);
-#else
- va_start(ap);
+ rc = mvfprintf(fp, fmt, ap);
+ va_end(ap);
- level = va_arg(ap, int);
- fmt = va_arg(ap, char *);
-#endif
- format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
+ return rc;
+}
- vsnprintf(buf, sizeof(buf), nfmt, ap);
- addto_syslog(level, buf);
+
+int
+mprintf(
+ const char * fmt,
+ ...
+ )
+{
+ va_list ap;
+ int rc;
+
+ va_start(ap, fmt);
+ rc = mvfprintf(stdout, fmt, ap);
va_end(ap);
+
+ return rc;
+}
+
+
+int
+msnprintf(
+ char * buf,
+ size_t bufsiz,
+ const char * fmt,
+ ...
+ )
+{
+ va_list ap;
+ size_t rc;
+
+ va_start(ap, fmt);
+ rc = mvsnprintf(buf, bufsiz, fmt, ap);
+ va_end(ap);
+
+ return rc;
+}
+
+
+void
+msyslog(
+ int level,
+ const char * fmt,
+ ...
+ )
+{
+ char buf[1024];
+ va_list ap;
+
+ va_start(ap, fmt);
+ mvsnprintf(buf, sizeof(buf), fmt, ap);
+ va_end(ap);
+ addto_syslog(level, buf);
}