X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=gui.c;h=68a271a898a49a82f6499bd145cd9956e1c4a5f3;hb=ef0508ee41853a36a60676714ff1deecf9bb930d;hp=a4ee72758d6944cbd28aa8476049268ebb762256;hpb=f652ce6afe7f6fd0e42814505234cbf4321a736e;p=paraslash.git diff --git a/gui.c b/gui.c index a4ee7275..68a271a8 100644 --- a/gui.c +++ b/gui.c @@ -50,7 +50,7 @@ static struct ringbuffer *bot_win_rb; static unsigned scroll_position; -static int cmd_died, curses_active; +static int curses_active; static pid_t cmd_pid; static int command_fds[2]; @@ -834,10 +834,8 @@ reap_next_child: ret = para_reap_child(&pid); if (ret <= 0) return; - if (pid == cmd_pid) { + if (pid == cmd_pid) cmd_pid = 0; - cmd_died = 1; - } goto reap_next_child; } @@ -951,7 +949,7 @@ static int open_stat_pipe(void) return ret; } -#define COMMAND_BUF_SIZE 4096 +#define COMMAND_BUF_SIZE 32768 /* * This is the core select loop. Besides the (internal) signal @@ -993,6 +991,8 @@ repeat: if (command_fds[1] >= 0) para_fd_set(command_fds[1], &rfds, &max_fileno); } + if (mode == GETCH_MODE || mode == COMMAND_MODE) + para_fd_set(STDIN_FILENO, &rfds, &max_fileno); ret = para_select(max_fileno + 1, &rfds, NULL, &tv); if (ret <= 0) goto check_return; /* skip fd checks */ @@ -1023,6 +1023,10 @@ repeat: if (command_fds[!i] < 0) /* both fds closed */ return 0; } + if (cbo[i] == COMMAND_BUF_SIZE - 1) { + PARA_NOTICE_LOG("discarding overlong line"); + cbo[i] = 0; + } } } ret = read_stat_pipe(&rfds); @@ -1060,10 +1064,8 @@ check_return: return ret; break; case EXTERNAL_MODE: - if (cmd_died) { - cmd_died = 0; + if (cmd_pid == 0) return 0; - } } goto repeat; } @@ -1137,7 +1139,6 @@ static void external_cmd(char *cmd) shutdown_curses(); if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0) return; - cmd_died = 0; do_select(EXTERNAL_MODE); init_curses(); }