From 0e98090d653457488d74103dc44a1e2aba071895 Mon Sep 17 00:00:00 2001
From: "Anselm R. Garbe" <garbeam@gmail.com>
Date: Sat, 3 Nov 2007 20:43:12 +0100
Subject: [PATCH] removed fgets usage, increment offset until a line is read,
 dwm will drop all lines read in one call, except the first!!! one (previously
 it preferred the last) - but the current approach is simplier and works
 better for general purpose in conjunction with the offset handling

---
 dwm.c | 34 +++++++++++++++++++++++++++-------
 1 file changed, 27 insertions(+), 7 deletions(-)

diff --git a/dwm.c b/dwm.c
index 266dd15..044177d 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1145,6 +1145,7 @@ quit(const char *arg) {
 	readin = running = False;
 }
 
+
 void
 resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
 	XWindowChanges wc;
@@ -1280,15 +1281,19 @@ restack(void) {
 
 void
 run(void) {
+	char *p;
 	fd_set rd;
-	int xfd;
+	int r, xfd;
+	unsigned int len, offset;
 	XEvent ev;
 
 	/* main event loop, also reads status text from stdin */
 	XSync(dpy, False);
 	xfd = ConnectionNumber(dpy);
 	readin = True;
-	stext[sizeof stext - 1] = '\0'; /* 0-terminator is never touched */
+	offset = 0;
+	len = sizeof stext - 1;
+	stext[len] = '\0'; /* 0-terminator is never touched */
 	while(running) {
 		FD_ZERO(&rd);
 		if(readin)
@@ -1300,12 +1305,27 @@ run(void) {
 			eprint("select failed\n");
 		}
 		if(FD_ISSET(STDIN_FILENO, &rd)) {
-			if((readin = (stext == fgets(stext, sizeof stext - 1, stdin))))
-				stext[strlen(stext) - 1] = '\0'; /* remove tailing '\n' */
-			else if(feof(stdin))
+			switch((r = read(STDIN_FILENO, stext + offset, len - offset))) {
+			case -1:
+				strncpy(stext, strerror(errno), len);
+				readin = False;
+				break;
+			case 0:
 				strncpy(stext, "EOF", 4);
-			else /* error occured */
-				strncpy(stext, strerror(errno), sizeof stext - 1);
+				readin = False;
+				break;
+			default:
+				stext[offset + r] = '\0';
+				for(p = stext; *p && *p != '\n'; p++);
+				if(*p == '\n') {
+					*p = '\0';
+					offset = 0;
+				}
+				else if(offset + r < len - 1)
+					offset += r;
+				else
+					offset = 0;
+			}
 			drawbar();
 		}
 		while(XPending(dpy)) {