xref: /openbsd-src/usr.sbin/ntpd/log.c (revision 91f110e064cd7c194e59e019b83bb7496c1c84d4)
1 /*	$OpenBSD: log.c,v 1.8 2007/08/22 21:04:30 ckuethe Exp $ */
2 
3 /*
4  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <errno.h>
20 #include <stdarg.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 #include <syslog.h>
25 #include <time.h>
26 
27 #include "ntpd.h"
28 
29 int	 debug;
30 extern int debugsyslog;
31 
32 void	 logit(int, const char *, ...);
33 
34 void
35 log_init(int n_debug)
36 {
37 	extern char	*__progname;
38 
39 	debug = n_debug;
40 
41 	if (!debug)
42 		openlog(__progname, LOG_PID | LOG_NDELAY, LOG_DAEMON);
43 
44 	tzset();
45 }
46 
47 void
48 logit(int pri, const char *fmt, ...)
49 {
50 	va_list	ap;
51 
52 	va_start(ap, fmt);
53 	vlog(pri, fmt, ap);
54 	va_end(ap);
55 }
56 
57 void
58 vlog(int pri, const char *fmt, va_list ap)
59 {
60 	char	*nfmt;
61 
62 	if (debug) {
63 		/* best effort in out of mem situations */
64 		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
65 			vfprintf(stderr, fmt, ap);
66 			fprintf(stderr, "\n");
67 		} else {
68 			vfprintf(stderr, nfmt, ap);
69 			free(nfmt);
70 		}
71 		fflush(stderr);
72 	} else
73 		vsyslog(pri, fmt, ap);
74 }
75 
76 
77 void
78 log_warn(const char *emsg, ...)
79 {
80 	char	*nfmt;
81 	va_list	 ap;
82 
83 	/* best effort to even work in out of memory situations */
84 	if (emsg == NULL)
85 		logit(LOG_CRIT, "%s", strerror(errno));
86 	else {
87 		va_start(ap, emsg);
88 
89 		if (asprintf(&nfmt, "%s: %s", emsg, strerror(errno)) == -1) {
90 			/* we tried it... */
91 			vlog(LOG_CRIT, emsg, ap);
92 			logit(LOG_CRIT, "%s", strerror(errno));
93 		} else {
94 			vlog(LOG_CRIT, nfmt, ap);
95 			free(nfmt);
96 		}
97 		va_end(ap);
98 	}
99 }
100 
101 void
102 log_warnx(const char *emsg, ...)
103 {
104 	va_list	 ap;
105 
106 	va_start(ap, emsg);
107 	vlog(LOG_CRIT, emsg, ap);
108 	va_end(ap);
109 }
110 
111 void
112 log_info(const char *emsg, ...)
113 {
114 	va_list	 ap;
115 
116 	va_start(ap, emsg);
117 	vlog(LOG_INFO, emsg, ap);
118 	va_end(ap);
119 }
120 
121 void
122 log_debug(const char *emsg, ...)
123 {
124 	va_list	 ap;
125 
126 	if (debug || debugsyslog) {
127 		va_start(ap, emsg);
128 		vlog(LOG_DEBUG, emsg, ap);
129 		va_end(ap);
130 	}
131 }
132 
133 void
134 fatal(const char *emsg)
135 {
136 	if (emsg == NULL)
137 		logit(LOG_CRIT, "fatal: %s", strerror(errno));
138 	else
139 		if (errno)
140 			logit(LOG_CRIT, "fatal: %s: %s",
141 			    emsg, strerror(errno));
142 		else
143 			logit(LOG_CRIT, "fatal: %s", emsg);
144 
145 	exit(1);
146 }
147 
148 void
149 fatalx(const char *emsg)
150 {
151 	errno = 0;
152 	fatal(emsg);
153 }
154 
155 const char *
156 log_sockaddr(struct sockaddr *sa)
157 {
158 	static char	buf[NI_MAXHOST];
159 
160 	if (getnameinfo(sa, SA_LEN(sa), buf, sizeof(buf), NULL, 0,
161 	    NI_NUMERICHOST))
162 		return ("(unknown)");
163 	else
164 		return (buf);
165 }
166