]> git.wh0rd.org Git - nano.git/commitdiff
External command code and fix for BUG #70
authorChris Allegretta <chrisa@asty.org>
Thu, 21 Mar 2002 05:07:28 +0000 (05:07 +0000)
committerChris Allegretta <chrisa@asty.org>
Thu, 21 Mar 2002 05:07:28 +0000 (05:07 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1136 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

BUGS
ChangeLog
files.c
global.c
nano.c
nano.h
proto.h

diff --git a/BUGS b/BUGS
index c4fbe18a75b6d2c8ebac0804ce689fbb606666c1..731dbab52bdf6a219994dd0c774da4f03baa91d2 100644 (file)
--- a/BUGS
+++ b/BUGS
   Trevor Cordes) (68) [FIXED].
 - Home and End control keys (^A, ^E) do not always work in filename
   prompt (bug found by Ian Turner) (69) [1.0 series only] [FIXED].
+- Trying to insert a file of 0 bytes will hang nano (70) [FIXED].
 ** Open BUGS **
 
 $Id$
index 7cd7666db4dadcbcdccfbf0cff57428a05ae2b34..b9d0ac79eb12547068fe2c14b804c8a7b3298f71 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,9 +2,14 @@ CVS code -
 - General
        - Type misalignments and mem leaks in renumber_all, do_justify
          and do_spell (Rocco & Steven Kneizys).
+       - New "External Command" code, originally by Dwayne Rightler.
+         New function files.c:open_pipe(), changes to do_insertfile(),
+         new list extcmd_list, cmd is ^X after ^R by default.
 - files.c:
   check_writable_directory()
        - Stat full_path, not path (Steven Kneizys).
+  read_file()
+       - Abort if we read a file of 0 lines (num_lines == 0), fixes BUG #70.
 - nano.c:
   help_init()
        - Capitalize Meta altkeys.
diff --git a/files.c b/files.c
index 6be091825152867d26f13d7207fa2faeb26050bc..5d8f30a5e7dd9fecfd26c99651270d1a51b3c2d7 100644 (file)
--- a/files.c
+++ b/files.c
@@ -241,7 +241,15 @@ int read_file(int fd, char *filename, int quiet)
        num_lines++;
        buf[0] = 0;
     }
-    /* Did we even GET a file? */
+
+    /* Did we try to insert a file of 0 bytes? */
+    if (num_lines == 0)
+    {
+       statusbar(_("Read %d lines"), 0);
+       return 1;
+    }
+
+    /* Did we even GET a file if we don't already have one? */
     if (totsize == 0 || fileptr == NULL) {
        new_file();
        statusbar(_("Read %d lines"), num_lines);
@@ -280,6 +288,45 @@ int read_file(int fd, char *filename, int quiet)
     return 1;
 }
 
+#ifndef NANO_SMALL
+int open_pipe(char *command)
+{
+    int forkpid, fd;
+    char *pipefile, *execute;
+
+    execute = charalloc(strlen(command) + 24);
+    if ((pipefile = safe_tempnam(0, "nano.")) == NULL) {
+        statusbar(_("Could not create a temporary filename: %s"),
+                  strerror(errno));
+       free(execute);
+       free(pipefile);
+        return 1;
+    }
+
+    sprintf(execute,"%s 2>&1 > %s",command,pipefile);
+    umask(0);
+    mkfifo(pipefile,0700);
+    forkpid = fork();
+    if (forkpid == -1) {
+       statusbar(_("Could not fork"));
+       free(execute);
+       free(pipefile);
+       return 1;
+    }
+    else if (forkpid == 0) {
+       execl("/bin/sh","/bin/sh","-c",execute,0);
+       exit(0);
+    }
+    fd = open(pipefile,O_RDONLY);
+    read_file(fd,"stdin",0);
+    unlink(pipefile);
+    free(execute);
+    free(pipefile);
+    set_modified();
+    return 0;
+}
+#endif /* NANO_SMALL */
+
 /* Open the file (and decide if it exists) */
 int open_file(char *filename, int insert, int quiet)
 {
@@ -427,7 +474,24 @@ int do_insertfile(int loading_file)
        }
 #endif
 
-       i = open_file(realname, 1, loading_file);
+#ifndef NANO_SMALL
+       if (i == NANO_EXTCMD_KEY) {
+           i = statusq(1, extcmd_list, "", _("Command to execute "));
+           if (i == -1) {
+               statusbar(_("Cancelled"));
+               UNSET(KEEP_CUTBUFFER);
+               display_main_list();
+               return 0;
+           }
+           if (answer != NULL) {
+               i = open_pipe(answer);
+           }
+       }
+       else 
+#endif /* NANO_SMALL */
+       {
+           i = open_file(realname, 1, loading_file);
+       }
 
 #ifdef ENABLE_MULTIBUFFER
        if (loading_file)
index 9f9f761a6244ffc19b1e766f9aee35a6acc8f5fe..ccf5e6a070761d99863c19b492d505aa35380fbd 100644 (file)
--- a/global.c
+++ b/global.c
@@ -99,6 +99,7 @@ shortcut *writefile_list = NULL;
 shortcut *insertfile_list = NULL;
 shortcut *help_list = NULL;
 shortcut *spell_list = NULL;
+shortcut *extcmd_list = NULL;
 #ifndef DISABLE_BROWSER
 shortcut *browser_list = NULL;
 #endif
@@ -268,7 +269,7 @@ void shortcut_init(int unjustify)
 
 #ifndef NANO_SMALL
     char *nano_tofiles_msg = "", *nano_gotodir_msg = "", *nano_case_msg =
-       "", *nano_reverse_msg = "";
+       "", *nano_reverse_msg = "", *nano_execute_msg = "";
     char *nano_dos_msg = "", *nano_mac_msg = ""; 
 
 #ifdef HAVE_REGEX_H
@@ -317,6 +318,7 @@ void shortcut_init(int unjustify)
     nano_case_msg =
        _("Make the current search or replace case (in)sensitive");
     nano_tofiles_msg = _("Go to file browser");
+    nano_execute_msg = _("Execute external command");
     nano_gotodir_msg = _("Goto Directory");
     nano_cancel_msg = _("Cancel the current function");
     nano_append_msg = _("Append to the current file");
@@ -638,6 +640,10 @@ void shortcut_init(int unjustify)
     sc_init_one(&insertfile_list, NANO_TOFILES_KEY, _("To Files"),
                nano_tofiles_msg, 0, 0, 0, NOVIEW, 0);
 #endif
+#ifndef NANO_SMALL
+    sc_init_one(&insertfile_list, NANO_EXTCMD_KEY, _("Execute Command"),
+               nano_execute_msg, 0, 0, 0, NOVIEW, 0);
+#endif
 
     sc_init_one(&spell_list, NANO_HELP_KEY,
                _("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
@@ -645,6 +651,13 @@ void shortcut_init(int unjustify)
     sc_init_one(&spell_list, NANO_CANCEL_KEY, _("Cancel"),
                nano_cancel_msg, 0, 0, 0, VIEW, 0);
 
+#ifndef NANO_SMALL
+    sc_init_one(&extcmd_list, NANO_HELP_KEY,
+               _("Get Help"), nano_help_msg, 0, 0, 0, VIEW, do_help);
+
+    sc_init_one(&extcmd_list, NANO_CANCEL_KEY, _("Cancel"),
+               nano_cancel_msg, 0, 0, 0, VIEW, 0);
+#endif
 
 #ifndef DISABLE_BROWSER
 
diff --git a/nano.c b/nano.c
index a42b3781bfdd4effb10c9cb2c0ac7fbced88d7c4..4685129b2c12f3cf3e5afb48d2c00b6371fbeadc 100644 (file)
--- a/nano.c
+++ b/nano.c
@@ -2504,6 +2504,14 @@ void help_init(void)
                "instance of the given misspelled word in the "
                "current file.\n\n The following other functions are "
                "available in Spell Check mode:\n\n");
+#ifndef NANO_SMALL
+    else if (currshortcut == extcmd_list)
+       ptr = _("External Command Help Text\n\n "
+               "This menu allows you to insert the output of a command "
+               "run by the shell into the current buffer (or a new "
+               "buffer in multibuffer mode).\n\n The following keys are "
+               "available in this mode:\n\n");
+#endif
     else /* Default to the main help list */
        ptr = help_text_init;
 
diff --git a/nano.h b/nano.h
index 697a703996d018584193abdac87b3229389372c7..79527f43bb97e9c15265255074faa22d39466e05 100644 (file)
--- a/nano.h
+++ b/nano.h
@@ -289,6 +289,7 @@ know what you're doing */
 #define NANO_OPENPREV_ALTKEY   NANO_ALT_COMMA
 #define NANO_OPENNEXT_ALTKEY   NANO_ALT_PERIOD
 #define NANO_BRACKET_KEY       NANO_ALT_BRACKET
+#define NANO_EXTCMD_KEY                NANO_CONTROL_X
 
 #define TOGGLE_CONST_KEY       NANO_ALT_C
 #define TOGGLE_AUTOINDENT_KEY  NANO_ALT_I
diff --git a/proto.h b/proto.h
index 527527bb06b5d8755fc4d731ab6ed08f53e5b41c..1d91998f90ae0c77badbd84ef73bf2fe9bb03ce5 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -72,7 +72,7 @@ extern shortcut *shortcut_list;
 extern shortcut *main_list, *whereis_list;
 extern shortcut *replace_list, *goto_list;
 extern shortcut *writefile_list, *insertfile_list;
-extern shortcut *spell_list, *replace_list_2;
+extern shortcut *spell_list, *replace_list_2, *extcmd_list;
 extern shortcut *help_list;
 #ifndef DISABLE_BROWSER
 extern shortcut *browser_list, *gotodir_list;