unmount() ask for target if not found (#358)

* unmount() ask for target if not found

unmount() now properly asks for which target to unmount if it cannot
automatically deduce which folder to unmount.

* no more automatic unmounts outside of cfgdir
This commit is contained in:
0xACE 2019-10-13 17:23:32 +02:00 committed by Mischievous Meerkat
parent 06ff2c55da
commit ab0fe6c408

View file

@ -2898,12 +2898,14 @@ static bool sshfs_mount(char *newpath, int *presel)
* Unmounts if the directory represented by name is a mount point. * Unmounts if the directory represented by name is a mount point.
* Otherwise, asks for hostname * Otherwise, asks for hostname
*/ */
static bool unmount(char *name, char *newpath, int *presel) static bool unmount(char *name, char *newpath, int *presel, char *currentpath)
{ {
static char cmd[] = "fusermount3"; /* Arch Linux utility */ static char cmd[] = "fusermount3"; /* Arch Linux utility */
static bool found = FALSE; static bool found = FALSE;
char *tmp = name; char *tmp = name;
struct stat sb, psb; struct stat sb, psb;
bool child = false;
bool parent = false;
/* On Ubuntu it's fusermount */ /* On Ubuntu it's fusermount */
if (!found && !getutil(cmd)) { if (!found && !getutil(cmd)) {
@ -2911,15 +2913,17 @@ static bool unmount(char *name, char *newpath, int *presel)
found = TRUE; found = TRUE;
} }
if (tmp) { if (tmp && strcmp(cfgdir, currentpath) == 0) {
mkpath(cfgdir, tmp, newpath); mkpath(cfgdir, tmp, newpath);
if ((lstat(newpath, &sb) == -1) || (lstat(dirname(newpath), &psb) == -1)) { child = lstat(newpath, &sb) != -1;
parent = lstat(dirname(newpath), &psb) != -1;
if (!child && !parent) {
*presel = MSGWAIT; *presel = MSGWAIT;
return FALSE; return FALSE;
} }
} }
if (!tmp || (sb.st_dev == psb.st_dev)) { if (!tmp || !child || !S_ISDIR(sb.st_mode) || (child && parent && sb.st_dev == psb.st_dev)) {
tmp = xreadline(NULL, "host: "); tmp = xreadline(NULL, "host: ");
if (!tmp[0]) if (!tmp[0])
return FALSE; return FALSE;
@ -4679,7 +4683,7 @@ nochange:
goto begin; goto begin;
case SEL_UMOUNT: case SEL_UMOUNT:
tmp = ndents ? dents[cur].name : NULL; tmp = ndents ? dents[cur].name : NULL;
unmount(tmp, newpath, &presel); unmount(tmp, newpath, &presel, path);
goto nochange; goto nochange;
case SEL_QUITCD: // fallthrough case SEL_QUITCD: // fallthrough
case SEL_QUIT: case SEL_QUIT: