From ac74a6366226ec3e3cc048486b9ff085a074753a Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Thu, 26 Dec 2013 22:00:06 -0500 Subject: [PATCH] i3bar: Don't start child unless status_command If a command is passed to `start_child` which is NULL, such as in the case when there is no `status_command` specified in the bar config, do not start a child process to listen on stdin. fixes #1140 --- i3bar/src/child.c | 64 ++++++++++++++++++++++++---------------------- i3bar/src/config.c | 4 --- i3bar/src/ipc.c | 3 --- 3 files changed, 34 insertions(+), 37 deletions(-) diff --git a/i3bar/src/child.c b/i3bar/src/child.c index 1bd0d258..16d3e091 100644 --- a/i3bar/src/child.c +++ b/i3bar/src/child.c @@ -452,10 +452,16 @@ void child_write_output(void) { /* * Start a child-process with the specified command and reroute stdin. * We actually start a $SHELL to execute the command so we don't have to care - * about arguments and such + * about arguments and such. + * + * If `command' is NULL, such as in the case when no `status_command' is given + * in the bar config, no child will be started. * */ void start_child(char *command) { + if (command == NULL) + return; + /* Allocate a yajl parser which will be used to parse stdin. */ memset(&callbacks, '\0', sizeof(yajl_callbacks)); callbacks.yajl_map_key = stdin_map_key; @@ -478,43 +484,41 @@ void start_child(char *command) { gen = yajl_gen_alloc(NULL); #endif - if (command != NULL) { - int pipe_in[2]; /* pipe we read from */ - int pipe_out[2]; /* pipe we write to */ + int pipe_in[2]; /* pipe we read from */ + int pipe_out[2]; /* pipe we write to */ - if (pipe(pipe_in) == -1) - err(EXIT_FAILURE, "pipe(pipe_in)"); - if (pipe(pipe_out) == -1) - err(EXIT_FAILURE, "pipe(pipe_out)"); + if (pipe(pipe_in) == -1) + err(EXIT_FAILURE, "pipe(pipe_in)"); + if (pipe(pipe_out) == -1) + err(EXIT_FAILURE, "pipe(pipe_out)"); - child.pid = fork(); - switch (child.pid) { - case -1: - ELOG("Couldn't fork(): %s\n", strerror(errno)); - exit(EXIT_FAILURE); - case 0: - /* Child-process. Reroute streams and start shell */ + child.pid = fork(); + switch (child.pid) { + case -1: + ELOG("Couldn't fork(): %s\n", strerror(errno)); + exit(EXIT_FAILURE); + case 0: + /* Child-process. Reroute streams and start shell */ - close(pipe_in[0]); - close(pipe_out[1]); + close(pipe_in[0]); + close(pipe_out[1]); - dup2(pipe_in[1], STDOUT_FILENO); - dup2(pipe_out[0], STDIN_FILENO); + dup2(pipe_in[1], STDOUT_FILENO); + dup2(pipe_out[0], STDIN_FILENO); - setpgid(child.pid, 0); - execl(_PATH_BSHELL, _PATH_BSHELL, "-c", command, (char*) NULL); - return; - default: - /* Parent-process. Reroute streams */ + setpgid(child.pid, 0); + execl(_PATH_BSHELL, _PATH_BSHELL, "-c", command, (char*) NULL); + return; + default: + /* Parent-process. Reroute streams */ - close(pipe_in[1]); - close(pipe_out[0]); + close(pipe_in[1]); + close(pipe_out[0]); - dup2(pipe_in[0], STDIN_FILENO); - child_stdin = pipe_out[1]; + dup2(pipe_in[0], STDIN_FILENO); + child_stdin = pipe_out[1]; - break; - } + break; } /* We set O_NONBLOCK because blocking is evil in event-driven software */ diff --git a/i3bar/src/config.c b/i3bar/src/config.c index 5ac31b1f..dea47b9c 100644 --- a/i3bar/src/config.c +++ b/i3bar/src/config.c @@ -127,10 +127,6 @@ static int config_string_cb(void *params_, const unsigned char *val, unsigned in } if (!strcmp(cur_key, "status_command")) { - /* We cannot directly start the child here, because start_child() also - * needs to be run when no command was specified (to setup stdin). - * Therefore we save the command in 'config' and access it later in - * got_bar_config() */ DLOG("command = %.*s\n", len, val); sasprintf(&config.command, "%.*s", len, val); return 1; diff --git a/i3bar/src/ipc.c b/i3bar/src/ipc.c index 3536b7dc..9ec9100b 100644 --- a/i3bar/src/ipc.c +++ b/i3bar/src/ipc.c @@ -100,9 +100,6 @@ void got_bar_config(char *reply) { /* Resolve color strings to colorpixels and save them, then free the strings. */ init_colors(&(config.colors)); - /* The name of this function is actually misleading. Even if no command is - * specified, this function initiates the watchers to listen on stdin and - * react accordingly */ start_child(config.command); FREE(config.command); } -- 2.39.5