svlogd: batch writes if !timestamp
diff --git a/runit/svlogd.c b/runit/svlogd.c
index a588ffe..cf29e8e 100644
--- a/runit/svlogd.c
+++ b/runit/svlogd.c
@@ -55,7 +55,7 @@
 static char repl;
 
 static struct logdir {
-	////char *btmp;
+////	char *btmp;
 	/* pattern list to match, in "aa\0bb\0\cc\0\0" form */
 	char *inst;
 	char *processor;
@@ -732,6 +732,7 @@
 	int i;
 	unsigned opt;
 	unsigned timestamp = 0;
+	void* (*memRchr)(const void *, int, size_t) = memchr;
 
 #define line bb_common_bufsiz1
 
@@ -748,10 +749,10 @@
 		if (linemax == 0) linemax = BUFSIZ-26;
 		if (linemax < 256) linemax = 256;
 	}
-	if (opt & 8) { // -b
-		////buflen = xatoi_u(b);
-		////if (buflen == 0) buflen = 1024;
-	}
+////	if (opt & 8) { // -b
+////		buflen = xatoi_u(b);
+////		if (buflen == 0) buflen = 1024;
+////	}
 	//if (opt & 0x10) timestamp++; // -t
 	//if (opt & 0x20) verbose++; // -v
 	//if (timestamp > 2) timestamp = 2;
@@ -789,7 +790,13 @@
 
 	logdirs_reopen();
 
-	/* Each iteration processes one line */
+	/* Without timestamps, we don't have to print each line
+	 * separately, so we can look for _last_ newline, not first,
+	 * thus batching writes */
+	if (!timestamp)
+		memRchr = memrchr;
+
+	/* Each iteration processes one line or more lines */
 	while (1) {
 		char stamp[FMT_PTIME];
 		char *lineptr;
@@ -817,15 +824,17 @@
 		/* (possibly has some unprocessed data from prev loop) */
 
 		/* Refill the buffer if needed */
-		np = memchr(lineptr, '\n', stdin_cnt);
-		i = linemax - stdin_cnt; /* avail. bytes at tail */
-		if (i >= 128 && !exitasap && !np) {
-			int sz = buffer_pread(0, lineptr + stdin_cnt, i);
-			if (sz <= 0) /* EOF or error on stdin */
-				exitasap = 1;
-			else {
-				np = memchr(lineptr + stdin_cnt, '\n', sz);
-				stdin_cnt += sz;
+		np = memRchr(lineptr, '\n', stdin_cnt);
+		if (!np && !exitasap) {
+			i = linemax - stdin_cnt; /* avail. bytes at tail */
+			if (i >= 128) {
+				i = buffer_pread(0, lineptr + stdin_cnt, i);
+				if (i <= 0) /* EOF or error on stdin */
+					exitasap = 1;
+				else {
+					np = memRchr(lineptr + stdin_cnt, '\n', i);
+					stdin_cnt += i;
+				}
 			}
 		}
 		if (stdin_cnt <= 0 && exitasap)
@@ -874,8 +883,9 @@
 				stdin_cnt = 1;
 			} else {
 				linelen = stdin_cnt;
-				np = memchr(lineptr, '\n', stdin_cnt);
-				if (np) linelen = np - lineptr + 1;
+				np = memRchr(lineptr, '\n', stdin_cnt);
+				if (np)
+					linelen = np - lineptr + 1;
 				ch = lineptr[linelen-1];
 			}
 			/* linelen == no of chars incl. '\n' (or == stdin_cnt) */
@@ -893,7 +903,7 @@
 			lineptr += linelen;
 			/* If we see another '\n', we don't need to read
 			 * next piece of input: can print what we have */
-			np = memchr(lineptr, '\n', stdin_cnt);
+			np = memRchr(lineptr, '\n', stdin_cnt);
 			if (np)
 				goto print_to_nl;
 			/* Move unprocessed data to the front of line */
@@ -907,5 +917,5 @@
 				/* repeat */;
 		logdir_close(&dir[i]);
 	}
-	_exit(0);
+	return 0;
 }