Annotation of embedaddon/ntp/libntp/msyslog.c, revision 1.1.1.1
1.1 misho 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: #include <sys/types.h>
13: #ifdef HAVE_UNISTD_H
14: # include <unistd.h>
15: #endif
16: #include <stdio.h>
17:
18: #include "ntp.h"
19: #include "ntp_string.h"
20: #include "ntp_syslog.h"
21:
22: #ifdef SYS_WINNT
23: # include <stdarg.h>
24: # include "..\ports\winnt\libntp\messages.h"
25: #endif
26:
27:
28: int syslogit = 1;
29: int msyslog_term = FALSE; /* duplicate to stdout/err */
30: FILE * syslog_file;
31:
32: u_int32 ntp_syslogmask = ~(u_int32)0; /* libntp default is all lit */
33:
34: extern char * progname;
35:
36: /* Declare the local functions */
37: void addto_syslog (int, const char *);
38: void format_errmsg (char *, size_t, const char *, int);
39:
40:
41: /*
42: * This routine adds the contents of a buffer to the syslog or an
43: * application-specific logfile.
44: */
45: void
46: addto_syslog(
47: int level,
48: const char * msg
49: )
50: {
51: static char * prevcall_progname;
52: static char * prog;
53: const char nl[] = "\n";
54: const char empty[] = "";
55: FILE * term_file;
56: int log_to_term;
57: int log_to_file;
58: const char * nl_or_empty;
59: const char * human_time;
60:
61: /* setup program basename static var prog if needed */
62: if (progname != prevcall_progname) {
63: prevcall_progname = progname;
64: prog = strrchr(progname, DIR_SEP);
65: if (prog != NULL)
66: prog++;
67: else
68: prog = progname;
69: }
70:
71: log_to_term = msyslog_term;
72: log_to_file = FALSE;
73: #if !defined(VMS) && !defined(SYS_VXWORKS)
74: if (syslogit)
75: syslog(level, "%s", msg);
76: else
77: #endif
78: if (syslog_file != NULL)
79: log_to_file = TRUE;
80: else
81: log_to_term = TRUE;
82: #if DEBUG
83: if (debug > 0)
84: log_to_term = TRUE;
85: #endif
86: if (!(log_to_file || log_to_term))
87: return;
88:
89: /* syslog() adds the timestamp, name, and pid */
90: human_time = humanlogtime();
91:
92: /* syslog() adds trailing \n if not present */
93: if ('\n' != msg[strlen(msg) - 1])
94: nl_or_empty = nl;
95: else
96: nl_or_empty = empty;
97:
98: if (log_to_term) {
99: term_file = (level <= LOG_ERR)
100: ? stderr
101: : stdout;
102: fprintf(term_file, "%s %s[%d]: %s%s", human_time, prog,
103: (int)getpid(), msg, nl_or_empty);
104: fflush(term_file);
105: }
106:
107: if (log_to_file) {
108: fprintf(syslog_file, "%s %s[%d]: %s%s", human_time,
109: prog, (int)getpid(), msg, nl_or_empty);
110: fflush(syslog_file);
111: }
112: }
113:
114:
115: void
116: format_errmsg(
117: char * nfmt,
118: size_t lennfmt,
119: const char * fmt,
120: int errval
121: )
122: {
123: char c;
124: char *n;
125: const char *f;
126: size_t len;
127: char *err;
128:
129: n = nfmt;
130: f = fmt;
131: while ((c = *f++) != '\0' && n < (nfmt + lennfmt - 1)) {
132: if (c != '%') {
133: *n++ = c;
134: continue;
135: }
136: if ((c = *f++) != 'm') {
137: *n++ = '%';
138: if ('\0' == c)
139: break;
140: *n++ = c;
141: continue;
142: }
143: err = strerror(errval);
144: len = strlen(err);
145:
146: /* Make sure we have enough space for the error message */
147: if ((n + len) < (nfmt + lennfmt - 1)) {
148: memcpy(n, err, len);
149: n += len;
150: }
151: }
152: *n = '\0';
153: }
154:
155:
156: int
157: mvsnprintf(
158: char * buf,
159: size_t bufsiz,
160: const char * fmt,
161: va_list ap
162: )
163: {
164: #ifndef VSNPRINTF_PERCENT_M
165: char nfmt[256];
166: #else
167: const char * nfmt = fmt;
168: #endif
169: int errval;
170:
171: /*
172: * Save the error value as soon as possible
173: */
174: #ifdef SYS_WINNT
175: errval = GetLastError();
176: if (NO_ERROR == errval)
177: #endif /* SYS_WINNT */
178: errval = errno;
179:
180: #ifndef VSNPRINTF_PERCENT_M
181: format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
182: #else
183: errno = errval;
184: #endif
185: return vsnprintf(buf, bufsiz, nfmt, ap);
186: }
187:
188:
189: int
190: mvfprintf(
191: FILE * fp,
192: const char * fmt,
193: va_list ap
194: )
195: {
196: #ifndef VSNPRINTF_PERCENT_M
197: char nfmt[256];
198: #else
199: const char * nfmt = fmt;
200: #endif
201: int errval;
202:
203: /*
204: * Save the error value as soon as possible
205: */
206: #ifdef SYS_WINNT
207: errval = GetLastError();
208: if (NO_ERROR == errval)
209: #endif /* SYS_WINNT */
210: errval = errno;
211:
212: #ifndef VSNPRINTF_PERCENT_M
213: format_errmsg(nfmt, sizeof(nfmt), fmt, errval);
214: #else
215: errno = errval;
216: #endif
217: return vfprintf(fp, nfmt, ap);
218: }
219:
220:
221: int
222: mfprintf(
223: FILE * fp,
224: const char * fmt,
225: ...
226: )
227: {
228: va_list ap;
229: int rc;
230:
231: va_start(ap, fmt);
232: rc = mvfprintf(fp, fmt, ap);
233: va_end(ap);
234:
235: return rc;
236: }
237:
238:
239: int
240: mprintf(
241: const char * fmt,
242: ...
243: )
244: {
245: va_list ap;
246: int rc;
247:
248: va_start(ap, fmt);
249: rc = mvfprintf(stdout, fmt, ap);
250: va_end(ap);
251:
252: return rc;
253: }
254:
255:
256: int
257: msnprintf(
258: char * buf,
259: size_t bufsiz,
260: const char * fmt,
261: ...
262: )
263: {
264: va_list ap;
265: size_t rc;
266:
267: va_start(ap, fmt);
268: rc = mvsnprintf(buf, bufsiz, fmt, ap);
269: va_end(ap);
270:
271: return rc;
272: }
273:
274:
275: void
276: msyslog(
277: int level,
278: const char * fmt,
279: ...
280: )
281: {
282: char buf[1024];
283: va_list ap;
284:
285: va_start(ap, fmt);
286: mvsnprintf(buf, sizeof(buf), fmt, ap);
287: va_end(ap);
288: addto_syslog(level, buf);
289: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>