]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - gui.c
Merge branch 't/color_cleanups'
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index 31987c46570197411624958ea03a6c9ddac25a85..8e70dd93b4d3a5d3d7b35a3c7ec65723d7639f24 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1998-2010 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998-2011 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -54,7 +54,7 @@ static int cmd_died, curses_active;
 static pid_t cmd_pid;
 
 static int command_pipe = -1;
-static int audiod_pipe = -1;
+static int stat_pipe = -1;
 static struct gui_args_info conf;
 
 enum {GETCH_MODE, COMMAND_MODE, EXTERNAL_MODE};
@@ -191,20 +191,6 @@ static struct gui_command command_list[] = {
        }
 };
 
-static int para_open_audiod_pipe(char *cmd)
-{
-       int fds[3] = {0, 1, 0};
-       pid_t pid;
-       int ret = para_exec_cmdline_pid(&pid, cmd, fds);
-       if (ret < 0)
-               return ret;
-       ret = mark_fd_nonblocking(fds[1]);
-       if (ret > 0)
-               return fds[1];
-       close(fds[1]);
-       return ret;
-}
-
 static int find_cmd_byname(char *name)
 {
        int i;
@@ -308,9 +294,9 @@ static int align_str(WINDOW* win, char *str, unsigned int len,
                str[len] = '\0';
                num = 0;
        }
-       /* replace newlines by spaces */
+       /* replace control characters by spaces */
        for (i = 0; i < len && str[i]; i++) {
-               if (str[i] == '\n')
+               if (str[i] == '\n' || str[i] == '\r' || str[i] == '\f')
                        str[i] = ' ';
        }
        if (align == LEFT) {
@@ -708,14 +694,14 @@ print:
        return 1;
 }
 
-static int read_audiod_pipe(fd_set *rfds)
+static int read_stat_pipe(fd_set *rfds)
 {
        static char *buf;
        static int bufsize, loaded;
        int ret, ret2;
        size_t sz;
 
-       if (audiod_pipe < 0)
+       if (stat_pipe < 0)
                return 0;
        if (loaded >= bufsize) {
                if (bufsize > 1000 * 1000) {
@@ -726,7 +712,7 @@ static int read_audiod_pipe(fd_set *rfds)
                buf = para_realloc(buf, bufsize);
        }
        assert(loaded < bufsize);
-       ret = read_nonblock(audiod_pipe, buf + loaded, bufsize - loaded,
+       ret = read_nonblock(stat_pipe, buf + loaded, bufsize - loaded,
                rfds, &sz);
        loaded += sz;
        ret2 = for_each_stat_item(buf, loaded, update_item);
@@ -907,15 +893,30 @@ static void handle_signal(int sig)
        }
 }
 
-static int open_audiod_pipe(void)
+static int open_stat_pipe(void)
 {
        static int init = 1;
+       int ret, fds[3] = {0, 1, 0};
+       pid_t pid;
 
        if (init)
                init = 0;
        else
-               sleep(1);
-       return para_open_audiod_pipe(conf.stat_cmd_arg);
+               /*
+                * Sleep a bit to avoid a busy loop. As the call to sleep() may
+                * be interrupted by SIGCHLD, we simply wait until the call
+                * succeeds.
+                */
+               while (sleep(2))
+                       ; /* nothing */
+       ret = para_exec_cmdline_pid(&pid, conf.stat_cmd_arg, fds);
+       if (ret < 0)
+               return ret;
+       ret = mark_fd_nonblocking(fds[1]);
+       if (ret >= 0)
+               return fds[1];
+       close(fds[1]);
+       return ret;
 }
 
 /*
@@ -946,11 +947,10 @@ repeat:
 //     ret = refresh_status();
        FD_ZERO(&rfds);
        max_fileno = 0;
-       /* audiod pipe */
-       if (audiod_pipe < 0)
-               audiod_pipe = open_audiod_pipe();
-       if (audiod_pipe >= 0)
-               para_fd_set(audiod_pipe, &rfds, &max_fileno);
+       if (stat_pipe < 0)
+               stat_pipe = open_stat_pipe();
+       if (stat_pipe >= 0)
+               para_fd_set(stat_pipe, &rfds, &max_fileno);
        /* signal pipe */
        para_fd_set(signal_pipe, &rfds, &max_fileno);
        /* command pipe only for COMMAND_MODE */
@@ -981,11 +981,11 @@ repeat:
                        return 0;
                }
        }
-       ret = read_audiod_pipe(&rfds);
+       ret = read_stat_pipe(&rfds);
        if (ret < 0) {
-               PARA_NOTICE_LOG("closing audiod pipe: %s\n", para_strerror(-ret));
-               close(audiod_pipe);
-               audiod_pipe = -1;
+               PARA_NOTICE_LOG("closing stat pipe: %s\n", para_strerror(-ret));
+               close(stat_pipe);
+               stat_pipe = -1;
                clear_all_items();
                free(stat_content[SI_BASENAME]);
                stat_content[SI_BASENAME] =