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:
parent
34dd4bc89e
commit
29f153c634
|
@ -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;
|
||||||
|
|
|
@ -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 {
|
||||||
/* remove trailing newline and finish up */
|
if (rec != 0) {
|
||||||
buffer[rec-1] = '\0';
|
/* remove trailing newline and finish up */
|
||||||
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue