]> git.sur5r.net Git - i3/i3/commitdiff
i3bar: Don't start child unless status_command
authorTony Crisci <tony@dubstepdish.com>
Fri, 27 Dec 2013 03:00:06 +0000 (22:00 -0500)
committerMichael Stapelberg <michael@stapelberg.de>
Wed, 1 Jan 2014 14:23:50 +0000 (15:23 +0100)
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
i3bar/src/config.c
i3bar/src/ipc.c

index 1bd0d258b1d71d65ad0f89842d586427ec34a4e1..16d3e0912f1de606e48ecd799a0b308e50326c1c 100644 (file)
@@ -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 */
index 5ac31b1f3a16d53a3a2d2488377b7b22374c62fd..dea47b9caa3297256ac9809c9e9dd1c0e2ab50b4 100644 (file)
@@ -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;
index 3536b7dcb27f7b9a57fc45eed4edcb5091fd9fcf..9ec9100bfd63ac6765b144fd79d944011953d510 100644 (file)
@@ -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);
 }