On Mon, 3 Mar 2014 21:16:46 +0000
sin <s...@2f30.org> wrote:

> Why can't we not use err(), warn(), etc. from err.h?

It's not necessary and introduces more problems, as it forces a certain
format on the error-messages, always beginning with "quark:".
I'm all for using built-in functions, but in this case, it's not for
the better.
Attached is the fixed patch, which also gets rid of atomiclog().

Cheers

FRIGN

-- 
FRIGN <d...@frign.de>
>From 8dd0eeaafd2b4146ce2d8beb7d090018b136348e Mon Sep 17 00:00:00 2001
From: FRIGN <d...@frign.de>
Date: Mon, 3 Mar 2014 21:48:59 +0100
Subject: [PATCH] Clean up the log-facility

---
 quark.c | 129 ++++++++++++++++++++++++++++------------------------------------
 1 file changed, 57 insertions(+), 72 deletions(-)

diff --git a/quark.c b/quark.c
index 234f6e2..ae018ea 100644
--- a/quark.c
+++ b/quark.c
@@ -26,6 +26,12 @@ enum {
 	HEAD = 5,
 };
 
+enum {
+	MSG = 0,
+	ERR = 1,
+	DIE = 2,
+};
+
 typedef struct {
 	const char *extension;
 	const char *mimetype;
@@ -60,10 +66,7 @@ static const char texthtml[]         = "text/html";
 
 static ssize_t writetext(const char *buf);
 static ssize_t writedata(const char *buf, size_t buflen);
-static void atomiclog(int fd, const char *errstr, va_list ap);
-static void die(const char *errstr, ...);
-static void logmsg(const char *errstr, ...);
-static void logerrmsg(const char *errstr, ...);
+static void qlog(int type, const char *errstr, ...);
 static void response(void);
 static void responsecgi(void);
 static void responsedir(void);
@@ -92,7 +95,7 @@ writedata(const char *buf, size_t buf_len) {
 
 	while(offset < buf_len) {
 		if((r = write(req.fd, buf + offset, buf_len - offset)) == -1) {
-			logerrmsg("client %s closed connection\n", host);
+			qlog(ERR, "client %s closed connection\n", host);
 			return -1;
 		}
 		offset += r;
@@ -106,47 +109,29 @@ writetext(const char *buf) {
 }
 
 void
-atomiclog(int fd, const char *errstr, va_list ap) {
+qlog(int type, const char *errstr, ...) {
+	va_list ap;
 	static char buf[512];
 	int n;
 
+	va_start(ap, errstr);
+	
 	/*
 	assemble the message in buf and write it in one pass
 	to avoid interleaved concurrent writes on a shared fd.
 	*/
 	n = snprintf(buf, sizeof buf, "%s: ", tstamp());
 	n += vsnprintf(buf + n, sizeof buf - n, errstr, ap);
-	if (n >= sizeof buf)
+	if (n >= sizeof buf){
 		n = sizeof buf - 1;
-	write(fd, buf, n);
-}
-
-void
-logmsg(const char *errstr, ...) {
-	va_list ap;
-
-	va_start(ap, errstr);
-	atomiclog(STDOUT_FILENO, errstr, ap);
-	va_end(ap);
-}
-
-void
-logerrmsg(const char *errstr, ...) {
-	va_list ap;
-
-	va_start(ap, errstr);
-	atomiclog(STDERR_FILENO, errstr, ap);
-	va_end(ap);
-}
-
-void
-die(const char *errstr, ...) {
-	va_list ap;
-
-	va_start(ap, errstr);
-	atomiclog(STDERR_FILENO, errstr, ap);
+	};
+	write((type == MSG)?STDOUT_FILENO:STDERR_FILENO, buf, n);
+	
 	va_end(ap);
-	exit(EXIT_FAILURE);
+	
+	if(type == DIE){
+		exit(EXIT_FAILURE);
+	};
 }
 
 int
@@ -158,7 +143,7 @@ responsehdr(const char *status) {
 		"Server: quark-"VERSION"\r\n",
 		status, tstamp()) >= MAXBUFLEN)
 	{
-		logerrmsg("snprintf failed, buffer size exceeded");
+		qlog(ERR, "snprintf failed, buffer size exceeded");
 		return -1;
 	}
 	return writetext(resbuf);
@@ -170,7 +155,7 @@ responsecontentlen(off_t size) {
 		"Content-Length: %lu\r\n",
 		size) >= MAXBUFLEN)
 	{
-		logerrmsg("snprintf failed, buffer sizeof exceeded");
+		qlog(ERR, "snprintf failed, buffer sizeof exceeded");
 		return -1;
 	}
 	return writetext(resbuf);
@@ -182,7 +167,7 @@ responselocation(const char *location, const char *pathinfo) {
 		"Location: %s%s\r\n",
 		location, pathinfo) >= MAXBUFLEN)
 	{
-		logerrmsg("snprintf failed, buffer sizeof exceeded");
+		qlog(ERR, "snprintf failed, buffer sizeof exceeded");
 		return -1;
 	}
 	return writetext(resbuf);
@@ -194,7 +179,7 @@ responsecontenttype(const char *mimetype) {
 		"Content-Type: %s\r\n",
 		mimetype) >= MAXBUFLEN)
 	{
-		logerrmsg("snprintf failed, buffer sizeof exceeded");
+		qlog(ERR, "snprintf failed, buffer sizeof exceeded");
 		return -1;
 	}
 	return writetext(resbuf);
@@ -207,9 +192,9 @@ responsefiledata(int fd, off_t size) {
 
 	for(; (n = read(fd, buf, MIN(size, sizeof buf))) > 0; size -= n)
 		if(write(req.fd, buf, n) != n)
-			logerrmsg("error writing to client %s: %s\n", host, strerror(errno));
+			qlog(ERR, "error writing to client %s: %s\n", host, strerror(errno));
 	if(n == -1)
-		logerrmsg("error reading from file: %s\n", strerror(errno));
+		qlog(ERR, "error reading from file: %s\n", strerror(errno));
 }
 
 void
@@ -220,7 +205,7 @@ responsefile(void) {
 	struct stat st;
 
 	if(stat(reqbuf, &st) == -1 || (ffd = open(reqbuf, O_RDONLY)) == -1) {
-		logerrmsg("%s requests unknown path %s\n", host, reqbuf);
+		qlog(ERR, "%s requests unknown path %s\n", host, reqbuf);
 		if(responsehdr(HttpNotFound) != -1
 		&& responsecontenttype(texthtml) != -1)
 			;
@@ -268,7 +253,7 @@ responsedirdata(DIR *d) {
 			if(snprintf(resbuf, MAXBUFLEN, "<a href='%s%s'>%s</a><br>\r\n",
 				    reqbuf, e->d_name, e->d_name) >= MAXBUFLEN)
 			{
-				logerrmsg("snprintf failed, buffer sizeof exceeded");
+				qlog(ERR, "snprintf failed, buffer sizeof exceeded");
 				return;
 			}
 			if(writetext(resbuf) == -1)
@@ -287,7 +272,7 @@ responsedir(void) {
 		/* add directory terminator if necessary */
 		reqbuf[len++] = '/';
 		reqbuf[len] = 0;
-		logmsg("redirecting %s to %s%s\n", host, location, reqbuf);
+		qlog(MSG, "redirecting %s to %s%s\n", host, location, reqbuf);
 		if(responsehdr(HttpMoved) != -1
 		&& responselocation(location, reqbuf) != -1
 		&& responsecontenttype(texthtml) != -1)
@@ -307,7 +292,7 @@ responsedir(void) {
 			closedir(d);
 		}
 		else
-			logerrmsg("client %s requests %s but opendir failed: %s\n", host, reqbuf, strerror(errno));
+			qlog(ERR, "client %s requests %s but opendir failed: %s\n", host, reqbuf, strerror(errno));
 	}
 	else
 		responsefile(); /* docindex */
@@ -328,9 +313,9 @@ responsecgi(void) {
 		setenv("SERVER_NAME", reqhost, 1);
 	setenv("SCRIPT_NAME", cgi_script, 1);
 	setenv("REQUEST_URI", reqbuf, 1);
-	logmsg("CGI SERVER_NAME=%s SCRIPT_NAME=%s REQUEST_URI=%s\n", reqhost, cgi_script, reqbuf);
+	qlog(ERR, "CGI SERVER_NAME=%s SCRIPT_NAME=%s REQUEST_URI=%s\n", reqhost, cgi_script, reqbuf);
 	if(chdir(cgi_dir) == -1)
-		logerrmsg("chdir to cgi directory %s failed: %s\n", cgi_dir, strerror(errno));
+		qlog(ERR, "chdir to cgi directory %s failed: %s\n", cgi_dir, strerror(errno));
 	if((cgi = popen(cgi_script, "r"))) {
 		if(responsehdr(HttpOk) == -1)
 			return;
@@ -343,7 +328,7 @@ responsecgi(void) {
 		pclose(cgi);
 	}
 	else {
-		logerrmsg("%s requests %s, but cannot run cgi script %s\n", host, cgi_script, reqbuf);
+		qlog(ERR, "%s requests %s, but cannot run cgi script %s\n", host, cgi_script, reqbuf);
 		if(responsehdr(HttpNotFound) != -1
 		&& responsecontenttype(texthtml) != -1)
 			;
@@ -361,7 +346,7 @@ response(void) {
 
 	for(p = reqbuf; *p; p++)
 		if(*p == '\\' || (*p == '/' && *(p + 1) == '.')) { /* don't serve bogus or hidden files */
-			logerrmsg("%s requests bogus or hidden file %s\n", host, reqbuf);
+			qlog(ERR, "%s requests bogus or hidden file %s\n", host, reqbuf);
 			if(responsehdr(HttpUnauthorized) != -1
 			&& responsecontenttype(texthtml) != -1)
 				;
@@ -371,7 +356,7 @@ response(void) {
 				writetext("\r\n<html><body>401 Unauthorized</body></html>\r\n");
 			return;
 		}
-	logmsg("%s requests: %s\n", host, reqbuf);
+	qlog(MSG, "%s requests: %s\n", host, reqbuf);
 	if(cgi_mode)
 		responsecgi();
 	else {
@@ -390,7 +375,7 @@ request(void) {
 
 	do { /* MAXBUFLEN byte of reqbuf is emergency 0 terminator */
 		if((r = read(req.fd, reqbuf + offset, MAXBUFLEN - offset)) == -1) {
-			logerrmsg("read: %s\n", strerror(errno));
+			qlog(ERR, "read: %s\n", strerror(errno));
 			return -1;
 		}
 		offset += r;
@@ -434,7 +419,7 @@ request(void) {
 	memmove(reqbuf, res, (p - res) + 1);
 	return 0;
 invalid_request:
-	logerrmsg("%s performs invalid request %s\n", host, reqbuf);
+	qlog(ERR, "%s performs invalid request %s\n", host, reqbuf);
 	return -1;
 }
 
@@ -448,7 +433,7 @@ serve(int fd) {
 		salen = sizeof sa;
 		if((req.fd = accept(fd, &sa, &salen)) == -1) {
 			/* el cheapo socket release */
-			logerrmsg("cannot accept: %s, sleep a second...\n", strerror(errno));
+			qlog(ERR, "cannot accept: %s, sleep a second...\n", strerror(errno));
 			sleep(1);
 			continue;
 		}
@@ -465,10 +450,10 @@ serve(int fd) {
 			close(req.fd);
 			exit(EXIT_SUCCESS);
 		} else if (result == -1)
-			logerrmsg("fork failed: %s\n", strerror(errno));
+			qlog(ERR, "fork failed: %s\n", strerror(errno));
 		close(req.fd);
 	}
-	logmsg("shutting down\n");
+	qlog(MSG, "shutting down\n");
 }
 
 void
@@ -488,7 +473,7 @@ sighandler(int sig) {
 	case SIGQUIT:
 	case SIGABRT:
 	case SIGTERM:
-		logerrmsg("received signal %s, closing down\n", signame[sig] ? signame[sig] : "");
+		qlog(ERR, "received signal %s, closing down\n", signame[sig] ? signame[sig] : "");
 		close(fd);
 		running = 0;
 		break;
@@ -518,17 +503,17 @@ main(int argc, char *argv[]) {
 	/* arguments */
 	for(i = 1; i < argc; i++)
 		if(!strcmp(argv[i], "-v"))
-			die("quark-"VERSION", © 2009-2011 Anselm R Garbe\n");
+			qlog(DIE, "quark-"VERSION", © 2009-2011 Anselm R Garbe\n");
 		else
-			die("usage: quark [-v]\n");
+			qlog(DIE, "usage: quark [-v]\n");
 
 	/* sanity checks */
 	if(user)
 		if(!(upwd = getpwnam(user)))
-			die("error: invalid user %s\n", user);
+			qlog(DIE, "error: invalid user %s\n", user);
 	if(group)
 		if(!(gpwd = getgrnam(group)))
-			die("error: invalid group %s\n", group);
+			qlog(DIE, "error: invalid group %s\n", group);
 
 	signal(SIGCHLD, sighandler);
 	signal(SIGHUP, sighandler);
@@ -545,20 +530,20 @@ main(int argc, char *argv[]) {
 	hints.ai_socktype = SOCK_STREAM;
 	hints.ai_flags = AI_PASSIVE;
 	if((i = getaddrinfo(servername, serverport, &hints, &ai)))
-		die("error: getaddrinfo: %s\n", gai_strerror(i));
+		qlog(DIE, "error: getaddrinfo: %s\n", gai_strerror(i));
 	if((fd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) == -1) {
 		freeaddrinfo(ai);
-		die("error: socket: %s\n", strerror(errno));
+		qlog(DIE, "error: socket: %s\n", strerror(errno));
 	}
 	if(bind(fd, ai->ai_addr, ai->ai_addrlen) == -1) {
 		close(fd);
 		freeaddrinfo(ai);
-		die("error: bind: %s\n", strerror(errno));
+		qlog(DIE, "error: bind: %s\n", strerror(errno));
 	}
 	if(listen(fd, SOMAXCONN) == -1) {
 		close(fd);
 		freeaddrinfo(ai);
-		die("error: listen: %s\n", strerror(errno));
+		qlog(DIE, "error: listen: %s\n", strerror(errno));
 	}
 
 	if(!strcmp(serverport, "80"))
@@ -568,27 +553,27 @@ main(int argc, char *argv[]) {
 	if(i >= sizeof location) {
 		close(fd);
 		freeaddrinfo(ai);
-		die("error: location too long\n");
+		qlog(DIE, "error: location too long\n");
 	}
 
 	if(chdir(docroot) == -1)
-		die("error: chdir %s: %s\n", docroot, strerror(errno));
+		qlog(DIE, "error: chdir %s: %s\n", docroot, strerror(errno));
 	if(chroot(".") == -1)
-		die("error: chroot .: %s\n", strerror(errno));
+		qlog(DIE, "error: chroot .: %s\n", strerror(errno));
 
 	if(gpwd)
 		if(setgid(gpwd->gr_gid) == -1)
-			die("error: cannot set group id\n");
+			qlog(DIE, "error: cannot set group id\n");
 	if(upwd)
 		if(setuid(upwd->pw_uid) == -1)
-			die("error: cannot set user id\n");
+			qlog(DIE, "error: cannot set user id\n");
 
 	if(getuid() == 0)
-		die("error: won't run with root permissions, choose another user\n");
+		qlog(DIE, "error: won't run with root permissions, choose another user\n");
 	if(getgid() == 0)
-		die("error: won't run with root permissions, choose another group\n");
+		qlog(DIE, "error: won't run with root permissions, choose another group\n");
 
-	logmsg("listening on %s:%s using %s as root directory\n", servername, serverport, docroot);
+	qlog(MSG, "listening on %s:%s using %s as root directory\n", servername, serverport, docroot);
 
 	serve(fd); /* main loop */
 	freeaddrinfo(ai);
-- 
1.8.3.2

Reply via email to