Peter Lemenkov a353eb
From d8bdebc639a84fa280153a466d4bb420fc9572bc Mon Sep 17 00:00:00 2001
Peter Lemenkov a353eb
From: Peter Lemenkov <lemenkov@gmail.com>
Peter Lemenkov a353eb
Date: Wed, 27 Oct 2010 16:29:45 +0400
Peter Lemenkov a353eb
Subject: [PATCH 3/3] Fix mounting FUSE fs into current working directory
Peter Lemenkov a353eb
Peter Lemenkov a353eb
See rhbz #622255 for bug description:
Peter Lemenkov a353eb
Peter Lemenkov a353eb
https://bugzilla.redhat.com/622255
Peter Lemenkov a353eb
Peter Lemenkov a353eb
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
Peter Lemenkov a353eb
---
Peter Lemenkov a353eb
 lib/mount_util.c |   75 +++++++++++++-----------------------------------------
Peter Lemenkov a353eb
 1 files changed, 18 insertions(+), 57 deletions(-)
Peter Lemenkov a353eb
Peter Lemenkov a353eb
diff --git a/lib/mount_util.c b/lib/mount_util.c
Peter Lemenkov a353eb
index 33e6697..b9a0895 100644
Peter Lemenkov a353eb
--- a/lib/mount_util.c
Peter Lemenkov a353eb
+++ b/lib/mount_util.c
Peter Lemenkov a353eb
@@ -54,8 +54,8 @@ static int mtab_needs_update(const char *mnt)
Peter Lemenkov a353eb
 	return 1;
Peter Lemenkov a353eb
 }
Peter Lemenkov a353eb
 
Peter Lemenkov a353eb
-static int add_mount_legacy(const char *progname, const char *fsname,
Peter Lemenkov a353eb
-			    const char *mnt, const char *type, const char *opts)
Peter Lemenkov a353eb
+static int add_mount(const char *progname, const char *fsname,
Peter Lemenkov a353eb
+		       const char *mnt, const char *type, const char *opts, int is_legacy)
Peter Lemenkov a353eb
 {
Peter Lemenkov a353eb
 	int res;
Peter Lemenkov a353eb
 	int status;
Peter Lemenkov a353eb
@@ -76,6 +76,14 @@ static int add_mount_legacy(const char *progname, const char *fsname,
Peter Lemenkov a353eb
 		goto out_restore;
Peter Lemenkov a353eb
 	}
Peter Lemenkov a353eb
 	if (res == 0) {
Peter Lemenkov a353eb
+		/*
Peter Lemenkov a353eb
+		 * Hide output, because old versions don't support
Peter Lemenkov a353eb
+		 * --no-canonicalize
Peter Lemenkov a353eb
+		 */
Peter Lemenkov a353eb
+		int fd = open("/dev/null", O_RDONLY);
Peter Lemenkov a353eb
+		dup2(fd, 1);
Peter Lemenkov a353eb
+		dup2(fd, 2);
Peter Lemenkov a353eb
+
Peter Lemenkov a353eb
 		char templ[] = "/tmp/fusermountXXXXXX";
Peter Lemenkov a353eb
 		char *tmp;
Peter Lemenkov a353eb
 
Peter Lemenkov a353eb
@@ -99,59 +107,12 @@ static int add_mount_legacy(const char *progname, const char *fsname,
Peter Lemenkov a353eb
 			exit(1);
Peter Lemenkov a353eb
 		}
Peter Lemenkov a353eb
 		rmdir(tmp);
Peter Lemenkov a353eb
-		execl("/bin/mount", "/bin/mount", "-i", "-f", "-t", type,
Peter Lemenkov a353eb
-		      "-o", opts, fsname, mnt, NULL);
Peter Lemenkov a353eb
-		fprintf(stderr, "%s: failed to execute /bin/mount: %s\n",
Peter Lemenkov a353eb
-			progname, strerror(errno));
Peter Lemenkov a353eb
-		exit(1);
Peter Lemenkov a353eb
-	}
Peter Lemenkov a353eb
-	res = waitpid(res, &status, 0);
Peter Lemenkov a353eb
-	if (res == -1)
Peter Lemenkov a353eb
-		fprintf(stderr, "%s: waitpid: %s\n", progname, strerror(errno));
Peter Lemenkov a353eb
-
Peter Lemenkov a353eb
-	if (status != 0)
Peter Lemenkov a353eb
-		res = -1;
Peter Lemenkov a353eb
-
Peter Lemenkov a353eb
- out_restore:
Peter Lemenkov a353eb
-	sigprocmask(SIG_SETMASK, &oldmask, NULL);
Peter Lemenkov a353eb
-
Peter Lemenkov a353eb
-	return res;
Peter Lemenkov a353eb
-}
Peter Lemenkov a353eb
-
Peter Lemenkov a353eb
-static int add_mount(const char *progname, const char *fsname,
Peter Lemenkov a353eb
-		       const char *mnt, const char *type, const char *opts)
Peter Lemenkov a353eb
-{
Peter Lemenkov a353eb
-	int res;
Peter Lemenkov a353eb
-	int status;
Peter Lemenkov a353eb
-	sigset_t blockmask;
Peter Lemenkov a353eb
-	sigset_t oldmask;
Peter Lemenkov a353eb
-
Peter Lemenkov a353eb
-	sigemptyset(&blockmask);
Peter Lemenkov a353eb
-	sigaddset(&blockmask, SIGCHLD);
Peter Lemenkov a353eb
-	res = sigprocmask(SIG_BLOCK, &blockmask, &oldmask);
Peter Lemenkov a353eb
-	if (res == -1) {
Peter Lemenkov a353eb
-		fprintf(stderr, "%s: sigprocmask: %s\n", progname, strerror(errno));
Peter Lemenkov a353eb
-		return -1;
Peter Lemenkov a353eb
-	}
Peter Lemenkov a353eb
-
Peter Lemenkov a353eb
-	res = fork();
Peter Lemenkov a353eb
-	if (res == -1) {
Peter Lemenkov a353eb
-		fprintf(stderr, "%s: fork: %s\n", progname, strerror(errno));
Peter Lemenkov a353eb
-		goto out_restore;
Peter Lemenkov a353eb
-	}
Peter Lemenkov a353eb
-	if (res == 0) {
Peter Lemenkov a353eb
-		/*
Peter Lemenkov a353eb
-		 * Hide output, because old versions don't support
Peter Lemenkov a353eb
-		 * --no-canonicalize
Peter Lemenkov a353eb
-		 */
Peter Lemenkov a353eb
-		int fd = open("/dev/null", O_RDONLY);
Peter Lemenkov a353eb
-		dup2(fd, 1);
Peter Lemenkov a353eb
-		dup2(fd, 2);
Peter Lemenkov a353eb
-
Peter Lemenkov a353eb
-		sigprocmask(SIG_SETMASK, &oldmask, NULL);
Peter Lemenkov a353eb
-		setuid(geteuid());
Peter Lemenkov a353eb
-		execl("/bin/mount", "/bin/mount", "--no-canonicalize", "-i",
Peter Lemenkov a353eb
-		      "-f", "-t", type, "-o", opts, fsname, mnt, NULL);
Peter Lemenkov a353eb
+		if(is_legacy)
Peter Lemenkov a353eb
+			execl("/bin/mount", "/bin/mount", "-i",
Peter Lemenkov a353eb
+					"-f", "-t", type, "-o", opts, fsname, mnt, NULL);
Peter Lemenkov a353eb
+		else
Peter Lemenkov a353eb
+			execl("/bin/mount", "/bin/mount", "--no-canonicalize", "-i",
Peter Lemenkov a353eb
+					"-f", "-t", type, "-o", opts, fsname, mnt, NULL);
Peter Lemenkov a353eb
 		fprintf(stderr, "%s: failed to execute /bin/mount: %s\n",
Peter Lemenkov a353eb
 			progname, strerror(errno));
Peter Lemenkov a353eb
 		exit(1);
Peter Lemenkov a353eb
@@ -177,9 +138,9 @@ int fuse_mnt_add_mount(const char *progname, const char *fsname,
Peter Lemenkov a353eb
 	if (!mtab_needs_update(mnt))
Peter Lemenkov a353eb
 		return 0;
Peter Lemenkov a353eb
 
Peter Lemenkov a353eb
-	res = add_mount(progname, fsname, mnt, type, opts);
Peter Lemenkov a353eb
+	res = add_mount(progname, fsname, mnt, type, opts, 0);
Peter Lemenkov a353eb
 	if (res == -1)
Peter Lemenkov a353eb
-		res = add_mount_legacy(progname, fsname, mnt, type, opts);
Peter Lemenkov a353eb
+		res = add_mount(progname, fsname, mnt, type, opts, 1);
Peter Lemenkov a353eb
 
Peter Lemenkov a353eb
 	return res;
Peter Lemenkov a353eb
 }
Peter Lemenkov a353eb
-- 
Peter Lemenkov a353eb
1.7.3.1
Peter Lemenkov a353eb