From: Michael Stapelberg Date: Fri, 8 Jul 2011 21:16:33 +0000 (+0200) Subject: Bugfix: Correctly handle EOF on stdin (Thanks woddf2) X-Git-Tag: 4.0.1~7^2~3^2~3 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=97827372af134b85154a90b51df790723374c5b7;p=i3%2Fi3 Bugfix: Correctly handle EOF on stdin (Thanks woddf2) --- diff --git a/i3bar/src/child.c b/i3bar/src/child.c index 890dce29..a8de6fb9 100644 --- a/i3bar/src/child.c +++ b/i3bar/src/child.c @@ -38,8 +38,12 @@ char *statusline_buffer = NULL; void cleanup() { if (stdin_io != NULL) { ev_io_stop(main_loop, stdin_io); - ev_child_stop(main_loop, child_sig); FREE(stdin_io); + FREE(statusline_buffer); + } + + if (child_sig != NULL) { + ev_child_stop(main_loop, child_sig); FREE(child_sig); FREE(statusline_buffer); } @@ -69,18 +73,23 @@ void stdin_io_cb(struct ev_loop *loop, ev_io *watcher, int revents) { exit(EXIT_FAILURE); } if (n == 0) { - if (rec == buffer_len) { - buffer_len += STDIN_CHUNK_SIZE; - buffer = realloc(buffer, buffer_len); - } else { - if (rec != 0) { - /* remove trailing newline and finish up */ - buffer[rec-1] = '\0'; - } - break; + if (rec != 0) { + /* remove trailing newline and finish up */ + buffer[rec-1] = '\0'; } + + /* end of file, kill the watcher */ + DLOG("stdin: EOF\n"); + ev_io_stop(loop, watcher); + FREE(stdin_io); + break; } rec += n; + + if (rec == buffer_len) { + buffer_len += STDIN_CHUNK_SIZE; + buffer = realloc(buffer, buffer_len); + } } if (*buffer == '\0') { FREE(buffer);