]> Sergey Matveev's repositories - nnn.git/commitdiff
SSHFS refinements
authorArun Prakash Jana <engineerarun@gmail.com>
Sun, 21 Apr 2019 20:44:43 +0000 (02:14 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Sun, 21 Apr 2019 20:44:43 +0000 (02:14 +0530)
README.md
nnn.1
src/nnn.c

index 42dcc47c25cb693687ef07af824d6746eb662493..00467828fa220a25a92f3a9bf84556ce95854c53 100644 (file)
--- a/README.md
+++ b/README.md
@@ -375,7 +375,6 @@ The following indicators are used in the detail view:
 | `NNN_COPIER='/absolute/path/to/copier'` | system clipboard copier script [default: none] |
 | `NNN_NOTE=/home/user/Dropbox/notes` | path to note file [default: none] |
 | `NNN_TMPFILE=/tmp/nnn` | file to write current open dir path to for cd on quit |
-| `NNN_SSHFS_MNT_ROOT=/home/user/.netmnt` | absolute path to SSHFS mount point root |
 | `NNN_USE_EDITOR=1` | Open text files in `$EDITOR` (`$VISUAL`, if defined; fallback vi) |
 | `NNN_NO_AUTOSELECT=1` | do not auto-select matching dir in _nav-as-you-type_ mode |
 | `NNN_RESTRICT_NAV_OPEN=1` | open files on <kbd> ↵</kbd>, not <kbd>→</kbd> or <kbd>l</kbd> |
@@ -385,10 +384,7 @@ The following indicators are used in the detail view:
 
 #### SSHFS mounts
 
-To connect to and mount remote shares using SSHFS, `nnn` requires the following:
-
-1. ssh configuration file `~/.ssh/config` should have the host entries. sshfs reads this file.
-2. `$NNN_SSHFS_MNT_ROOT` should be set to the **absolute path** to the directory under which `nnn` creates the mount point for a host. The mount point is the same as the host name.
+To connect to and mount remote shares using SSHFS, `nnn` requires the ssh configuration file `~/.ssh/config` to have the host entries. sshfs reads this file.
 
 Example host entry for a Termux environment on Android device:
 
@@ -399,14 +395,12 @@ Host phone
     Port 8022
 ```
 
-If `$NNN_SSHFS_MNT_ROOT` is set to `/home/user/remotes`, the above host `phone` will be mounted at `/home/user/remotes/phone`. `nnn` creates the directory `phone` if it doesn't exist.
-
-To unmount a mount point highlight it in `nnn` (so that it's the current entry) and press the relevant keybind to unmount. It might be a good idea to bookmark `$NNN_SSHFS_MNT_ROOT`.
+The above host `phone` will be mounted at `~/.config/nnn/phone`. `nnn` creates the directory `phone` if it doesn't exist.
 
 Notes:
 
-1. `nnn` places you inside the mount point after a successful (un)mount so you can ensure the operation completed successfully indeed. To jump back to the last directory, press the usual <kbd>-</kbd>.
-2. `nnn` doesn't delete the mount point on unmount to prevent accidental data loss.
+1. `nnn` takes you to the mount point after successful mounts. To jump back to the last directory, press the usual <kbd>-</kbd>.
+2. `nnn` doesn't delete the mount point on unmount to prevent accidental data loss. **Please ensure the mount point is not mounted if you are deleting it manually.**
 3. More information on [SSHFS](https://wiki.archlinux.org/index.php/SSHFS).
 
 #### Help
diff --git a/nnn.1 b/nnn.1
index 43a8fa45c06f836422257b9ac4a50ff1cd21a59a..95400b662c0d578536aba5b9d25d19603264bab4 100644 (file)
--- a/nnn.1
+++ b/nnn.1
@@ -184,11 +184,6 @@ when dealing with the !, e and p commands respectively. A single combination to
     export NNN_TMPFILE=/tmp/nnn
 .Ed
 .Pp
-\fBNNN_SSHFS_MNT_ROOT:\fR absolute path to SSHFS mount point root. Mount points are created at this location.
-.Bd -literal
-    export NNN_SSHFS_MNT_ROOT=/home/user/.netmnt`
-.Ed
-.Pp
 \fBNNN_USE_EDITOR:\fR use EDITOR (VISUAL takes preference, preferably CLI, fallback vi) to handle text
 files.
 .Bd -literal
index 88a82e124c9ff17a760abd572b20e529fee11816..2e49fb48cb6d50e697ce09ce1cb9ef445f92df90 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -283,7 +283,6 @@ static char *home;
 static char *cfgdir;
 static char *g_cppath;
 static char *plugindir;
-static char *sshfsmnt;
 static blkcnt_t ent_blocks;
 static blkcnt_t dir_blocks;
 static ulong num_files;
@@ -389,16 +388,15 @@ static const char * const messages[] = {
 #define NNN_COPIER 4
 #define NNN_NOTE 5
 #define NNN_TMPFILE 6
-#define NNN_SSHFS_MNT_ROOT 7
-#define NNNLVL 8 /* strings end here */
-#define NNN_USE_EDITOR 9 /* flags begin here */
-#define NNN_NO_AUTOSELECT 10
-#define NNN_RESTRICT_NAV_OPEN 11
-#define NNN_RESTRICT_0B 12
-#define NNN_OPENER_DETACH 13
-#define NNN_TRASH 14
+#define NNNLVL 7 /* strings end here */
+#define NNN_USE_EDITOR 8 /* flags begin here */
+#define NNN_NO_AUTOSELECT 9
+#define NNN_RESTRICT_NAV_OPEN 10
+#define NNN_RESTRICT_0B 11
+#define NNN_OPENER_DETACH 12
+#define NNN_TRASH 13
 #ifdef __linux__
-#define NNN_OPS_PROG 15
+#define NNN_OPS_PROG 14
 #endif
 
 static const char * const env_cfg[] = {
@@ -409,7 +407,6 @@ static const char * const env_cfg[] = {
        "NNN_COPIER",
        "NNN_NOTE",
        "NNN_TMPFILE",
-       "NNN_SSHFS_MNT_ROOT",
        "NNNLVL",
        "NNN_USE_EDITOR",
        "NNN_NO_AUTOSELECT",
@@ -2407,34 +2404,35 @@ static bool execute_file(int cur, char *path, char *newpath, int *presel)
        return TRUE;
 }
 
+static bool create_dir(const char *path)
+{
+       if (!xdiraccess(path)) {
+               if (errno != ENOENT)
+                       return FALSE;
+
+               if (mkdir(path, 0777) == -1)
+                       return FALSE;
+       }
+
+       return TRUE;
+}
+
 static bool sshfs_mount(char *path, char *newpath, int *presel)
 {
        int r;
        char *tmp;
 
-       if (!sshfsmnt) {
-               printwait("set NNN_SSHFS_MNT_ROOT", presel);
-               return FALSE;
-       }
-
-       tmp = xreadline(NULL, "Host: ");
+       tmp = xreadline(NULL, "host: ");
        if (!tmp[0])
                return FALSE;
 
        /* Create the mount point */
-       mkpath(sshfsmnt, tmp, newpath);
-       r = mkdir(newpath, 0777);
-       if (r == -1 && errno != EEXIST) {
+       mkpath(cfgdir, tmp, newpath);
+       if (!create_dir(newpath)) {
                printwait(strerror(errno), presel);
                return FALSE;
        }
 
-       /* Check if directory can be accessed */
-       if (!xdiraccess(newpath)) {
-               *presel = MSGWAIT;
-               return FALSE;
-       }
-
        if (!getutil("sshfs")) {
                printwait("sshfs missing", presel);
                return FALSE;
@@ -2454,19 +2452,22 @@ static bool sshfs_mount(char *path, char *newpath, int *presel)
        return TRUE;
 }
 
-static bool sshfs_unmount(char *path, char *fname, char *newpath, int *presel)
+static bool sshfs_unmount(char *path, char *newpath, int *presel)
 {
        static char cmd[] = "fusermount3"; /* Arch Linux utility */
        static bool found = FALSE;
+       char *tmp;
 
        /* On Ubuntu it's fusermount */
        if (!found && !getutil(cmd))
                cmd[10] = '\0';
 
-       if (!ndents)
+       tmp = xreadline(NULL, "host: ");
+       if (!tmp[0])
                return FALSE;
 
-       mkpath(path, dents[cur].name, newpath);
+       /* Create the mount point */
+       mkpath(cfgdir, tmp, newpath);
        if (!xdiraccess(newpath)) {
                *presel = MSGWAIT;
                return FALSE;
@@ -3981,10 +3982,6 @@ nochange:
                        goto begin;
                case SEL_SSHFS:
                        if (!sshfs_mount(path, newpath, &presel))
-                               goto nochange; // fallthrough
-               case SEL_UMOUNT:
-                       if (sel == SEL_UMOUNT
-                           && !sshfs_unmount(path, dents[cur].name, newpath, &presel))
                                goto nochange;
 
                        lastname[0] = '\0';
@@ -3997,6 +3994,9 @@ nochange:
 
                        setdirwatch();
                        goto begin;
+               case SEL_UMOUNT:
+                       sshfs_unmount(path, newpath, &presel);
+                       goto nochange;
                case SEL_QUITCD: // fallthrough
                case SEL_QUIT:
                        for (r = 0; r < CTX_MAX; ++r)
@@ -4098,19 +4098,6 @@ static void usage(void)
                "v%s\n%s\n", __func__, VERSION, GENERAL_INFO);
 }
 
-static bool create_dir(const char *path)
-{
-       if (!xdiraccess(path)) {
-               if (errno != ENOENT)
-                       return FALSE;
-
-               if (mkdir(path, 0777) == -1)
-                       return FALSE;
-       }
-
-       return TRUE;
-}
-
 static bool setup_config(void)
 {
        size_t r, len;
@@ -4401,9 +4388,6 @@ int main(int argc, char *argv[])
        if (!set_tmp_path())
                return 1;
 
-       /* Get SSHFS mountpoint */
-       sshfsmnt = getenv("NNN_SSHFS_MNT_ROOT");
-
        /* Get the clipboard copier, if set */
        copier = getenv(env_cfg[NNN_COPIER]);