Separate the lines received in a single read.

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.
This commit is contained in:
Fernando Tarlá Cardoso Lemos 2011-01-02 22:39:49 -02:00 committed by Axel Wagner
parent 34dd4bc89e
commit 29f153c634
3 changed files with 18 additions and 8 deletions

View File

@ -14,6 +14,7 @@ typedef int bool;
struct ev_loop* main_loop; struct ev_loop* main_loop;
char *statusline; char *statusline;
char *statusline_buffer;
struct rect_t { struct rect_t {
int x; int x;

View File

@ -27,6 +27,9 @@ pid_t child_pid;
ev_io *stdin_io; ev_io *stdin_io;
ev_child *child_sig; ev_child *child_sig;
/* The buffer statusline points to */
char *statusline_buffer = NULL;
/* /*
* Stop and free() the stdin- and sigchild-watchers * Stop and free() the stdin- and sigchild-watchers
* *
@ -36,7 +39,7 @@ void cleanup() {
ev_child_stop(main_loop, child_sig); ev_child_stop(main_loop, child_sig);
FREE(stdin_io); FREE(stdin_io);
FREE(child_sig); 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 rec = 0;
int buffer_len = STDIN_CHUNK_SIZE; int buffer_len = STDIN_CHUNK_SIZE;
char *buffer = malloc(buffer_len); char *buffer = malloc(buffer_len);
memset(buffer, '\0', buffer_len); buffer[0] = '\0';
while(1) { while(1) {
n = read(fd, buffer + rec, buffer_len - rec); n = read(fd, buffer + rec, buffer_len - rec);
if (n == -1) { 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_len += STDIN_CHUNK_SIZE;
buffer = realloc(buffer, buffer_len); buffer = realloc(buffer, buffer_len);
} else { } else {
if (rec != 0) {
/* remove trailing newline and finish up */ /* remove trailing newline and finish up */
buffer[rec-1] = '\0'; buffer[rec-1] = '\0';
}
break; break;
} }
} }
@ -78,9 +83,13 @@ void stdin_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) {
FREE(buffer); FREE(buffer);
return; return;
} }
FREE(statusline); FREE(statusline_buffer);
statusline = buffer; statusline = statusline_buffer = buffer;
DLOG("%s\n", buffer); for (n = 0; buffer[n] != '\0'; ++n) {
if (buffer[n] == '\n')
statusline = &buffer[n + 1];
}
DLOG("%s\n", statusline);
draw_bars(); draw_bars();
} }

View File

@ -249,7 +249,7 @@ int main(int argc, char **argv) {
FREE(socket_path); FREE(socket_path);
FREE(statusline); FREE(statusline_buffer);
clean_xcb(); clean_xcb();
ev_default_destroy(); ev_default_destroy();