GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/httpd/log.c Lines: 33 80 41.3 %
Date: 2017-11-13 Branches: 5 18 27.8 %

Line Branch Exec Source
1
/*	$OpenBSD: log.c,v 1.14 2017/03/21 12:06:55 bluhm 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 USE, DATA OR PROFITS, WHETHER IN AN
15
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
 */
18
19
#include <stdio.h>
20
#include <stdlib.h>
21
#include <stdarg.h>
22
#include <string.h>
23
#include <syslog.h>
24
#include <errno.h>
25
#include <time.h>
26
27
static int	 debug;
28
static int	 verbose;
29
const char	*log_procname;
30
31
void	log_init(int, int);
32
void	log_procinit(const char *);
33
void	log_setverbose(int);
34
int	log_getverbose(void);
35
void	log_warn(const char *, ...)
36
	    __attribute__((__format__ (printf, 1, 2)));
37
void	log_warnx(const char *, ...)
38
	    __attribute__((__format__ (printf, 1, 2)));
39
void	log_info(const char *, ...)
40
	    __attribute__((__format__ (printf, 1, 2)));
41
void	log_debug(const char *, ...)
42
	    __attribute__((__format__ (printf, 1, 2)));
43
void	logit(int, const char *, ...)
44
	    __attribute__((__format__ (printf, 2, 3)));
45
void	vlog(int, const char *, va_list)
46
	    __attribute__((__format__ (printf, 2, 0)));
47
__dead void fatal(const char *, ...)
48
	    __attribute__((__format__ (printf, 1, 2)));
49
__dead void fatalx(const char *, ...)
50
	    __attribute__((__format__ (printf, 1, 2)));
51
52
void
53
log_init(int n_debug, int facility)
54
{
55
	extern char	*__progname;
56
57
192
	debug = n_debug;
58
96
	verbose = n_debug;
59
96
	log_procinit(__progname);
60
61
96
	if (!debug)
62
		openlog(__progname, LOG_PID | LOG_NDELAY, facility);
63
64
96
	tzset();
65
96
}
66
67
void
68
log_procinit(const char *procname)
69
{
70
288
	if (procname != NULL)
71
144
		log_procname = procname;
72
144
}
73
74
void
75
log_setverbose(int v)
76
{
77
96
	verbose = v;
78
48
}
79
80
int
81
log_getverbose(void)
82
{
83
	return (verbose);
84
}
85
86
void
87
logit(int pri, const char *fmt, ...)
88
{
89
	va_list	ap;
90
91
	va_start(ap, fmt);
92
	vlog(pri, fmt, ap);
93
	va_end(ap);
94
}
95
96
void
97
vlog(int pri, const char *fmt, va_list ap)
98
{
99
384
	char	*nfmt;
100
192
	int	 saved_errno = errno;
101
102
192
	if (debug) {
103
		/* best effort in out of mem situations */
104
192
		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
105
			vfprintf(stderr, fmt, ap);
106
			fprintf(stderr, "\n");
107
		} else {
108
192
			vfprintf(stderr, nfmt, ap);
109
192
			free(nfmt);
110
		}
111
192
		fflush(stderr);
112
192
	} else
113
		vsyslog(pri, fmt, ap);
114
115
192
	errno = saved_errno;
116
192
}
117
118
void
119
log_warn(const char *emsg, ...)
120
{
121
	char		*nfmt;
122
	va_list		 ap;
123
	int		 saved_errno = errno;
124
125
	/* best effort to even work in out of memory situations */
126
	if (emsg == NULL)
127
		logit(LOG_ERR, "%s", strerror(saved_errno));
128
	else {
129
		va_start(ap, emsg);
130
131
		if (asprintf(&nfmt, "%s: %s", emsg,
132
		    strerror(saved_errno)) == -1) {
133
			/* we tried it... */
134
			vlog(LOG_ERR, emsg, ap);
135
			logit(LOG_ERR, "%s", strerror(saved_errno));
136
		} else {
137
			vlog(LOG_ERR, nfmt, ap);
138
			free(nfmt);
139
		}
140
		va_end(ap);
141
	}
142
143
	errno = saved_errno;
144
}
145
146
void
147
log_warnx(const char *emsg, ...)
148
{
149
	va_list	 ap;
150
151
	va_start(ap, emsg);
152
	vlog(LOG_ERR, emsg, ap);
153
	va_end(ap);
154
}
155
156
void
157
log_info(const char *emsg, ...)
158
{
159
192
	va_list	 ap;
160
161
96
	va_start(ap, emsg);
162
96
	vlog(LOG_INFO, emsg, ap);
163
96
	va_end(ap);
164
96
}
165
166
void
167
log_debug(const char *emsg, ...)
168
{
169
192
	va_list	 ap;
170
171
96
	if (verbose > 1) {
172
96
		va_start(ap, emsg);
173
96
		vlog(LOG_DEBUG, emsg, ap);
174
96
		va_end(ap);
175
96
	}
176
96
}
177
178
static void
179
vfatalc(int code, const char *emsg, va_list ap)
180
{
181
	static char	s[BUFSIZ];
182
	const char	*sep;
183
184
	if (emsg != NULL) {
185
		(void)vsnprintf(s, sizeof(s), emsg, ap);
186
		sep = ": ";
187
	} else {
188
		s[0] = '\0';
189
		sep = "";
190
	}
191
	if (code)
192
		logit(LOG_CRIT, "%s: %s%s%s",
193
		    log_procname, s, sep, strerror(code));
194
	else
195
		logit(LOG_CRIT, "%s%s%s", log_procname, sep, s);
196
}
197
198
void
199
fatal(const char *emsg, ...)
200
{
201
	va_list	ap;
202
203
	va_start(ap, emsg);
204
	vfatalc(errno, emsg, ap);
205
	va_end(ap);
206
	exit(1);
207
}
208
209
void
210
fatalx(const char *emsg, ...)
211
{
212
	va_list	ap;
213
214
	va_start(ap, emsg);
215
	vfatalc(0, emsg, ap);
216
	va_end(ap);
217
	exit(1);
218
}