From d2865de329765feff4ed5f66d7ce4b06a2fd3663 Mon Sep 17 00:00:00 2001
From: Arun Prakash Jana <engineerarun@gmail.com>
Date: Sun, 21 Apr 2019 11:55:00 +0530
Subject: [PATCH] Refactor SSHFS code

---
 .clang-tidy |   2 -
 src/nnn.c   | 126 ++++++++++++++++++++++++++++++----------------------
 2 files changed, 72 insertions(+), 56 deletions(-)

diff --git a/.clang-tidy b/.clang-tidy
index 885adc7c..c03204c9 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -10,6 +10,4 @@ CheckOptions:
     value:           '_t'
   - key:             fuchsia-restrict-system-includes.Includes
     value:           '*,-stdint.h,-stdbool.h'
-  - key:             readability-function-size.StatementThreshold
-    value:           '850'
 ...
diff --git a/src/nnn.c b/src/nnn.c
index 2fa9cf39..1b2f794d 100644
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -2347,6 +2347,73 @@ static bool handle_archive(char *fpath, char *arg, const char *dir)
 	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: ");
+	if (!tmp[0])
+		return FALSE;
+
+	/* Create the mount point */
+	mkpath(sshfsmnt, tmp, newpath);
+	r = mkdir(newpath, 0777);
+	if (r == -1 && errno != EEXIST) {
+		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;
+	}
+
+	/* Convert "Host" to "Host:" */
+	r = strlen(tmp);
+	tmp[r] = ':';
+	tmp[r + 1] = '\0';
+
+	/* Connect to remote */
+	spawn("sshfs", tmp, newpath, NULL, F_NORMAL);
+
+	return TRUE;
+}
+
+static bool sshfs_unmount(char *path, char *fname, char *newpath, int *presel)
+{
+	static char cmd[] = "fusermount3"; /* Arch Linux utility */
+	static bool found = FALSE;
+
+	/* On Ubuntu it's fusermount */
+	if (!found && !getutil(cmd))
+		cmd[10] = '\0';
+
+	if (!ndents)
+		return FALSE;
+
+	mkpath(path, dents[cur].name, newpath);
+	if (!xdiraccess(newpath)) {
+		*presel = MSGWAIT;
+		return FALSE;
+	}
+
+	spawn(cmd, "-u", newpath, NULL, F_NORMAL);
+
+	return TRUE;
+}
+
 /*
  * The help string tokens (each line) start with a HEX value
  * which indicates the number of spaces to print before the
@@ -3873,61 +3940,12 @@ nochange:
 			/* Repopulate as directory content may have changed */
 			goto begin;
 		case SEL_SSHFS:
-			if (!sshfsmnt) {
-				printwait("set NNN_SSHFS_MNT_ROOT", &presel);
-				goto nochange;
-			}
-
-			tmp = xreadline(NULL, "Host: ");
-			if (!tmp[0])
-				goto nochange;
-
-			/* Create the mount point */
-			mkpath(sshfsmnt, tmp, newpath);
-			r = mkdir(newpath, 0777);
-			if (r == -1 && errno != EEXIST) {
-				printwait(strerror(errno), &presel);
-				goto nochange;
-			}
-
-			/* Check if directory can be accessed */
-			if (!xdiraccess(newpath)) {
-				presel = MSGWAIT;
-				goto nochange;
-			}
-
-			if (!getutil("sshfs")) {
-				printwait("sshfs missing", &presel);
-				goto nochange;
-			}
-
-			/* Convert "Host" to "Host:" */
-			r = strlen(tmp);
-			tmp[r] = ':';
-			tmp[r + 1] = '\0';
-
-			/* Connect to remote */
-			spawn("sshfs", tmp, newpath, NULL, F_NORMAL); // fallthrough
+			if (!sshfs_mount(path, newpath, &presel))
+				goto nochange; // fallthrough
 		case SEL_UMOUNT:
-			if (sel == SEL_UMOUNT) {
-				static char cmd[] = "fusermount3"; /* Arch Linux utility */
-				static bool found = FALSE;
-
-				/* On Ubuntu it's fusermount */
-				if (!found && !getutil(cmd))
-					cmd[10] = '\0';
-
-				if (!ndents)
-					goto nochange;
-
-				mkpath(path, dents[cur].name, newpath);
-				if (!xdiraccess(newpath)) {
-					presel = MSGWAIT;
-					goto nochange;
-				}
-
-				spawn(cmd, "-u", newpath, NULL, F_NORMAL);
-			}
+			if (sel == SEL_UMOUNT
+			    && !sshfs_unmount(path, dents[cur].name, newpath, &presel))
+				goto nochange;
 
 			lastname[0] = '\0';
 
-- 
2.51.0