Get rid of afd->path.
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index c0588197c553e1728713e0e964c61041eb02e7ef..f33fa7c8c42f81ab0f9ea4c724473d9861dd91e2 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -1,30 +1,25 @@
 /*
- * Copyright (C) 1998-2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998-2007 Andre Noll <maan@systemlinux.org>
  *
- *     This program is free software; you can redistribute it and/or modify
- *     it under the terms of the GNU General Public License as published by
- *     the Free Software Foundation; either version 2 of the License, or
- *     (at your option) any later version.
- *
- *     This program is distributed in the hope that it will be useful,
- *     but WITHOUT ANY WARRANTY; without even the implied warranty of
- *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *     GNU General Public License for more details.
- *
- *     You should have received a copy of the GNU General Public License
- *     along with this program; if not, write to the Free Software
- *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file gui.c ncurses-based interface for paraslash */
 
+#include <signal.h>
+#include <sys/types.h>
+#include <dirent.h>
 #include "gui.cmdline.h"
 #include "para.h"
+#include "gui.h"
 #include <curses.h>
 #include "ringbuffer.h"
-#include "string.h"
+#include "gui_common.h"
 #include "fd.h"
 #include "error.h"
+#include "list.h"
+#include "sched.h"
+#include "signal.h"
 
 /** define the array of error lists needed by para_gui */
 INIT_GUI_ERRLISTS;
@@ -56,8 +51,8 @@ void *bot_win_rb;
 
 static unsigned scroll_position;
 
-static int external_cmd_died, curses_active;
-static pid_t external_cmd_pid;
+static int cmd_died, curses_active;
+static pid_t cmd_pid;
 
 static int command_pipe = -1;
 static int audiod_pipe = -1;
@@ -457,11 +452,12 @@ __printf_2_3 static void outputf(int color, const char* fmt,...)
        wrefresh(bot.win);
 }
 
-static void add_output_line(char *line)
+static int add_output_line(char *line, __a_unused void *data)
 {
        if (!curses_active)
-               return;
+               return 1;
        rb_add_entry(COLOR_OUTPUT, para_strdup(line));
+       return 1;
 }
 
 void para_log(int ll, const char *fmt,...)
@@ -494,7 +490,7 @@ static void setup_signal_handling(void)
        para_install_sighandler(SIGCHLD);
        para_install_sighandler(SIGWINCH);
        para_install_sighandler(SIGUSR1);
-       signal(SIGPIPE, SIG_IGN);
+//     signal(SIGPIPE, SIG_IGN);
        signal(SIGHUP, SIG_IGN);
 }
 
@@ -730,14 +726,15 @@ static void init_curses(void)
 
 static void check_sigchld(void)
 {
+       int ret;
        pid_t pid;
 reap_next_child:
-       pid = para_reap_child();
-       if (pid <= 0)
+       ret = para_reap_child(&pid);
+       if (ret <= 0)
                return;
-       if (pid == external_cmd_pid) {
-               external_cmd_pid = 0;
-               external_cmd_died = 1;
+       if (pid == cmd_pid) {
+               cmd_pid = 0;
+               cmd_died = 1;
        }
        goto reap_next_child;
 }
@@ -745,7 +742,7 @@ reap_next_child:
 /*
  * print status line if line starts with known command.
  */
-static void check_stat_line(char *line)
+static int check_stat_line(char *line, __a_unused void *data)
 {
        int i;
 
@@ -757,7 +754,7 @@ static void check_stat_line(char *line)
                stat_content[i] = para_strdup(line);
                print_stat_item(i);
        }
-       return;
+       return 1;
 }
 
 /*
@@ -867,14 +864,14 @@ static int open_audiod_pipe(void)
  *
  * EXTERNAL_MODE: Check only signal pipe. Used when an external command
  * is running. During that thime curses is disabled.  Returns when
- * external_cmd_pid == 0.
+ * cmd_pid == 0.
  */
 static int do_select(int mode)
 {
        fd_set rfds;
        int ret;
        int max_fileno, cp_numread = 1;
-       char command_buf[STRINGSIZE] = "";
+       char command_buf[4096] = "";
        int cbo = 0; /* command buf offset */
        struct timeval tv;
 repeat:
@@ -906,7 +903,7 @@ repeat:
        if (command_pipe >= 0 && mode == COMMAND_MODE &&
                        FD_ISSET(command_pipe, &rfds)) {
                cp_numread = read(command_pipe, command_buf + cbo,
-                       STRINGSIZE - 1 - cbo);
+                       sizeof(command_buf) - 1 - cbo);
                if (cp_numread >= 0)
                        cbo += cp_numread;
                else {
@@ -921,8 +918,8 @@ repeat:
                        close(audiod_pipe);
                        audiod_pipe = -1;
                        clear_all_items();
-                       free(stat_content[SI_STATUS_BAR]);
-                       stat_content[SI_STATUS_BAR] =
+                       free(stat_content[SI_BASENAME]);
+                       stat_content[SI_BASENAME] =
                                para_strdup("audiod not running!?");
                        print_all_items();
                }
@@ -932,10 +929,21 @@ check_return:
                if (cp_numread <= 0 && !cbo) /* command complete */
                        return 0;
                if (cbo)
-                       cbo = for_each_line(command_buf, cbo, &add_output_line);
+                       cbo = for_each_line(command_buf, cbo,
+                               &add_output_line, NULL);
                if (cp_numread <= 0)
                        cbo = 0;
                wrefresh(bot.win);
+               ret = wgetch(top.win);
+               if (ret != ERR && ret != KEY_RESIZE) {
+                       if (command_pipe) {
+                               close(command_pipe);
+                               command_pipe = -1;
+                       }
+                       if (cmd_pid)
+                               kill(cmd_pid, SIGTERM);
+                       return -1;
+               }
                break;
        case GETCH_MODE:
                ret = wgetch(top.win);
@@ -943,8 +951,8 @@ check_return:
                        return ret;
                break;
        case EXTERNAL_MODE:
-               if (external_cmd_died) {
-                       external_cmd_died = 0;
+               if (cmd_died) {
+                       cmd_died = 0;
                        return 0;
                }
        }
@@ -968,17 +976,17 @@ static int send_output(void)
 
 static int client_cmd_cmdline(char *cmd)
 {
-       pid_t pid;
        int ret, fds[3] = {0, 1, 0};
        char *c = make_message(BINDIR "/para_client %s", cmd);
 
        outputf(COLOR_COMMAND, "%s", c);
-       print_in_bar(COLOR_MSG, "executing client command, hit q to abort\n");
-       ret = para_exec_cmdline_pid(&pid, c, fds);
+       print_in_bar(COLOR_MSG, "executing client command, hit any key to abort\n");
+       ret = para_exec_cmdline_pid(&cmd_pid, c, fds);
        free(c);
        if (ret < 0)
                return -1;
        command_pipe = fds[1];
+       mark_fd_nonblock(command_pipe);
        return send_output();
 }
 
@@ -987,14 +995,14 @@ static int client_cmd_cmdline(char *cmd)
  */
 static int display_cmd(char *cmd)
 {
-       pid_t pid;
        int fds[3] = {0, 1, 0};
 
-       print_in_bar(COLOR_MSG, "executing display command, hit q to abort");
+       print_in_bar(COLOR_MSG, "executing display command, hit any key to abort");
        outputf(COLOR_COMMAND, "%s", cmd);
-       if (para_exec_cmdline_pid(&pid, cmd, fds) < 0)
+       if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0)
                return -1;
        command_pipe = fds[1];
+       mark_fd_nonblock(command_pipe);
        return send_output();
 }
 
@@ -1005,10 +1013,11 @@ static int external_cmd(char *cmd)
 {
        int fds[3] = {-1, -1, -1};
 
-       if (external_cmd_pid)
+       if (cmd_pid)
                return -1;
        shutdown_curses();
-       para_exec_cmdline_pid(&external_cmd_pid, cmd, fds);
+       para_exec_cmdline_pid(&cmd_pid, cmd, fds);
+       cmd_died = 0;
        do_select(EXTERNAL_MODE);
        init_curses();
        return 0;
@@ -1148,6 +1157,12 @@ static void com_ll_incr(void)
 static void com_reread_conf(void)
 {
        char *cf =configfile_exists();
+       struct gui_cmdline_parser_params params = {
+               .override = 1,
+               .initialize = 1,
+               .check_required = 0,
+               .check_ambiguity = 0
+       };
 
        if (!cf) {
                PARA_WARNING_LOG("%s", "there is no configuration to read");
@@ -1155,8 +1170,8 @@ static void com_reread_conf(void)
        }
        PARA_INFO_LOG("%s", "rereading command line options and config file");
        gui_cmdline_parser(_argc, _argv, &conf);
-       gui_cmdline_parser_configfile(cf, &conf, 1, 1, 0);
-       PARA_NOTICE_LOG("%s", "configuration read");
+       gui_cmdline_parser_config_file(cf, &conf, &params);
+       PARA_NOTICE_LOG("%s", "config file reloaded");
        if (check_key_map_args() < 0)
                finish(EXIT_FAILURE);
 }
@@ -1317,6 +1332,7 @@ int main(int argc, char *argv[])
                fprintf(stderr, "parse error while reading command line\n");
                exit(EXIT_FAILURE);
        }
+       HANDLE_VERSION_FLAG("gui", conf);
        init_theme(0, &theme);
        top.lines = theme.top_lines_default;
        if (check_key_map_args() < 0) {
@@ -1329,8 +1345,15 @@ int main(int argc, char *argv[])
                        conf.config_file_arg);
                exit(EXIT_FAILURE);
        }
-       if (cf)
-               gui_cmdline_parser_configfile(cf, &conf, 0, 0, 0);
+       if (cf) {
+               struct gui_cmdline_parser_params params = {
+                       .override = 0,
+                       .initialize = 0,
+                       .check_required = 0,
+                       .check_ambiguity = 0
+               };
+               gui_cmdline_parser_config_file(cf, &conf, &params);
+       }
        if (check_key_map_args() < 0) {
                fprintf(stderr, "invalid key map in config file\n");
                exit(EXIT_FAILURE);