Commit Diff


commit - 945d22d1f2c0e79a3102a63314eeb5e6c41571af
commit + 80bbcad5f279e47ec5ccc22076fe1184af7caf5b
blob - 287ac7db9022a66dbec587b368b683faa82f3485
blob + 981b73cae288638a206d7d193242032addb5666e
--- gmid.c
+++ gmid.c
@@ -24,39 +24,16 @@
 #include <fcntl.h>
 #include <limits.h>
 #include <signal.h>
+#include <stdarg.h>
 #include <string.h>
 
 #include "gmid.h"
 
-#define LOG(priority, c, fmt, ...)					\
-	do {								\
-		char buf[INET_ADDRSTRLEN];				\
-		if (inet_ntop((c)->af, &(c)->addr,			\
-		    buf, sizeof(buf)) == NULL)				\
-			FATAL("inet_ntop: %s", strerror(errno));	\
-		if (foreground)						\
-			fprintf(stderr,					\
-			    "%s " fmt "\n", buf, __VA_ARGS__);		\
-		else							\
-			syslog((priority) | LOG_DAEMON,			\
-			    "%s " fmt, buf, __VA_ARGS__);		\
-	} while (0)
+#define LOGE(c, fmt, ...) logs(LOG_ERR,    c, fmt, __VA_ARGS__)
+#define LOGN(c, fmt, ...) logs(LOG_NOTICE, c, fmt, __VA_ARGS__)
+#define LOGI(c, fmt, ...) logs(LOG_INFO,   c, fmt, __VA_ARGS__)
+#define LOGD(c, fmt, ...) logs(LOG_DEBUG,  c, fmt, __VA_ARGS__)
 
-#define LOGE(c, fmt, ...) LOG(LOG_ERR,    c, fmt, __VA_ARGS__)
-#define LOGN(c, fmt, ...) LOG(LOG_NOTICE, c, fmt, __VA_ARGS__)
-#define LOGI(c, fmt, ...) LOG(LOG_INFO,   c, fmt, __VA_ARGS__)
-#define LOGD(c, fmt, ...) LOG(LOG_DEBUG,  c, fmt, __VA_ARGS__)
-
-#define FATAL(fmt, ...)							\
-	do {								\
-		if (foreground)						\
-			fprintf(stderr, fmt "\n", __VA_ARGS__);		\
-		else							\
-			syslog(LOG_DAEMON | LOG_CRIT,			\
-			    fmt, __VA_ARGS__);				\
-		exit(1);						\
-	} while (0)
-
 const char *dir, *cgi;
 int dirfd;
 int port;
@@ -93,6 +70,46 @@ safe_setenv(const char *name, const char *val)
 	setenv(name, val, 1);
 }
 
+__attribute__ ((format (printf, 1, 2)))
+static inline void __dead
+fatal(const char *fmt, ...)
+{
+	va_list ap;
+
+	va_start(ap, fmt);
+
+	if (foreground) {
+		vfprintf(stderr, fmt, ap);
+		fprintf(stderr, "\n");
+	} else
+		vsyslog(LOG_DAEMON | LOG_CRIT, fmt, ap);
+
+	va_end(ap);
+	exit(1);
+}
+
+__attribute__ ((format (printf, 3, 4)))
+static inline void
+logs(int priority, struct client *c, const char *fmt, ...)
+{
+	char buf[INET_ADDRSTRLEN];
+	va_list ap;
+
+	va_start(ap, fmt);
+	priority |= LOG_DAEMON;
+
+	if (inet_ntop(c->af, &c->addr, buf, sizeof(buf)) == NULL)
+		fatal("inet_ntop: %s", strerror(errno));
+
+	if (foreground) {
+		vfprintf(stderr, fmt, ap);
+		fprintf(stderr, "\n");
+	} else
+		vsyslog(priority, fmt, ap);
+
+	va_end(ap);
+}
+
 void
 sig_handler(int sig)
 {
@@ -604,9 +621,9 @@ mark_nonblock(int fd)
 	int flags;
 
 	if ((flags = fcntl(fd, F_GETFL)) == -1)
-		FATAL("fcntl(F_GETFL): %s", strerror(errno));
+		fatal("fcntl(F_GETFL): %s", strerror(errno));
 	if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)
-		FATAL("fcntl(F_SETFL): %s", strerror(errno));
+		fatal("fcntl(F_SETFL): %s", strerror(errno));
 }
 
 int
@@ -643,23 +660,23 @@ make_socket(int port, int family)
 	}
 
 	if ((sock = socket(family, SOCK_STREAM, 0)) == -1)
-		FATAL("socket: %s", strerror(errno));
+		fatal("socket: %s", strerror(errno));
 
 	v = 1;
 	if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &v, sizeof(v)) == -1)
-		FATAL("setsockopt(SO_REUSEADDR): %s", strerror(errno));
+		fatal("setsockopt(SO_REUSEADDR): %s", strerror(errno));
 
 	v = 1;
 	if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &v, sizeof(v)) == -1)
-		FATAL("setsockopt(SO_REUSEPORT): %s", strerror(errno));
+		fatal("setsockopt(SO_REUSEPORT): %s", strerror(errno));
 
 	mark_nonblock(sock);
 
 	if (bind(sock, addr, len) == -1)
-		FATAL("bind: %s", strerror(errno));
+		fatal("bind: %s", strerror(errno));
 
 	if (listen(sock, 16) == -1)
-		FATAL("listen: %s", strerror(errno));
+		fatal("listen: %s", strerror(errno));
 
 	return sock;
 }
@@ -675,7 +692,7 @@ do_accept(int sock, struct tls *ctx, struct pollfd *fd
 	if ((fd = accept(sock, (struct sockaddr*)&addr, &len)) == -1) {
 		if (errno == EWOULDBLOCK)
 			return;
-		FATAL("accept: %s", strerror(errno));
+		fatal("accept: %s", strerror(errno));
 	}
 
 	mark_nonblock(fd);
@@ -758,7 +775,7 @@ loop(struct tls *ctx, int sock)
 				    connected_clients);
 				continue;
 			}
-			FATAL("poll: %s", strerror(errno));
+			fatal("poll: %s", strerror(errno));
 		}
 
 		for (i = 0; i < MAX_USERS; i++) {
@@ -766,7 +783,7 @@ loop(struct tls *ctx, int sock)
 				continue;
 
 			if (fds[i].revents & (POLLERR|POLLNVAL))
-				FATAL("bad fd %d: %s", fds[i].fd,
+				fatal("bad fd %d: %s", fds[i].fd,
 				    strerror(errno));
 
 			if (fds[i].revents & POLLHUP) {