PageRenderTime 27ms CodeModel.GetById 10ms app.highlight 13ms RepoModel.GetById 1ms app.codeStats 0ms

/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
  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_syslog.h"
 24#include "ntp_stdlib.h"
 25
 26#ifdef SYS_WINNT
 27# include <stdarg.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
 38static char separator = '\\';
 39#else
 40static char separator = '/';
 41#endif /* SYS_WINNT */
 42extern	char *progname;
 43
 44/* Declare the local functions */
 45void	addto_syslog	P((int, char *));
 46void	format_errmsg   P((char *, int, const char *, int));
 47
 48
 49/*
 50 * This routine adds the contents of a buffer to the log
 51 */
 52void
 53addto_syslog(int level, char * buf)
 54{
 55	char *prog;
 56	FILE *out_file = syslog_file;
 57
 58#if !defined(VMS) && !defined (SYS_VXWORKS)
 59	if (syslogit)
 60	    syslog(level, "%s", buf);
 61	else
 62#endif /* VMS  && SYS_VXWORKS*/
 63	{
 64		out_file = syslog_file ? syslog_file: level <= LOG_ERR ? stderr : stdout;
 65		/* syslog() provides the timestamp, so if we're not using
 66		   syslog, we must provide it. */
 67		prog = strrchr(progname, separator);
 68		if (prog == NULL)
 69		    prog = progname;
 70		else
 71		    prog++;
 72		(void) fprintf(out_file, "%s ", humanlogtime ());
 73		(void) fprintf(out_file, "%s[%d]: %s", prog, (int)getpid(), buf);
 74		fflush (out_file);
 75	}
 76#if DEBUG
 77	if (debug && out_file != stdout && out_file != stderr)
 78		printf("addto_syslog: %s\n", buf);
 79#endif
 80}
 81void
 82format_errmsg(char *nfmt, int lennfmt, const char *fmt, int errval)
 83{
 84	register char c;
 85	register char *n;
 86	register const char *f;
 87
 88	char *err;
 89
 90	n = nfmt;
 91	f = fmt;
 92	while ((c = *f++) != '\0' && n < (nfmt+lennfmt - 2)) {
 93		if (c != '%') {
 94			*n++ = c;
 95			continue;
 96		}
 97		if ((c = *f++) != 'm') {
 98			*n++ = '%';
 99			*n++ = c;
100			continue;
101		}
102		err = 0;
103		err = strerror(errval);
104		/* Make sure we have enough space for the error message */
105		if ((n + strlen(err)) < (nfmt + lennfmt -2)) {
106			strcpy(n, err);
107			n += strlen(err);
108		}
109	}
110#if !defined(VMS)
111	if (!syslogit)
112#endif /* VMS */
113	    *n++ = '\n';
114	*n = '\0';
115}
116
117/*
118 * The externally called functions are defined here
119 * but share the internal function above to fetch
120 * any error message strings, This is done so that we can
121 * have two different functions to perform the logging
122 * since Windows gets it's error information from different
123 * places depending on whether or not it's network I/O.
124 * msyslog() is for general use while netsyslog() is for
125 * network I/O functions. They are virtually identical
126 * in implementation.
127 */
128
129#if defined(__STDC__) || defined(HAVE_STDARG_H)
130void msyslog(int level, const char *fmt, ...)
131#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
132     /*VARARGS*/
133     void msyslog(va_alist)
134     va_dcl
135#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
136{
137#if defined(__STDC__) || defined(HAVE_STDARG_H)
138#else
139	int level;
140	const char *fmt;
141#endif
142	va_list ap;
143	char buf[1025], nfmt[256];
144
145	/*
146	 * Save the error value as soon as possible
147	 */
148#ifdef SYS_WINNT
149	int errval = GetLastError();
150#else
151	int errval = errno;
152#endif
153
154#if defined(__STDC__) || defined(HAVE_STDARG_H)
155	va_start(ap, fmt);
156#else
157	va_start(ap);
158
159	level = va_arg(ap, int);
160	fmt = va_arg(ap, char *);
161#endif
162	format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
163
164	vsnprintf(buf, sizeof(buf), nfmt, ap);
165	addto_syslog(level, buf);
166	va_end(ap);
167}
168#if defined(__STDC__) || defined(HAVE_STDARG_H)
169void netsyslog(int level, const char *fmt, ...)
170#else /* defined(__STDC__) || defined(HAVE_STDARG_H) */
171     /*VARARGS*/
172     void netsyslog(va_alist)
173     va_dcl
174#endif /* defined(__STDC__) || defined(HAVE_STDARG_H) */
175{
176#if defined(__STDC__) || defined(HAVE_STDARG_H)
177#else
178	int level;
179	const char *fmt;
180#endif
181	va_list ap;
182	char buf[1025], nfmt[256];
183
184	/*
185	 * Save the error value as soon as possible
186	 */
187#ifdef SYS_WINNT
188	int errval = WSAGetLastError();
189#else
190	int errval = errno;
191#endif
192
193#if defined(__STDC__) || defined(HAVE_STDARG_H)
194	va_start(ap, fmt);
195#else
196	va_start(ap);
197
198	level = va_arg(ap, int);
199	fmt = va_arg(ap, char *);
200#endif
201	format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
202
203	vsnprintf(buf, sizeof(buf), nfmt, ap);
204	addto_syslog(level, buf);
205	va_end(ap);
206}