]> git.sur5r.net Git - i3/i3/commitdiff
Separate the lines received in a single read.
authorFernando Tarlá Cardoso Lemos <fernandotcl@gmail.com>
Mon, 3 Jan 2011 00:39:49 +0000 (22:39 -0200)
committerAxel Wagner <mail@merovius.de>
Sat, 8 Jan 2011 13:56:52 +0000 (14:56 +0100)
Fixes the case where multiple lines are read in a single read syscall
(it could be better optimized in the future). Also fixes a memory
corruption issue when rec == 0.

i3bar/include/common.h
i3bar/src/child.c
i3bar/src/main.c

index 4ad337039df78695f1750b7195b8e190ce9f6e06..8b439ee0af3861e89ce3fdedf88fd4ddd35fbb16 100644 (file)
@@ -14,6 +14,7 @@ typedef int bool;
 
 struct ev_loop* main_loop;
 char            *statusline;
+char            *statusline_buffer;
 
 struct rect_t {
        int     x;
index d7d557831371ab11204e1ccfbf325dedf6a754ca..1fae759335684ee3e2dc0f480449658d2523f359 100644 (file)
@@ -27,6 +27,9 @@ pid_t child_pid;
 ev_io    *stdin_io;
 ev_child *child_sig;
 
+/* The buffer statusline points to */
+char *statusline_buffer = NULL;
+
 /*
  * Stop and free() the stdin- and sigchild-watchers
  *
@@ -36,7 +39,7 @@ void cleanup() {
     ev_child_stop(main_loop, child_sig);
     FREE(stdin_io);
     FREE(child_sig);
-    FREE(statusline);
+    FREE(statusline_buffer);
 }
 
 /*
@@ -50,7 +53,7 @@ void stdin_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) {
     int rec = 0;
     int buffer_len = STDIN_CHUNK_SIZE;
     char *buffer = malloc(buffer_len);
-    memset(buffer, '\0', buffer_len);
+    buffer[0] = '\0';
     while(1) {
         n = read(fd, buffer + rec, buffer_len - rec);
         if (n == -1) {
@@ -67,8 +70,10 @@ void stdin_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) {
                 buffer_len += STDIN_CHUNK_SIZE;
                 buffer = realloc(buffer, buffer_len);
             } else {
-                /* remove trailing newline and finish up */
-                buffer[rec-1] = '\0';
+                if (rec != 0) {
+                    /* remove trailing newline and finish up */
+                    buffer[rec-1] = '\0';
+                }
                 break;
             }
         }
@@ -78,9 +83,13 @@ void stdin_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) {
         FREE(buffer);
         return;
     }
-    FREE(statusline);
-    statusline = buffer;
-    DLOG("%s\n", buffer);
+    FREE(statusline_buffer);
+    statusline = statusline_buffer = buffer;
+    for (n = 0; buffer[n] != '\0'; ++n) {
+        if (buffer[n] == '\n')
+            statusline = &buffer[n + 1];
+    }
+    DLOG("%s\n", statusline);
     draw_bars();
 }
 
index c2cf53e21b9150121751e949452112e6c4031d1a..fce7fc299855c69120e5c8d8fe754c9cebf9a85f 100644 (file)
@@ -249,7 +249,7 @@ int main(int argc, char **argv) {
 
     FREE(socket_path);
 
-    FREE(statusline);
+    FREE(statusline_buffer);
 
     clean_xcb();
     ev_default_destroy();