]> git.wh0rd.org Git - nano.git/commitdiff
Verifying that the containing directory of the given filename exists.
authorBenno Schulenberg <bensberg@justemail.net>
Wed, 20 Jan 2016 15:14:52 +0000 (15:14 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Wed, 20 Jan 2016 15:14:52 +0000 (15:14 +0000)
Original patch by Rishabh Dave, edited by Benno.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5572 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/files.c
src/global.c
src/proto.h

index a85785903e25c4322504d3cbdc3e8b277dc89940..81f4f56651f747fe53cd3c8e0cbd44df9e840654 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2016-01-20  Rishabh Dave  <rishabhddave@gmail.com>
+       * src/files.c (verify_path, open_buffer): When opening a new buffer,
+       verify that the containing directory of the given filename exists.
+       * src/files.c (do_lockfile): Remove the existence check on the
+       directory, as this is now covered by verify_path().
+
 2016-01-17  Benno Schulenberg  <bensberg@justemail.net>
        * src/global.c: Fix typo in #ifndef symbol.  Reported by Frank.
        * doc/syntax/nanorc.nanorc: Remove '+' as only one menu is allowed.
index a2104ada9baf3f1dd97b44c76593fe7c0ba957ef..310c3000bc50254d90c87180a402c93a930c97e9 100644 (file)
 #include <pwd.h>
 #include <libgen.h>
 
+/* Determine whether the containing directory of the given filename exists.
+ * Pass the result back in the global variable valid_path. */
+void verify_path(const char *filename)
+{
+    char *parentdir;
+    struct stat parentinfo;
+
+    if (strrchr(filename, '/') == NULL)
+       parentdir = mallocstrcpy(NULL, ".");
+    else
+       parentdir = dirname(mallocstrcpy(NULL, filename));
+
+    if (stat(parentdir, &parentinfo) != -1 && S_ISDIR(parentinfo.st_mode))
+       valid_path = TRUE;
+    else {
+       statusbar(_("Directory '%s' does not exist"), parentdir);
+       valid_path = FALSE;
+       beep();
+    }
+
+    free(parentdir);
+}
+
 /* Add an entry to the openfile openfilestruct.  This should only be
  * called from open_buffer(). */
 void make_new_buffer(void)
@@ -112,7 +135,7 @@ void set_modified(void)
     titlebar(NULL);
 
 #ifndef NANO_TINY
-    if (!ISSET(LOCKING) || openfile->filename[0] == '\0')
+    if (!ISSET(LOCKING) || openfile->filename[0] == '\0' || !valid_path)
        return;
 
     if (openfile->lock_filename == NULL) {
@@ -282,7 +305,6 @@ int do_lockfile(const char *filename)
     size_t locknamesize = strlen(filename) + strlen(locking_prefix)
                + strlen(locking_suffix) + 3;
     char *lockfilename = charalloc(locknamesize);
-    char *lockfiledir = NULL;
     static char lockprog[11], lockuser[17];
     struct stat fileinfo;
     int lockfd, lockpid;
@@ -331,18 +353,7 @@ int do_lockfile(const char *filename)
            blank_statusbar();
            return -1;
        }
-    } else {
-       lockfiledir = mallocstrcpy(NULL, lockfilename);
-       lockfiledir = dirname(lockfiledir);
-       if (stat(lockfiledir, &fileinfo) == -1) {
-           statusbar(_("Error writing lock file: Directory \'%s\' doesn't exist"),
-               lockfiledir);
-           free(lockfiledir);
-           return 0;
-       }
-       free(lockfiledir);
     }
-
     return write_lockfile(lockfilename, filename, FALSE);
 }
 #endif /* !NANO_TINY */
@@ -393,6 +404,9 @@ bool open_buffer(const char *filename, bool undoable)
     if (new_buffer) {
        make_new_buffer();
 
+       verify_path(filename);
+
+       if (valid_path) {
 #ifndef NANO_TINY
        if (ISSET(LOCKING) && filename[0] != '\0') {
            int lockstatus = do_lockfile(filename);
@@ -408,6 +422,7 @@ bool open_buffer(const char *filename, bool undoable)
            }
        }
 #endif
+       }
     }
 
     /* If the filename isn't blank, and we are not in NOREAD_MODE,
@@ -963,7 +978,7 @@ int open_file(const char *filename, bool newfie, bool quiet, FILE **f)
        }
 
        if (newfie) {
-           if (!quiet)
+           if (!quiet && valid_path)
                statusbar(_("New File"));
            return -2;
        }
index 829c19bf849d5d23838909ee59ede9a2013dce30..b252f64a5f367744b33f9a67a2695a5f60428670 100644 (file)
@@ -40,6 +40,8 @@ bool func_key;
        /* Whether the current keystroke is an extended keypad value. */
 bool focusing = FALSE;
        /* Whether an update of the edit window should center the cursor. */
+bool valid_path;
+       /* Whether the containing directory of a specified file exists. */
 
 #ifndef NANO_TINY
 int controlleft = CONTROL_LEFT;
index e0842b4882c42609d2ade8f577be6ae67b4bb2e3..1056b76da67a3a2202a2df2970c49b723af7b0c9 100644 (file)
@@ -34,6 +34,7 @@ extern volatile sig_atomic_t sigwinch_counter;
 extern bool meta_key;
 extern bool func_key;
 extern bool focusing;
+extern bool valid_path;
 
 #ifndef NANO_TINY
 extern int controlleft;
@@ -281,6 +282,7 @@ void do_cut_till_eof(void);
 void do_uncut_text(void);
 
 /* All functions in files.c. */
+void verify_path(const char *filename);
 void make_new_buffer(void);
 void initialize_buffer_text(void);
 bool open_buffer(const char *filename, bool undoable);