X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=865ed658afc4197f4ba29ce5344be38fcbd48bad;hp=31987c46570197411624958ea03a6c9ddac25a85;hb=3f8c505afd85714f6f8c12d8a94ae642fbfb6de4;hpb=f8591e80c0dcc02c7193a2a7d2961e361cbdebc7 diff --git a/gui.c b/gui.c index 31987c46..865ed658 100644 --- a/gui.c +++ b/gui.c @@ -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] =