From 99b1b1f48911b766d71b739de526b329b2e5faff Mon Sep 17 00:00:00 2001 From: Arun Prakash Jana Date: Mon, 22 Apr 2019 02:14:43 +0530 Subject: [PATCH] SSHFS refinements --- README.md | 14 +++------- nnn.1 | 5 ---- src/nnn.c | 82 ++++++++++++++++++++++--------------------------------- 3 files changed, 37 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 42dcc47c..00467828 100644 --- 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 , not or l | @@ -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 -. -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 -. +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 43a8fa45..95400b66 100644 --- 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 diff --git a/src/nnn.c b/src/nnn.c index 88a82e12..2e49fb48 100644 --- 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]);