diff --git a/ChangeLog b/ChangeLog index a85785903e25c4322504d3cbdc3e8b277dc89940..81f4f56651f747fe53cd3c8e0cbd44df9e840654 100644 --- 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. diff --git a/src/files.c b/src/files.c index a2104ada9baf3f1dd97b44c76593fe7c0ba957ef..310c3000bc50254d90c87180a402c93a930c97e9 100644 --- a/src/files.c +++ b/src/files.c @@ -33,6 +33,29 @@ #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; } diff --git a/src/global.c b/src/global.c index 829c19bf849d5d23838909ee59ede9a2013dce30..b252f64a5f367744b33f9a67a2695a5f60428670 100644 --- a/src/global.c +++ b/src/global.c @@ -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; diff --git a/src/proto.h b/src/proto.h index e0842b4882c42609d2ade8f577be6ae67b4bb2e3..1056b76da67a3a2202a2df2970c49b723af7b0c9 100644 --- a/src/proto.h +++ b/src/proto.h @@ -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);