mirror of
https://github.com/feather-wallet/feather.git
synced 2024-12-23 03:59:29 +00:00
140 lines
4 KiB
Diff
140 lines
4 KiB
Diff
|
diff --git a/lib/mount.c b/lib/mount.c
|
||
|
index d71e6fc..e9c2ff0 100644
|
||
|
--- a/lib/mount.c
|
||
|
+++ b/lib/mount.c
|
||
|
@@ -41,7 +41,6 @@
|
||
|
#define umount2(mnt, flags) unmount(mnt, (flags == 2) ? MNT_FORCE : 0)
|
||
|
#endif
|
||
|
|
||
|
-#define FUSERMOUNT_PROG "fusermount3"
|
||
|
#define FUSE_COMMFD_ENV "_FUSE_COMMFD"
|
||
|
|
||
|
#ifndef HAVE_FORK
|
||
|
@@ -117,17 +116,87 @@ static const struct fuse_opt fuse_mount_opts[] = {
|
||
|
FUSE_OPT_END
|
||
|
};
|
||
|
|
||
|
+int fileExists(const char* path);
|
||
|
+char* findBinaryInFusermountDir(const char* binaryName);
|
||
|
+
|
||
|
+int fileExists(const char* path) {
|
||
|
+ FILE* file = fopen(path, "r");
|
||
|
+ if (file) {
|
||
|
+ fclose(file);
|
||
|
+ return 1;
|
||
|
+ }
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+char* findBinaryInFusermountDir(const char* binaryName) {
|
||
|
+ // For security reasons, we do not search the binary on the $PATH;
|
||
|
+ // instead, we check if the binary exists in FUSERMOUNT_DIR
|
||
|
+ // as defined in meson.build
|
||
|
+ char* binaryPath = malloc(strlen(FUSERMOUNT_DIR) + strlen(binaryName) + 2);
|
||
|
+ strcpy(binaryPath, FUSERMOUNT_DIR);
|
||
|
+ strcat(binaryPath, "/");
|
||
|
+ strcat(binaryPath, binaryName);
|
||
|
+ if (fileExists(binaryPath)) {
|
||
|
+ return binaryPath;
|
||
|
+ }
|
||
|
+
|
||
|
+ // Debian, Ubuntu
|
||
|
+ char* binaryPath2 = malloc(strlen(binaryName) + 6);
|
||
|
+ strcat(binaryPath2, "/bin/");
|
||
|
+ strcat(binaryPath2, binaryName);
|
||
|
+ if (fileExists(binaryPath2)) {
|
||
|
+ return binaryPath2;
|
||
|
+ }
|
||
|
+
|
||
|
+ // If the binary does not exist in FUSERMOUNT_DIR, return NULL
|
||
|
+ return NULL;
|
||
|
+}
|
||
|
+
|
||
|
+static const char *fuse_mount_prog(void)
|
||
|
+{
|
||
|
+ // Check if the FUSERMOUNT_PROG environment variable is set and if so, use it
|
||
|
+ const char *prog = getenv("FUSERMOUNT_PROG");
|
||
|
+ if (prog) {
|
||
|
+ if (access(prog, X_OK) == 0)
|
||
|
+ return prog;
|
||
|
+ }
|
||
|
+
|
||
|
+ // Check if there is a binary "fusermount3"
|
||
|
+ prog = findBinaryInFusermountDir("fusermount3");
|
||
|
+ if (access(prog, X_OK) == 0)
|
||
|
+ return prog;
|
||
|
+
|
||
|
+ // Check if there is a binary called "fusermount"
|
||
|
+ // This is known to work for our purposes
|
||
|
+ prog = findBinaryInFusermountDir("fusermount");
|
||
|
+ if (access(prog, X_OK) == 0)
|
||
|
+ return prog;
|
||
|
+
|
||
|
+ // For i = 4...99, check if there is a binary called "fusermount" + i
|
||
|
+ // It is not yet known whether this will work for our purposes, but it is better than not even attempting
|
||
|
+ for (int i = 4; i < 100; i++) {
|
||
|
+ prog = findBinaryInFusermountDir("fusermount" + i);
|
||
|
+ if (access(prog, X_OK) == 0)
|
||
|
+ return prog;
|
||
|
+ }
|
||
|
+
|
||
|
+ // If all else fails, return NULL
|
||
|
+ return NULL;
|
||
|
+}
|
||
|
+
|
||
|
static void exec_fusermount(const char *argv[])
|
||
|
{
|
||
|
- execv(FUSERMOUNT_DIR "/" FUSERMOUNT_PROG, (char **) argv);
|
||
|
- execvp(FUSERMOUNT_PROG, (char **) argv);
|
||
|
+ const char *fusermount_prog = fuse_mount_prog();
|
||
|
+ if (fusermount_prog) {
|
||
|
+ execv(fusermount_prog, (char **) argv);
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
void fuse_mount_version(void)
|
||
|
{
|
||
|
int pid = fork();
|
||
|
if (!pid) {
|
||
|
- const char *argv[] = { FUSERMOUNT_PROG, "--version", NULL };
|
||
|
+ const char *argv[] = { fuse_mount_prog(), "--version", NULL };
|
||
|
exec_fusermount(argv);
|
||
|
_exit(1);
|
||
|
} else if (pid != -1)
|
||
|
@@ -300,7 +369,7 @@ void fuse_kern_unmount(const char *mountpoint, int fd)
|
||
|
return;
|
||
|
|
||
|
if(pid == 0) {
|
||
|
- const char *argv[] = { FUSERMOUNT_PROG, "-u", "-q", "-z",
|
||
|
+ const char *argv[] = { fuse_mount_prog(), "-u", "-q", "-z",
|
||
|
"--", mountpoint, NULL };
|
||
|
|
||
|
exec_fusermount(argv);
|
||
|
@@ -346,7 +415,7 @@ static int setup_auto_unmount(const char *mountpoint, int quiet)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- argv[a++] = FUSERMOUNT_PROG;
|
||
|
+ argv[a++] = fuse_mount_prog();
|
||
|
argv[a++] = "--auto-unmount";
|
||
|
argv[a++] = "--";
|
||
|
argv[a++] = mountpoint;
|
||
|
@@ -407,7 +476,7 @@ static int fuse_mount_fusermount(const char *mountpoint, struct mount_opts *mo,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- argv[a++] = FUSERMOUNT_PROG;
|
||
|
+ argv[a++] = fuse_mount_prog();
|
||
|
if (opts) {
|
||
|
argv[a++] = "-o";
|
||
|
argv[a++] = opts;
|
||
|
@@ -421,7 +490,7 @@ static int fuse_mount_fusermount(const char *mountpoint, struct mount_opts *mo,
|
||
|
snprintf(env, sizeof(env), "%i", fds[0]);
|
||
|
setenv(FUSE_COMMFD_ENV, env, 1);
|
||
|
exec_fusermount(argv);
|
||
|
- perror("fuse: failed to exec fusermount3");
|
||
|
+ perror("fuse: failed to exec fusermount");
|
||
|
_exit(1);
|
||
|
}
|
||
|
|