removed fgets usage, increment offset until a line is read, dwm will drop all lines...
authorAnselm R. Garbe <garbeam@gmail.com>
Sat, 3 Nov 2007 19:43:12 +0000 (20:43 +0100)
committerAnselm R. Garbe <garbeam@gmail.com>
Sat, 3 Nov 2007 19:43:12 +0000 (20:43 +0100)
dwm.c

diff --git a/dwm.c b/dwm.c
index 266dd15..044177d 100644 (file)
--- 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)) {