xref: /aosp_15_r20/external/libfuse/lib/mount_bsd.c (revision 9e5649576b786774a32d7b0252c9cd8c6538fa49)
1*9e564957SAndroid Build Coastguard Worker /*
2*9e564957SAndroid Build Coastguard Worker   FUSE: Filesystem in Userspace
3*9e564957SAndroid Build Coastguard Worker   Copyright (C) 2005-2008 Csaba Henk <[email protected]>
4*9e564957SAndroid Build Coastguard Worker 
5*9e564957SAndroid Build Coastguard Worker   Architecture specific file system mounting (FreeBSD).
6*9e564957SAndroid Build Coastguard Worker 
7*9e564957SAndroid Build Coastguard Worker   This program can be distributed under the terms of the GNU LGPLv2.
8*9e564957SAndroid Build Coastguard Worker   See the file COPYING.LIB.
9*9e564957SAndroid Build Coastguard Worker */
10*9e564957SAndroid Build Coastguard Worker 
11*9e564957SAndroid Build Coastguard Worker #include "fuse_config.h"
12*9e564957SAndroid Build Coastguard Worker #include "fuse_i.h"
13*9e564957SAndroid Build Coastguard Worker #include "fuse_misc.h"
14*9e564957SAndroid Build Coastguard Worker #include "fuse_opt.h"
15*9e564957SAndroid Build Coastguard Worker 
16*9e564957SAndroid Build Coastguard Worker #include <sys/param.h>
17*9e564957SAndroid Build Coastguard Worker #include "fuse_mount_compat.h"
18*9e564957SAndroid Build Coastguard Worker 
19*9e564957SAndroid Build Coastguard Worker #include <sys/stat.h>
20*9e564957SAndroid Build Coastguard Worker #include <sys/wait.h>
21*9e564957SAndroid Build Coastguard Worker #include <sys/sysctl.h>
22*9e564957SAndroid Build Coastguard Worker #include <sys/user.h>
23*9e564957SAndroid Build Coastguard Worker #include <stdio.h>
24*9e564957SAndroid Build Coastguard Worker #include <stdlib.h>
25*9e564957SAndroid Build Coastguard Worker #include <unistd.h>
26*9e564957SAndroid Build Coastguard Worker #include <stddef.h>
27*9e564957SAndroid Build Coastguard Worker #include <fcntl.h>
28*9e564957SAndroid Build Coastguard Worker #include <errno.h>
29*9e564957SAndroid Build Coastguard Worker #include <string.h>
30*9e564957SAndroid Build Coastguard Worker #include <paths.h>
31*9e564957SAndroid Build Coastguard Worker #include <limits.h>
32*9e564957SAndroid Build Coastguard Worker 
33*9e564957SAndroid Build Coastguard Worker #define FUSERMOUNT_PROG		"mount_fusefs"
34*9e564957SAndroid Build Coastguard Worker #define FUSE_DEV_TRUNK		"/dev/fuse"
35*9e564957SAndroid Build Coastguard Worker 
36*9e564957SAndroid Build Coastguard Worker enum {
37*9e564957SAndroid Build Coastguard Worker 	KEY_RO,
38*9e564957SAndroid Build Coastguard Worker 	KEY_KERN
39*9e564957SAndroid Build Coastguard Worker };
40*9e564957SAndroid Build Coastguard Worker 
41*9e564957SAndroid Build Coastguard Worker struct mount_opts {
42*9e564957SAndroid Build Coastguard Worker 	int allow_other;
43*9e564957SAndroid Build Coastguard Worker 	char *kernel_opts;
44*9e564957SAndroid Build Coastguard Worker 	unsigned max_read;
45*9e564957SAndroid Build Coastguard Worker };
46*9e564957SAndroid Build Coastguard Worker 
47*9e564957SAndroid Build Coastguard Worker #define FUSE_DUAL_OPT_KEY(templ, key)				\
48*9e564957SAndroid Build Coastguard Worker 	FUSE_OPT_KEY(templ, key), FUSE_OPT_KEY("no" templ, key)
49*9e564957SAndroid Build Coastguard Worker 
50*9e564957SAndroid Build Coastguard Worker static const struct fuse_opt fuse_mount_opts[] = {
51*9e564957SAndroid Build Coastguard Worker 	{ "allow_other", offsetof(struct mount_opts, allow_other), 1 },
52*9e564957SAndroid Build Coastguard Worker 	{ "max_read=%u", offsetof(struct mount_opts, max_read), 1 },
53*9e564957SAndroid Build Coastguard Worker 	FUSE_OPT_KEY("-r",			KEY_RO),
54*9e564957SAndroid Build Coastguard Worker 	/* standard FreeBSD mount options */
55*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("dev",		KEY_KERN),
56*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("async",		KEY_KERN),
57*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("atime",		KEY_KERN),
58*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("dev",		KEY_KERN),
59*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("exec",		KEY_KERN),
60*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("suid",		KEY_KERN),
61*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("symfollow",		KEY_KERN),
62*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("rdonly",		KEY_KERN),
63*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("sync",		KEY_KERN),
64*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("union",		KEY_KERN),
65*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("userquota",		KEY_KERN),
66*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("groupquota",		KEY_KERN),
67*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("clusterr",		KEY_KERN),
68*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("clusterw",		KEY_KERN),
69*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("suiddir",		KEY_KERN),
70*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("snapshot",		KEY_KERN),
71*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("multilabel",		KEY_KERN),
72*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("acls",		KEY_KERN),
73*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("force",		KEY_KERN),
74*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("update",		KEY_KERN),
75*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("ro",			KEY_KERN),
76*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("rw",			KEY_KERN),
77*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("auto",		KEY_KERN),
78*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("automounted",	KEY_KERN),
79*9e564957SAndroid Build Coastguard Worker 	/* options supported under both Linux and FBSD */
80*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("allow_other",	KEY_KERN),
81*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("default_permissions",KEY_KERN),
82*9e564957SAndroid Build Coastguard Worker 	FUSE_OPT_KEY("max_read=",		KEY_KERN),
83*9e564957SAndroid Build Coastguard Worker 	FUSE_OPT_KEY("subtype=",		KEY_KERN),
84*9e564957SAndroid Build Coastguard Worker 	/* FBSD FUSE specific mount options */
85*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("private",		KEY_KERN),
86*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("neglect_shares",	KEY_KERN),
87*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("push_symlinks_in",	KEY_KERN),
88*9e564957SAndroid Build Coastguard Worker 	FUSE_OPT_KEY("nosync_unmount",		KEY_KERN),
89*9e564957SAndroid Build Coastguard Worker #if __FreeBSD_version >= 1200519
90*9e564957SAndroid Build Coastguard Worker 	FUSE_DUAL_OPT_KEY("intr",		KEY_KERN),
91*9e564957SAndroid Build Coastguard Worker #endif
92*9e564957SAndroid Build Coastguard Worker 	/* stock FBSD mountopt parsing routine lets anything be negated... */
93*9e564957SAndroid Build Coastguard Worker 	/*
94*9e564957SAndroid Build Coastguard Worker 	 * Linux specific mount options, but let just the mount util
95*9e564957SAndroid Build Coastguard Worker 	 * handle them
96*9e564957SAndroid Build Coastguard Worker 	 */
97*9e564957SAndroid Build Coastguard Worker 	FUSE_OPT_KEY("fsname=",			KEY_KERN),
98*9e564957SAndroid Build Coastguard Worker 	FUSE_OPT_END
99*9e564957SAndroid Build Coastguard Worker };
100*9e564957SAndroid Build Coastguard Worker 
fuse_mount_version(void)101*9e564957SAndroid Build Coastguard Worker void fuse_mount_version(void)
102*9e564957SAndroid Build Coastguard Worker {
103*9e564957SAndroid Build Coastguard Worker 	system(FUSERMOUNT_PROG " --version");
104*9e564957SAndroid Build Coastguard Worker }
105*9e564957SAndroid Build Coastguard Worker 
get_max_read(struct mount_opts * o)106*9e564957SAndroid Build Coastguard Worker unsigned get_max_read(struct mount_opts *o)
107*9e564957SAndroid Build Coastguard Worker {
108*9e564957SAndroid Build Coastguard Worker 	return o->max_read;
109*9e564957SAndroid Build Coastguard Worker }
110*9e564957SAndroid Build Coastguard Worker 
fuse_mount_opt_proc(void * data,const char * arg,int key,struct fuse_args * outargs)111*9e564957SAndroid Build Coastguard Worker static int fuse_mount_opt_proc(void *data, const char *arg, int key,
112*9e564957SAndroid Build Coastguard Worker 			       struct fuse_args *outargs)
113*9e564957SAndroid Build Coastguard Worker {
114*9e564957SAndroid Build Coastguard Worker 	(void) outargs;
115*9e564957SAndroid Build Coastguard Worker 	struct mount_opts *mo = data;
116*9e564957SAndroid Build Coastguard Worker 
117*9e564957SAndroid Build Coastguard Worker 	switch (key) {
118*9e564957SAndroid Build Coastguard Worker 	case KEY_RO:
119*9e564957SAndroid Build Coastguard Worker 		arg = "ro";
120*9e564957SAndroid Build Coastguard Worker 		/* fall through */
121*9e564957SAndroid Build Coastguard Worker 
122*9e564957SAndroid Build Coastguard Worker 	case KEY_KERN:
123*9e564957SAndroid Build Coastguard Worker 		return fuse_opt_add_opt(&mo->kernel_opts, arg);
124*9e564957SAndroid Build Coastguard Worker 	}
125*9e564957SAndroid Build Coastguard Worker 
126*9e564957SAndroid Build Coastguard Worker 	/* Pass through unknown options */
127*9e564957SAndroid Build Coastguard Worker 	return 1;
128*9e564957SAndroid Build Coastguard Worker }
129*9e564957SAndroid Build Coastguard Worker 
fuse_kern_unmount(const char * mountpoint,int fd)130*9e564957SAndroid Build Coastguard Worker void fuse_kern_unmount(const char *mountpoint, int fd)
131*9e564957SAndroid Build Coastguard Worker {
132*9e564957SAndroid Build Coastguard Worker 	close(fd);
133*9e564957SAndroid Build Coastguard Worker 	unmount(mountpoint, MNT_FORCE);
134*9e564957SAndroid Build Coastguard Worker }
135*9e564957SAndroid Build Coastguard Worker 
136*9e564957SAndroid Build Coastguard Worker /* Check if kernel is doing init in background */
init_backgrounded(void)137*9e564957SAndroid Build Coastguard Worker static int init_backgrounded(void)
138*9e564957SAndroid Build Coastguard Worker {
139*9e564957SAndroid Build Coastguard Worker 	unsigned ibg;
140*9e564957SAndroid Build Coastguard Worker 	size_t len;
141*9e564957SAndroid Build Coastguard Worker 
142*9e564957SAndroid Build Coastguard Worker 	len = sizeof(ibg);
143*9e564957SAndroid Build Coastguard Worker 
144*9e564957SAndroid Build Coastguard Worker 	if (sysctlbyname("vfs.fuse.init_backgrounded", &ibg, &len, NULL, 0))
145*9e564957SAndroid Build Coastguard Worker 		return 0;
146*9e564957SAndroid Build Coastguard Worker 
147*9e564957SAndroid Build Coastguard Worker 	return ibg;
148*9e564957SAndroid Build Coastguard Worker }
149*9e564957SAndroid Build Coastguard Worker 
150*9e564957SAndroid Build Coastguard Worker 
fuse_mount_core(const char * mountpoint,const char * opts)151*9e564957SAndroid Build Coastguard Worker static int fuse_mount_core(const char *mountpoint, const char *opts)
152*9e564957SAndroid Build Coastguard Worker {
153*9e564957SAndroid Build Coastguard Worker 	const char *mountprog = FUSERMOUNT_PROG;
154*9e564957SAndroid Build Coastguard Worker 	int fd;
155*9e564957SAndroid Build Coastguard Worker 	char *fdnam, *dev;
156*9e564957SAndroid Build Coastguard Worker 	pid_t pid, cpid;
157*9e564957SAndroid Build Coastguard Worker 	int status;
158*9e564957SAndroid Build Coastguard Worker 
159*9e564957SAndroid Build Coastguard Worker 	fdnam = getenv("FUSE_DEV_FD");
160*9e564957SAndroid Build Coastguard Worker 
161*9e564957SAndroid Build Coastguard Worker 	if (fdnam) {
162*9e564957SAndroid Build Coastguard Worker 		char *ep;
163*9e564957SAndroid Build Coastguard Worker 
164*9e564957SAndroid Build Coastguard Worker 		fd = strtol(fdnam, &ep, 10);
165*9e564957SAndroid Build Coastguard Worker 
166*9e564957SAndroid Build Coastguard Worker 		if (*ep != '\0') {
167*9e564957SAndroid Build Coastguard Worker 			fuse_log(FUSE_LOG_ERR, "invalid value given in FUSE_DEV_FD\n");
168*9e564957SAndroid Build Coastguard Worker 			return -1;
169*9e564957SAndroid Build Coastguard Worker 		}
170*9e564957SAndroid Build Coastguard Worker 
171*9e564957SAndroid Build Coastguard Worker 		if (fd < 0)
172*9e564957SAndroid Build Coastguard Worker 			return -1;
173*9e564957SAndroid Build Coastguard Worker 
174*9e564957SAndroid Build Coastguard Worker 		goto mount;
175*9e564957SAndroid Build Coastguard Worker 	}
176*9e564957SAndroid Build Coastguard Worker 
177*9e564957SAndroid Build Coastguard Worker 	dev = getenv("FUSE_DEV_NAME");
178*9e564957SAndroid Build Coastguard Worker 
179*9e564957SAndroid Build Coastguard Worker 	if (! dev)
180*9e564957SAndroid Build Coastguard Worker 		dev = (char *)FUSE_DEV_TRUNK;
181*9e564957SAndroid Build Coastguard Worker 
182*9e564957SAndroid Build Coastguard Worker 	if ((fd = open(dev, O_RDWR)) < 0) {
183*9e564957SAndroid Build Coastguard Worker 		perror("fuse: failed to open fuse device");
184*9e564957SAndroid Build Coastguard Worker 		return -1;
185*9e564957SAndroid Build Coastguard Worker 	}
186*9e564957SAndroid Build Coastguard Worker 
187*9e564957SAndroid Build Coastguard Worker mount:
188*9e564957SAndroid Build Coastguard Worker 	if (getenv("FUSE_NO_MOUNT") || ! mountpoint)
189*9e564957SAndroid Build Coastguard Worker 		goto out;
190*9e564957SAndroid Build Coastguard Worker 
191*9e564957SAndroid Build Coastguard Worker 	pid = fork();
192*9e564957SAndroid Build Coastguard Worker 	cpid = pid;
193*9e564957SAndroid Build Coastguard Worker 
194*9e564957SAndroid Build Coastguard Worker 	if (pid == -1) {
195*9e564957SAndroid Build Coastguard Worker 		perror("fuse: fork() failed");
196*9e564957SAndroid Build Coastguard Worker 		close(fd);
197*9e564957SAndroid Build Coastguard Worker 		return -1;
198*9e564957SAndroid Build Coastguard Worker 	}
199*9e564957SAndroid Build Coastguard Worker 
200*9e564957SAndroid Build Coastguard Worker 	if (pid == 0) {
201*9e564957SAndroid Build Coastguard Worker 		if (! init_backgrounded()) {
202*9e564957SAndroid Build Coastguard Worker 			/*
203*9e564957SAndroid Build Coastguard Worker 			 * If init is not backgrounded, we have to
204*9e564957SAndroid Build Coastguard Worker 			 * call the mount util backgrounded, to avoid
205*9e564957SAndroid Build Coastguard Worker 			 * deadlock.
206*9e564957SAndroid Build Coastguard Worker 			 */
207*9e564957SAndroid Build Coastguard Worker 
208*9e564957SAndroid Build Coastguard Worker 			pid = fork();
209*9e564957SAndroid Build Coastguard Worker 
210*9e564957SAndroid Build Coastguard Worker 			if (pid == -1) {
211*9e564957SAndroid Build Coastguard Worker 				perror("fuse: fork() failed");
212*9e564957SAndroid Build Coastguard Worker 				close(fd);
213*9e564957SAndroid Build Coastguard Worker 				exit(1);
214*9e564957SAndroid Build Coastguard Worker 			}
215*9e564957SAndroid Build Coastguard Worker 		}
216*9e564957SAndroid Build Coastguard Worker 
217*9e564957SAndroid Build Coastguard Worker 		if (pid == 0) {
218*9e564957SAndroid Build Coastguard Worker 			const char *argv[32];
219*9e564957SAndroid Build Coastguard Worker 			int a = 0;
220*9e564957SAndroid Build Coastguard Worker 			int ret = -1;
221*9e564957SAndroid Build Coastguard Worker 
222*9e564957SAndroid Build Coastguard Worker 			if (! fdnam)
223*9e564957SAndroid Build Coastguard Worker 			{
224*9e564957SAndroid Build Coastguard Worker 				ret = asprintf(&fdnam, "%d", fd);
225*9e564957SAndroid Build Coastguard Worker 				if(ret == -1)
226*9e564957SAndroid Build Coastguard Worker 				{
227*9e564957SAndroid Build Coastguard Worker 					perror("fuse: failed to assemble mount arguments");
228*9e564957SAndroid Build Coastguard Worker 					close(fd);
229*9e564957SAndroid Build Coastguard Worker 					exit(1);
230*9e564957SAndroid Build Coastguard Worker 				}
231*9e564957SAndroid Build Coastguard Worker 			}
232*9e564957SAndroid Build Coastguard Worker 
233*9e564957SAndroid Build Coastguard Worker 			argv[a++] = mountprog;
234*9e564957SAndroid Build Coastguard Worker 			if (opts) {
235*9e564957SAndroid Build Coastguard Worker 				argv[a++] = "-o";
236*9e564957SAndroid Build Coastguard Worker 				argv[a++] = opts;
237*9e564957SAndroid Build Coastguard Worker 			}
238*9e564957SAndroid Build Coastguard Worker 			argv[a++] = fdnam;
239*9e564957SAndroid Build Coastguard Worker 			argv[a++] = mountpoint;
240*9e564957SAndroid Build Coastguard Worker 			argv[a++] = NULL;
241*9e564957SAndroid Build Coastguard Worker 			execvp(mountprog, (char **) argv);
242*9e564957SAndroid Build Coastguard Worker 			perror("fuse: failed to exec mount program");
243*9e564957SAndroid Build Coastguard Worker 			free(fdnam);
244*9e564957SAndroid Build Coastguard Worker 			exit(1);
245*9e564957SAndroid Build Coastguard Worker 		}
246*9e564957SAndroid Build Coastguard Worker 
247*9e564957SAndroid Build Coastguard Worker 		exit(0);
248*9e564957SAndroid Build Coastguard Worker 	}
249*9e564957SAndroid Build Coastguard Worker 
250*9e564957SAndroid Build Coastguard Worker 	if (waitpid(cpid, &status, 0) == -1 || WEXITSTATUS(status) != 0) {
251*9e564957SAndroid Build Coastguard Worker 		perror("fuse: failed to mount file system");
252*9e564957SAndroid Build Coastguard Worker 		close(fd);
253*9e564957SAndroid Build Coastguard Worker 		return -1;
254*9e564957SAndroid Build Coastguard Worker 	}
255*9e564957SAndroid Build Coastguard Worker 
256*9e564957SAndroid Build Coastguard Worker out:
257*9e564957SAndroid Build Coastguard Worker 	return fd;
258*9e564957SAndroid Build Coastguard Worker }
259*9e564957SAndroid Build Coastguard Worker 
parse_mount_opts(struct fuse_args * args)260*9e564957SAndroid Build Coastguard Worker struct mount_opts *parse_mount_opts(struct fuse_args *args)
261*9e564957SAndroid Build Coastguard Worker {
262*9e564957SAndroid Build Coastguard Worker 	struct mount_opts *mo;
263*9e564957SAndroid Build Coastguard Worker 
264*9e564957SAndroid Build Coastguard Worker 	mo = (struct mount_opts*) malloc(sizeof(struct mount_opts));
265*9e564957SAndroid Build Coastguard Worker 	if (mo == NULL)
266*9e564957SAndroid Build Coastguard Worker 		return NULL;
267*9e564957SAndroid Build Coastguard Worker 
268*9e564957SAndroid Build Coastguard Worker 	memset(mo, 0, sizeof(struct mount_opts));
269*9e564957SAndroid Build Coastguard Worker 
270*9e564957SAndroid Build Coastguard Worker 	if (args &&
271*9e564957SAndroid Build Coastguard Worker 	    fuse_opt_parse(args, mo, fuse_mount_opts, fuse_mount_opt_proc) == -1)
272*9e564957SAndroid Build Coastguard Worker 		goto err_out;
273*9e564957SAndroid Build Coastguard Worker 
274*9e564957SAndroid Build Coastguard Worker 	return mo;
275*9e564957SAndroid Build Coastguard Worker 
276*9e564957SAndroid Build Coastguard Worker err_out:
277*9e564957SAndroid Build Coastguard Worker 	destroy_mount_opts(mo);
278*9e564957SAndroid Build Coastguard Worker 	return NULL;
279*9e564957SAndroid Build Coastguard Worker }
280*9e564957SAndroid Build Coastguard Worker 
destroy_mount_opts(struct mount_opts * mo)281*9e564957SAndroid Build Coastguard Worker void destroy_mount_opts(struct mount_opts *mo)
282*9e564957SAndroid Build Coastguard Worker {
283*9e564957SAndroid Build Coastguard Worker 	free(mo->kernel_opts);
284*9e564957SAndroid Build Coastguard Worker 	free(mo);
285*9e564957SAndroid Build Coastguard Worker }
286*9e564957SAndroid Build Coastguard Worker 
fuse_kern_mount(const char * mountpoint,struct mount_opts * mo)287*9e564957SAndroid Build Coastguard Worker int fuse_kern_mount(const char *mountpoint, struct mount_opts *mo)
288*9e564957SAndroid Build Coastguard Worker {
289*9e564957SAndroid Build Coastguard Worker 	/* mount util should not try to spawn the daemon */
290*9e564957SAndroid Build Coastguard Worker 	setenv("MOUNT_FUSEFS_SAFE", "1", 1);
291*9e564957SAndroid Build Coastguard Worker 	/* to notify the mount util it's called from lib */
292*9e564957SAndroid Build Coastguard Worker 	setenv("MOUNT_FUSEFS_CALL_BY_LIB", "1", 1);
293*9e564957SAndroid Build Coastguard Worker 
294*9e564957SAndroid Build Coastguard Worker 	return fuse_mount_core(mountpoint, mo->kernel_opts);
295*9e564957SAndroid Build Coastguard Worker }
296