Do not assume STDIN_FILENO is available for input from child

This commit is contained in:
Hamish Macdonald 2018-10-26 09:31:43 -04:00
parent 37e2b58226
commit 5084a881af
1 changed files with 5 additions and 4 deletions

View File

@ -35,6 +35,7 @@ i3bar_child child;
/* stdin- and SIGCHLD-watchers */ /* stdin- and SIGCHLD-watchers */
ev_io *stdin_io; ev_io *stdin_io;
int stdin_fd;
ev_child *child_sig; ev_child *child_sig;
/* JSON parser for stdin */ /* JSON parser for stdin */
@ -450,7 +451,7 @@ static void stdin_io_first_line_cb(struct ev_loop *loop, ev_io *watcher, int rev
} }
free(buffer); free(buffer);
ev_io_stop(main_loop, stdin_io); ev_io_stop(main_loop, stdin_io);
ev_io_init(stdin_io, &stdin_io_cb, STDIN_FILENO, EV_READ); ev_io_init(stdin_io, &stdin_io_cb, stdin_fd, EV_READ);
ev_io_start(main_loop, stdin_io); ev_io_start(main_loop, stdin_io);
} }
@ -562,17 +563,17 @@ void start_child(char *command) {
close(pipe_in[1]); close(pipe_in[1]);
close(pipe_out[0]); close(pipe_out[0]);
dup2(pipe_in[0], STDIN_FILENO); stdin_fd = pipe_in[0];
child_stdin = pipe_out[1]; child_stdin = pipe_out[1];
break; break;
} }
/* We set O_NONBLOCK because blocking is evil in event-driven software */ /* We set O_NONBLOCK because blocking is evil in event-driven software */
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); fcntl(stdin_fd, F_SETFL, O_NONBLOCK);
stdin_io = smalloc(sizeof(ev_io)); stdin_io = smalloc(sizeof(ev_io));
ev_io_init(stdin_io, &stdin_io_first_line_cb, STDIN_FILENO, EV_READ); ev_io_init(stdin_io, &stdin_io_first_line_cb, stdin_fd, EV_READ);
ev_io_start(main_loop, stdin_io); ev_io_start(main_loop, stdin_io);
/* We must cleanup, if the child unexpectedly terminates */ /* We must cleanup, if the child unexpectedly terminates */