Commit Diff


commit - 58fae4ea901aed6b093c5a336eb09abe6efe5880
commit + eae52ad493f582222b4f2b748c0043c42bb851cb
blob - 53750978e4b74eaa54e7466f6c9f752362fc23da
blob + 171925942359ccc88b8bce2919e568b1b72f3187
--- Makefile
+++ Makefile
@@ -23,6 +23,7 @@ GMID_SRCS =	config.c \
 		fcgi.c \
 		gmid.c \
 		iri.c \
+		log.c \
 		logger.c \
 		mime.c \
 		proxy.c \
@@ -40,6 +41,7 @@ GE_SRCS =	config.c \
 		fcgi.c \
 		ge.c \
 		iri.c \
+		log.c \
 		logger.c \
 		mime.c \
 		proxy.c \
@@ -58,6 +60,7 @@ GG_SRCS =	gg.c \
 GG_OBJS =	${GG_SRCS:.c=.o} ${COBJS}
 
 SRCS =		gmid.h \
+		log.h \
 		logger.h \
 		parse.y \
 		${GMID_SRCS} \
@@ -158,6 +161,8 @@ DISTFILES =	.cirrus.yml \
 		gmid.conf.5 \
 		gmid.h \
 		iri.c \
+		log.c \
+		log.h \
 		logger.c \
 		mime.c \
 		parse.y \
blob - c67b1ac780daefb07262cce6dadea741d3c08789
blob + 553211ee691c6c4941dfc564240b9d7a6362b253
--- fcgi.c
+++ fcgi.c
@@ -20,7 +20,7 @@
 #include <errno.h>
 #include <string.h>
 
-#include "logger.h"
+#include "log.h"
 
 /*
  * Sometimes it can be useful to inspect the fastcgi traffic as
@@ -262,8 +262,7 @@ fcgi_read(struct bufferevent *bev, void *d)
 		memcpy(&hdr, EVBUFFER_DATA(src), sizeof(hdr));
 
 		if (recid(&hdr) != 1) {
-			log_err(NULL,
-			    "got invalid client id %d from fcgi backend",
+			log_warnx("got invalid client id %d from fcgi backend",
 			    recid(&hdr));
 			goto err;
 		}
@@ -283,8 +282,8 @@ fcgi_read(struct bufferevent *bev, void *d)
 		switch (hdr.type) {
 		case FCGI_END_REQUEST:
 			if (len != sizeof(end)) {
-				log_err(NULL,
-				    "got invalid end request record size");
+				log_warnx("got invalid end request"
+				    " record size");
 				goto err;
 			}
 			bufferevent_read(bev, &end, sizeof(end));
@@ -305,7 +304,7 @@ fcgi_read(struct bufferevent *bev, void *d)
 			break;
 
 		default:
-			log_err(NULL, "got invalid fcgi record (type=%d)",
+			log_warnx("got invalid fcgi record (type=%d)",
 			    hdr.type);
 			goto err;
 		}
@@ -332,8 +331,7 @@ fcgi_error(struct bufferevent *bev, short err, void *d
 	struct client	*c = d;
 
 	if (!(err & (EVBUFFER_ERROR|EVBUFFER_EOF)))
-		log_warn(NULL, "unknown event error (%x): %s",
-		    err, strerror(errno));
+		log_warn("unknown event error (%x)", err);
 
 	c->type = REQUEST_DONE;
 	if (c->code != 0)
blob - 51060f8bc05976081654d8dd4d39ec07df9c8836
blob + e310714ea7937c13c5255facecd139157fd0adf5
--- ge.c
+++ ge.c
@@ -26,9 +26,11 @@
 #include <libgen.h>
 #include <signal.h>
 #include <string.h>
+#include <syslog.h>
 #include <unistd.h>
 
 #include "logger.h"
+#include "log.h"
 
 struct imsgbuf ibuf, logibuf;
 struct conf conf;
@@ -184,7 +186,7 @@ serve(const char *host, int port, const char *dir)
 		fatal("%s", cause);
 	freeaddrinfo(res0);
 
-	log_notice(NULL, "serving %s on port %d", dir, port);
+	log_info("serving %s on port %d", dir, port);
 	return server_main(NULL, sock, -1);
 }
 
@@ -209,6 +211,8 @@ main(int argc, char **argv)
 
 	setlocale(LC_CTYPE, "");
 
+	log_init(1, LOG_DAEMON);
+	log_setverbose(0);
 	logger_init();
 	config_init();
 
@@ -251,7 +255,6 @@ main(int argc, char **argv)
 		certs_dir = data_dir();
 
 	/* set up the implicit vhost and location */
-
 	host = xcalloc(1, sizeof(*host));
 	TAILQ_INSERT_HEAD(&hosts, host, vhosts);
 
blob - 187ca1c333390622af4927f8dd48efe5717abc70
blob + 200d6a608eebbd062ba8fda6a218f34f25a85398
--- gmid.c
+++ gmid.c
@@ -28,8 +28,10 @@
 #include <pwd.h>
 #include <signal.h>
 #include <string.h>
+#include <syslog.h>
 
 #include "logger.h"
+#include "log.h"
 
 static const char	*opts = "c:D:fhnP:Vv";
 
@@ -154,8 +156,7 @@ drop_priv(void)
 	}
 
 	if (getuid() == 0)
-		log_warn(NULL,
-		    "not a good idea to run a network daemon as root");
+		log_warnx("not a good idea to run a network daemon as root");
 }
 
 static void
@@ -253,6 +254,8 @@ main(int argc, char **argv)
 
 	setlocale(LC_CTYPE, "");
 
+	/* log to stderr until daemonized */
+	log_init(1, LOG_DAEMON);
 	logger_init();
 	config_init();
 
@@ -308,10 +311,12 @@ main(int argc, char **argv)
 		/* log to syslog */
 		imsg_compose(&logibuf, IMSG_LOG_TYPE, 0, 0, -1, NULL, 0);
 		imsg_flush(&logibuf);
+		log_init(0, LOG_DAEMON);
 
 		if (daemon(1, 1) == -1)
 			fatal("daemon");
 	}
+	log_setverbose(conf.verbose);
 
 	sock4 = make_socket(conf.port, AF_INET);
 	sock6 = -1;
@@ -338,7 +343,7 @@ main(int argc, char **argv)
 		if (!wait_signal())
 			break;
 
-		log_info(NULL, "reloading configuration %s", config_path);
+		log_info("reloading configuration %s", config_path);
 
 		/* close the servers */
 		for (i = 0; i < conf.prefork; ++i) {
blob - 4ebf63bcb52f0d524c4913957d4516fdfe807221
blob + 3f02b6374670beb904fb25298e684dc1984ddea6
--- logger.c
+++ logger.c
@@ -31,6 +31,7 @@
 #include <time.h>
 
 #include "logger.h"
+#include "log.h"
 
 static struct event imsgev;
 
@@ -47,188 +48,8 @@ static imsg_handlerfn *handlers[] = {
 	[IMSG_LOG_REQUEST] = handle_imsg_log,
 	[IMSG_LOG_TYPE] = handle_imsg_log_type,
 };
-
-static inline void
-print_date(FILE *f)
-{
-	struct tm	tminfo;
-	time_t		t;
-	char		buf[20];
-
-	time(&t);
-	strftime(buf, sizeof(buf), "%F %T",
-	    localtime_r(&t, &tminfo));
-	fprintf(f, "[%s] ", buf);
-}
-
-static inline int
-should_log(int priority)
-{
-	switch (priority) {
-	case LOG_ERR:
-		return 1;
-	case LOG_WARNING:
-		return 1;
-	case LOG_NOTICE:
-		return conf.verbose >= 1;
-	case LOG_INFO:
-		return conf.verbose >= 2;
-	case LOG_DEBUG:
-		return conf.verbose >= 3;
-	default:
-		return 0;
-	}
-}
-
-static inline void
-send_log(int type, int priority, const char *msg, size_t len)
-{
-	imsg_compose(&logibuf, type, priority, 0, -1, msg, len);
-	imsg_flush(&logibuf);
-}
-
-static __dead void
-fatal_impl(int use_err, const char *fmt, va_list ap)
-{
-	struct pollfd pfd;
-	char *str, *tmp;
-	int r, t, err;
-
-	err = errno;
-
-	if ((r = vasprintf(&str, fmt, ap)) != -1) {
-		if (use_err &&
-		    (t = asprintf(&tmp, "%s: %s", str, strerror(err))) !=
-		    -1) {
-			free(str);
-			str = tmp;
-			r = t;
-		}
-	} else
-		str = NULL, r = 0;
-
-	send_log(IMSG_LOG, LOG_CRIT, str, r + 1);
-	free(str);
-
-	/* wait for the logger process to shut down */
-	memset(&pfd, 0, sizeof(pfd));
-	pfd.fd = logibuf.fd;
-	pfd.events = POLLIN;
-	poll(&pfd, 1, 1000);
-
-	exit(1);
-}
-
-void __dead
-fatal(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	fatal_impl(1, fmt, ap);
-	va_end(ap);
-}
-
-void __dead
-fatalx(const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	fatal_impl(0, fmt, ap);
-	va_end(ap);
-}
-
-static inline void
-vlog(int priority, struct client *c,
-    const char *fmt, va_list ap)
-{
-	char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
-	char *fmted, *s;
-	size_t len;
-	int ec;
-
-	if (!should_log(priority))
-		return;
-
-	if (c != NULL) {
-		len = sizeof(c->addr);
-		ec = getnameinfo((struct sockaddr*)&c->addr, len,
-		    hbuf, sizeof(hbuf),
-		    sbuf, sizeof(sbuf),
-		    NI_NUMERICHOST | NI_NUMERICSERV);
-		if (ec != 0)
-			fatal("getnameinfo: %s", gai_strerror(ec));
-	}
 
-	if (vasprintf(&fmted, fmt, ap) == -1)
-		fatal("vasprintf: %s", strerror(errno));
-
-	if (c == NULL)
-		ec = asprintf(&s, "internal: %s", fmted);
-	else
-		ec = asprintf(&s, "%s:%s %s", hbuf, sbuf, fmted);
-
-	if (ec < 0)
-		fatal("asprintf: %s", strerror(errno));
-
-	send_log(IMSG_LOG, priority, s, ec+1);
-
-	free(fmted);
-	free(s);
-}
-
 void
-log_err(struct client *c, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vlog(LOG_ERR, c, fmt, ap);
-	va_end(ap);
-}
-
-void
-log_warn(struct client *c, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vlog(LOG_WARNING, c, fmt, ap);
-	va_end(ap);
-}
-
-void
-log_notice(struct client *c, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vlog(LOG_NOTICE, c, fmt, ap);
-	va_end(ap);
-}
-
-void
-log_info(struct client *c, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vlog(LOG_INFO, c, fmt, ap);
-	va_end(ap);
-}
-
-void
-log_debug(struct client *c, const char *fmt, ...)
-{
-	va_list ap;
-
-	va_start(ap, fmt);
-	vlog(LOG_DEBUG, c, fmt, ap);
-	va_end(ap);
-}
-
-void
 log_request(struct client *c, char *meta, size_t l)
 {
 	char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV], b[GEMINI_URL_LEN];
@@ -277,34 +98,16 @@ log_request(struct client *c, char *meta, size_t l)
 	    (int)(t-meta), meta);
 	if (ec < 0)
 		err(1, "asprintf");
-	send_log(IMSG_LOG_REQUEST, LOG_NOTICE, fmted, ec+1);
+
+	imsg_compose(&logibuf, IMSG_LOG_REQUEST, 0, 0, -1, fmted, ec + 1);
+	imsg_flush(&logibuf);
+
 	free(fmted);
 }
 
 
 
 static void
-do_log(int type, int priority, const char *msg)
-{
-	int quit = 0;
-
-	if (priority == LOG_CRIT) {
-		quit = 1;
-		priority = LOG_ERR;
-	}
-
-	if (log != NULL) {
-		if (type != IMSG_LOG_REQUEST)
-			print_date(log);
-		fprintf(log, "%s\n", msg);
-	} else
-		syslog(LOG_DAEMON | priority, "%s", msg);
-
-	if (quit)
-		exit(1);
-}
-
-static void
 handle_imsg_quit(struct imsgbuf *ibuf, struct imsg *imsg, size_t datalen)
 {
 	event_loopbreak();
@@ -313,13 +116,15 @@ handle_imsg_quit(struct imsgbuf *ibuf, struct imsg *im
 static void
 handle_imsg_log(struct imsgbuf *ibuf, struct imsg *imsg, size_t datalen)
 {
-	int	 priority;
 	char	*msg;
 
 	msg = imsg->data;
 	msg[datalen-1] = '\0';
-	priority = imsg->hdr.peerid;
-	do_log(imsg->hdr.type, priority, msg);
+
+	if (log != NULL)
+		fprintf(log, "%s\n", msg);
+	else
+		syslog(LOG_DAEMON | LOG_NOTICE, "%s", msg);
 }
 
 static void
@@ -352,9 +157,6 @@ logger_main(int fd, struct imsgbuf *ibuf)
 {
 	log = stderr;
 
-	openlog(getprogname(), LOG_NDELAY, LOG_DAEMON);
-	tzset();
-
 	event_init();
 
 	event_set(&imsgev, fd, EV_READ | EV_PERSIST, &handle_dispatch_imsg, ibuf);
blob - /dev/null
blob + 179235943ad862e0426e472d7b0922bf3fef0371 (mode 644)
--- /dev/null
+++ log.c
@@ -0,0 +1,197 @@
+/*	$OpenBSD: log.c,v 1.1 2018/07/10 16:39:54 florian Exp $	*/
+
+/*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <syslog.h>
+#include <errno.h>
+#include <time.h>
+
+#include "log.h"
+
+static int		 debug;
+static int		 verbose;
+static const char	*log_procname;
+
+void
+log_init(int n_debug, int facility)
+{
+	debug = n_debug;
+	verbose = n_debug;
+	log_procinit(getprogname());
+
+	if (!debug)
+		openlog(getprogname(), LOG_PID | LOG_NDELAY, facility);
+
+	tzset();
+}
+
+void
+log_procinit(const char *procname)
+{
+	if (procname != NULL)
+		log_procname = procname;
+}
+
+void
+log_setverbose(int v)
+{
+	verbose = v;
+}
+
+int
+log_getverbose(void)
+{
+	return (verbose);
+}
+
+void
+logit(int pri, const char *fmt, ...)
+{
+	va_list	ap;
+
+	va_start(ap, fmt);
+	vlog(pri, fmt, ap);
+	va_end(ap);
+}
+
+void
+vlog(int pri, const char *fmt, va_list ap)
+{
+	char	*nfmt;
+	int	 saved_errno = errno;
+
+	if (debug) {
+		/* best effort in out of mem situations */
+		if (asprintf(&nfmt, "%s\n", fmt) == -1) {
+			vfprintf(stderr, fmt, ap);
+			fprintf(stderr, "\n");
+		} else {
+			vfprintf(stderr, nfmt, ap);
+			free(nfmt);
+		}
+		fflush(stderr);
+	} else
+		vsyslog(pri, fmt, ap);
+
+	errno = saved_errno;
+}
+
+void
+log_warn(const char *emsg, ...)
+{
+	char		*nfmt;
+	va_list		 ap;
+	int		 saved_errno = errno;
+
+	/* best effort to even work in out of memory situations */
+	if (emsg == NULL)
+		logit(LOG_ERR, "%s", strerror(saved_errno));
+	else {
+		va_start(ap, emsg);
+
+		if (asprintf(&nfmt, "%s: %s", emsg,
+		    strerror(saved_errno)) == -1) {
+			/* we tried it... */
+			vlog(LOG_ERR, emsg, ap);
+			logit(LOG_ERR, "%s", strerror(saved_errno));
+		} else {
+			vlog(LOG_ERR, nfmt, ap);
+			free(nfmt);
+		}
+		va_end(ap);
+	}
+
+	errno = saved_errno;
+}
+
+void
+log_warnx(const char *emsg, ...)
+{
+	va_list	 ap;
+
+	va_start(ap, emsg);
+	vlog(LOG_ERR, emsg, ap);
+	va_end(ap);
+}
+
+void
+log_info(const char *emsg, ...)
+{
+	va_list	 ap;
+
+	va_start(ap, emsg);
+	vlog(LOG_INFO, emsg, ap);
+	va_end(ap);
+}
+
+void
+log_debug(const char *emsg, ...)
+{
+	va_list	 ap;
+
+	if (verbose) {
+		va_start(ap, emsg);
+		vlog(LOG_DEBUG, emsg, ap);
+		va_end(ap);
+	}
+}
+
+static void
+vfatalc(int code, const char *emsg, va_list ap)
+{
+	static char	s[BUFSIZ];
+	const char	*sep;
+
+	if (emsg != NULL) {
+		(void)vsnprintf(s, sizeof(s), emsg, ap);
+		sep = ": ";
+	} else {
+		s[0] = '\0';
+		sep = "";
+	}
+	if (code)
+		logit(LOG_CRIT, "fatal in %s: %s%s%s",
+		    log_procname, s, sep, strerror(code));
+	else
+		logit(LOG_CRIT, "fatal in %s%s%s", log_procname, sep, s);
+}
+
+void
+fatal(const char *emsg, ...)
+{
+	va_list	ap;
+
+	va_start(ap, emsg);
+	vfatalc(errno, emsg, ap);
+	va_end(ap);
+	exit(1);
+}
+
+void
+fatalx(const char *emsg, ...)
+{
+	va_list	ap;
+
+	va_start(ap, emsg);
+	vfatalc(0, emsg, ap);
+	va_end(ap);
+	exit(1);
+}
blob - 95d1b22f5bbb5aff8178c5c8fb456453a5024041
blob + ae870c297da8ac83186b5ded4c1c47efdd3a05d8
--- logger.h
+++ logger.h
@@ -14,21 +14,5 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-void		 fatal(const char *, ...)
-	__attribute__((format (printf, 1, 2)))
-	__attribute__((__noreturn__));
-void		 fatalx(const char *, ...)
-	__attribute__((format (printf, 1, 2)))
-	__attribute__((__noreturn__));
-
-struct client;
-
-#define LOG_ATTR_FMT __attribute__((format (printf, 2, 3)))
-void		 log_err(struct client *, const char *, ...)	LOG_ATTR_FMT;
-void		 log_warn(struct client *, const char *, ...)	LOG_ATTR_FMT;
-void		 log_warnx(struct client *, const char *, ...)	LOG_ATTR_FMT;
-void		 log_notice(struct client *, const char *, ...)	LOG_ATTR_FMT;
-void		 log_info(struct client *, const char *, ...)	LOG_ATTR_FMT;
-void		 log_debug(struct client *, const char *, ...)	LOG_ATTR_FMT;
 void		 log_request(struct client *, char *, size_t);
 int		 logger_main(int, struct imsgbuf *);
blob - /dev/null
blob + 0fa046fc3afbe8c893d40f492481a4d3055dd2bc (mode 644)
--- /dev/null
+++ log.h
@@ -0,0 +1,45 @@
+/*	$OpenBSD: log.h,v 1.2 2021/12/13 18:28:40 deraadt Exp $ */
+
+/*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef LOG_H
+#define LOG_H
+
+#include <stdarg.h>
+
+void	log_init(int, int);
+void	log_procinit(const char *);
+void	log_setverbose(int);
+int	log_getverbose(void);
+void	log_warn(const char *, ...)
+	    __attribute__((__format__ (printf, 1, 2)));
+void	log_warnx(const char *, ...)
+	    __attribute__((__format__ (printf, 1, 2)));
+void	log_info(const char *, ...)
+	    __attribute__((__format__ (printf, 1, 2)));
+void	log_debug(const char *, ...)
+	    __attribute__((__format__ (printf, 1, 2)));
+void	logit(int, const char *, ...)
+	    __attribute__((__format__ (printf, 2, 3)));
+void	vlog(int, const char *, va_list)
+	    __attribute__((__format__ (printf, 2, 0)));
+__dead void fatal(const char *, ...)
+	    __attribute__((__format__ (printf, 1, 2)));
+__dead void fatalx(const char *, ...)
+	    __attribute__((__format__ (printf, 1, 2)));
+
+#endif /* LOG_H */
blob - f493bb02b557ff0b98511b30082ee1a67061d19d
blob + 9197c8b131e1e9c670c9d7bf13635eaa8b9b1919
--- mime.c
+++ mime.c
@@ -20,7 +20,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "logger.h"
+#include "log.h"
 
 void
 init_mime(struct mime *mime)
blob - 7c963f64adec35ea7d6e05643347e2c6583fc827
blob + 534c7b6ee45333534558ec9e9e0a389544bccf5c
--- parse.y
+++ parse.y
@@ -886,8 +886,7 @@ pushfile(const char *name, int secret)
 	nfile = xcalloc(1, sizeof(*nfile));
 	nfile->name = xstrdup(name);
 	if ((nfile->stream = fopen(nfile->name, "r")) == NULL) {
-		log_warn(NULL, "can't open %s: %s", nfile->name,
-		    strerror(errno));
+		log_warn("can't open %s", nfile->name);
 		free(nfile->name);
 		free(nfile);
 		return NULL;
blob - e64a9f101d736dc93290217938104b97094d2ff7
blob + 56158834a5be3719f833032c17f11e7a87219bee
--- proxy.c
+++ proxy.c
@@ -20,7 +20,7 @@
 #include <errno.h>
 #include <string.h>
 
-#include "logger.h"
+#include "log.h"
 
 #define MIN(a, b)	((a) < (b) ? (a) : (b))
 
@@ -152,7 +152,7 @@ proxy_read(struct bufferevent *bev, void *d)
 		if (hdr == NULL) {
 			/* max reply + \r\n */
 			if (EVBUFFER_LENGTH(src) > 1029) {
-				log_warn(c, "upstream server is trying to "
+				log_warnx("upstream server is trying to "
 				    "send a header that's too long.");
 				proxy_error(bev, EVBUFFER_READ, c);
 			}
@@ -166,7 +166,7 @@ proxy_read(struct bufferevent *bev, void *d)
 		    !isdigit((unsigned char)hdr[1]) ||
 		    !isspace((unsigned char)hdr[2])) {
 			free(hdr);
-			log_warn(c, "upstream server is trying to send a "
+			log_warnx("upstream server is trying to send a "
 			    "header that's too long.");
 			proxy_error(bev, EVBUFFER_READ, c);
 			return;
@@ -176,7 +176,7 @@ proxy_read(struct bufferevent *bev, void *d)
 		code = (hdr[0] - '0') * 10 + (hdr[1] - '0');
 
 		if (code < 10 || code >= 70) {
-			log_warn(c, "upstream server is trying to send an "
+			log_warnx("upstream server is trying to send an "
 			    "invalid reply code: %d", code);
 			proxy_error(bev, EVBUFFER_READ, c);
 			return;
@@ -284,7 +284,7 @@ proxy_handshake(int fd, short event, void *d)
 		event_add(&c->proxyev, &handshake_timeout);
 		return;
 	case -1:
-		log_warn(c, "handshake with proxy failed: %s",
+		log_warnx("handshake with proxy failed: %s",
 		    tls_error(c->proxyctx));
 		start_reply(c, PROXY_ERROR, "handshake failed");
 		return;
blob - ddc6967cf3f612f4357bfaad95b215662f522005
blob + d0d05b1dfd036d3fcbed464ed83a602baa48dba1
--- sandbox.c
+++ sandbox.c
@@ -15,7 +15,7 @@
  */
 
 #include "gmid.h"
-#include "logger.h"
+#include "log.h"
 
 #if defined(__OpenBSD__)
 
blob - 51ddef29f5c9a040396f5dee01947c1d571afbe2
blob + d9a42e0ed9fe9b77cb918dbd021c0c27a52b2b3f
--- server.c
+++ server.c
@@ -29,6 +29,7 @@
 #include <string.h>
 
 #include "logger.h"
+#include "log.h"
 
 #define MIN(a, b)	((a) < (b) ? (a) : (b))
 
@@ -321,16 +322,16 @@ check_path(struct client *c, const char *path, int *fd
 		p = ".";
 
 	dirfd = vhost_dirfd(c->host, path, &c->loc);
-	log_debug(c, "check_path: strip=%d path=%s original=%s",
+	log_debug("check_path: strip=%d path=%s original=%s",
 	    strip, p, path);
 	if (*fd == -1 && (*fd = openat(dirfd, p, O_RDONLY)) == -1) {
 		if (errno == EACCES)
-			log_info(c, "can't open %s: %s", p, strerror(errno));
+			log_info("can't open %s: %s", p, strerror(errno));
 		return FILE_MISSING;
 	}
 
 	if (fstat(*fd, &sb) == -1) {
-		log_notice(c, "failed stat for %s: %s", path, strerror(errno));
+		log_warn("fstat %s", path);
 		return FILE_MISSING;
 	}
 
@@ -414,12 +415,12 @@ handle_handshake(int fd, short ev, void *d)
 #endif
 
 	if ((servname = tls_conn_servername(c->ctx)) == NULL) {
-		log_debug(c, "handshake: missing SNI");
+		log_debug("handshake: missing SNI");
 		goto err;
 	}
 
 	if (!puny_decode(servname, c->domain, sizeof(c->domain), &parse_err)) {
-		log_info(c, "puny_decode: %s", parse_err);
+		log_info("puny_decode: %s", parse_err);
 		goto err;
 	}
 
@@ -433,7 +434,7 @@ handle_handshake(int fd, short ev, void *d)
 	}
 
 found:
-	log_debug(c, "handshake: SNI: \"%s\"; decoded: \"%s\"; matched: \"%s\"",
+	log_debug("handshake: SNI: \"%s\"; decoded: \"%s\"; matched: \"%s\"",
 	    servname != NULL ? servname : "(null)",
 	    c->domain,
 	    h != NULL ? h->domain : "(null)");
@@ -580,7 +581,8 @@ static int
 proxy_socket(struct client *c, const char *host, const char *port)
 {
 	struct addrinfo hints, *res, *res0;
-	int r, sock;
+	int r, sock, save_errno;
+	const char *cause = NULL;
 
 	memset(&hints, 0, sizeof(hints));
 	hints.ai_family = AF_UNSPEC;
@@ -589,7 +591,7 @@ proxy_socket(struct client *c, const char *host, const
 	/* XXX: asr_run? :> */
 	r = getaddrinfo(host, port, &hints, &res0);
 	if (r != 0) {
-		log_warn(c, "getaddrinfo(\"%s\", \"%s\"): %s",
+		log_warnx("getaddrinfo(\"%s\", \"%s\"): %s",
 		    host, port, gai_strerror(r));
 		return -1;
 	}
@@ -597,11 +599,16 @@ proxy_socket(struct client *c, const char *host, const
 	for (res = res0; res; res = res->ai_next) {
 		sock = socket(res->ai_family, res->ai_socktype,
 		    res->ai_protocol);
-		if (sock == -1)
+		if (sock == -1) {
+			cause = "socket";
 			continue;
+		}
 
 		if (connect(sock, res->ai_addr, res->ai_addrlen) == -1) {
+			cause = "connect";
+			save_errno = errno;
 			close(sock);
+			errno = save_errno;
 			sock = -1;
 			continue;
 		}
@@ -609,11 +616,11 @@ proxy_socket(struct client *c, const char *host, const
 		break;
 	}
 
-	freeaddrinfo(res0);
-
 	if (sock == -1)
-		log_warn(c, "can't connect to %s:%s", host, port);
+		log_warn("can't connect to %s:%s: %s", host, port, cause);
 
+	freeaddrinfo(res0);
+
 	return sock;
 }
 
@@ -631,7 +638,7 @@ apply_reverse_proxy(struct client *c)
 	if (p->reqca != NULL && check_matching_certificate(p->reqca, c))
 		return 1;
 
-	log_debug(c, "opening proxy connection for %s:%s",
+	log_debug("opening proxy connection for %s:%s",
 	    p->host, p->port);
 
 	if ((c->pfd = proxy_socket(c, p->host, p->port)) == -1) {
@@ -653,7 +660,7 @@ fcgi_open_sock(struct fcgi *f)
 	int			fd;
 
 	if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
-		log_err(NULL, "socket: %s", strerror(errno));
+		log_warn("socket");
 		return -1;
 	}
 
@@ -662,8 +669,7 @@ fcgi_open_sock(struct fcgi *f)
 	strlcpy(addr.sun_path, f->path, sizeof(addr.sun_path));
 
 	if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
-		log_warn(NULL, "failed to connect to %s: %s", f->path,
-		    strerror(errno));
+		log_warn("failed to connect to %s", f->path);
 		close(fd);
 		return -1;
 	}
@@ -674,8 +680,9 @@ fcgi_open_sock(struct fcgi *f)
 static int
 fcgi_open_conn(struct fcgi *f)
 {
-	struct addrinfo	hints, *servinfo, *p;
-	int		r, sock;
+	struct addrinfo	 hints, *servinfo, *p;
+	int		 r, sock, save_errno;
+	const char	*cause = NULL;
 
 	memset(&hints, 0, sizeof(hints));
 	hints.ai_family = AF_UNSPEC;
@@ -683,24 +690,30 @@ fcgi_open_conn(struct fcgi *f)
 	hints.ai_flags = AI_ADDRCONFIG;
 
 	if ((r = getaddrinfo(f->path, f->port, &hints, &servinfo)) != 0) {
-		log_warn(NULL, "getaddrinfo %s:%s: %s", f->path, f->port,
+		log_warnx("getaddrinfo %s:%s: %s", f->path, f->port,
 		    gai_strerror(r));
 		return -1;
 	}
 
 	for (p = servinfo; p != NULL; p = p->ai_next) {
 		sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
-		if (sock == -1)
+		if (sock == -1) {
+			cause = "socket";
 			continue;
+		}
 		if (connect(sock, p->ai_addr, p->ai_addrlen) == -1) {
+			cause = "connect";
+			save_errno = errno;
 			close(sock);
+			errno = save_errno;
 			continue;
 		}
 		break;
 	}
 
 	if (p == NULL) {
-		log_warn(NULL, "couldn't connect to %s:%s", f->path, f->port);
+		log_warn("couldn't connect to %s:%s: %s", f->path, f->port,
+		    cause);
 		sock = -1;
 	}
 
@@ -720,7 +733,7 @@ apply_fastcgi(struct client *c)
 
 	f = &fcgi[id];
 
-	log_debug(c, "opening fastcgi connection for (%s,%s)",
+	log_debug("opening fastcgi connection for (%s,%s)",
 	    f->path, f->port);
 
 	if (*f->port == '\0')
@@ -766,7 +779,7 @@ open_dir(struct client *c)
 	int dirfd, root;
 	char *before_file;
 
-	log_debug(c, "in open_dir");
+	log_debug("in open_dir");
 
 	root = !strcmp(c->iri.path, "/") || *c->iri.path == '\0';
 
@@ -818,8 +831,8 @@ open_dir(struct client *c)
 		    root ? select_non_dotdot : select_non_dot,
 		    alphasort);
 		if (c->dirlen == -1) {
-			log_err(c, "scandir_fd(%d) (vhost:%s) %s: %s",
-			    c->pfd, c->host->domain, c->iri.path, strerror(errno));
+			log_warn("scandir_fd(%d) (vhost:%s) %s",
+			    c->pfd, c->host->domain, c->iri.path);
 			start_reply(c, TEMP_FAILURE, "internal server error");
 			return;
 		}
@@ -959,7 +972,7 @@ retry:
 	event_add(&bufev->ev_write, NULL);
 	return;
 err:
-	log_err(client, "tls error: %s", tls_error(client->ctx));
+	log_warnx("tls error: %s", tls_error(client->ctx));
 	(*bufev->errorcb)(bufev, what, bufev->cbarg);
 }
 
@@ -984,7 +997,7 @@ client_read(struct bufferevent *bev, void *d)
 
 	/* max url len + \r\n */
 	if (EVBUFFER_LENGTH(src) > 1024 + 2) {
-		log_err(c, "too much data received");
+		log_debug("too much data received");
 		start_reply(c, BAD_REQUEST, "bad request");
 		return;
 	}
@@ -997,14 +1010,14 @@ client_read(struct bufferevent *bev, void *d)
 	}
 	c->reqlen = strlen(c->req);
 	if (c->reqlen > 1024+2) {
-		log_err(c, "URL too long");
+		log_debug("URL too long");
 		start_reply(c, BAD_REQUEST, "bad request");
 		return;
 	}
 
 	if (!parse_iri(c->req, &c->iri, &parse_err) ||
 	    !puny_decode(c->iri.host, decoded, sizeof(decoded), &parse_err)) {
-		log_err(c, "IRI parse error: %s", parse_err);
+		log_debug("IRI parse error: %s", parse_err);
 		start_reply(c, BAD_REQUEST, "bad request");
 		return;
 	}
@@ -1046,7 +1059,7 @@ client_write(struct bufferevent *bev, void *d)
 
 	case REQUEST_FILE:
 		if ((r = read(c->pfd, buf, sizeof(buf))) == -1) {
-			log_warn(c, "read: %s", strerror(errno));
+			log_warn("read");
 			client_error(bev, EVBUFFER_ERROR, c);
 			return;
 		} else if (r == 0) {
@@ -1100,8 +1113,7 @@ client_error(struct bufferevent *bev, short error, voi
 	c->type = REQUEST_DONE;
 
 	if (error & EVBUFFER_TIMEOUT) {
-		log_warn(c, "timeout reached, "
-		    "forcefully closing the connection");
+		log_debug("timeout; forcefully closing the connection");
 		if (c->code == 0)
 			start_reply(c, BAD_REQUEST, "timeout");
 		else
@@ -1114,7 +1126,7 @@ client_error(struct bufferevent *bev, short error, voi
 		return;
 	}
 
-	log_err(c, "unknown bufferevent error %x", error);
+	log_warnx("unknown bufferevent error 0x%x", error);
 	client_close(c);
 }
 
@@ -1160,13 +1172,13 @@ start_reply(struct client *c, int code, const char *me
 	return;
 
 err:
-	log_err(c, "evbuffer_add_printf error: no memory");
+	log_warnx("evbuffer_add_printf error: no memory");
 	evbuffer_drain(evb, EVBUFFER_LENGTH(evb));
 	client_close(c);
 	return;
 
 overflow:
-	log_warn(c, "reply header overflow");
+	log_warnx("reply header overflow");
 	evbuffer_drain(evb, EVBUFFER_LENGTH(evb));
 	start_reply(c, TEMP_FAILURE, "internal error");
 }
@@ -1296,7 +1308,7 @@ do_accept(int sock, short et, void *d)
 	c->addr = addr;
 
 	if (tls_accept_socket(ctx, &c->ctx, fd) == -1) {
-		log_warn(c, "failed to accept socket: %s", tls_error(c->ctx));
+		log_warnx("failed to accept socket: %s", tls_error(c->ctx));
 		close(c->fd);
 		free(c);
 		return;
@@ -1364,7 +1376,7 @@ handle_dispatch_imsg(int fd, short ev, void *d)
 static void
 handle_siginfo(int fd, short ev, void *d)
 {
-	log_info(NULL, "%d connected clients", connected_clients);
+	log_info("%d connected clients", connected_clients);
 }
 
 static void
@@ -1441,7 +1453,7 @@ setup_tls(void)
 
 	h = TAILQ_FIRST(&hosts);
 
-	log_warn(NULL, "loading %s, %s, %s", h->cert, h->key, h->ocsp);
+	log_info("loading %s, %s, %s", h->cert, h->key, h->ocsp);
 
 	/* we need to set something, then we can add how many key we want */
 	if (tls_config_set_keypair_file(tlsconf, h->cert, h->key))
blob - 93e82c03851f0896b7b0037ac466337dbdca073d
blob + 8b54daeab16f3e8df726a2d3fc527bd1127a8707
--- utils.c
+++ utils.c
@@ -24,7 +24,7 @@
 #include <openssl/x509_vfy.h>
 #include <openssl/x509v3.h>
 
-#include "logger.h"
+#include "log.h"
 
 int
 starts_with(const char *str, const char *prefix)
@@ -119,8 +119,7 @@ gen_certificate(const char *hostname, const char *cert
 	FILE		*f;
 	const unsigned char *host = (const unsigned char*)hostname;
 
-	log_notice(NULL,
-	    "generating new certificate for %s (it could take a while)",
+	log_info("generating new certificate for %s (it could take a while)",
 	    host);
 
 	if ((pkey = EVP_PKEY_new()) == NULL)
@@ -174,7 +173,7 @@ gen_certificate(const char *hostname, const char *cert
 	X509_free(x509);
 	RSA_free(rsa);
 
-	log_notice(NULL, "certificate successfully generated");
+	log_info("certificate successfully generated");
 }
 
 X509_STORE *