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