aboutsummaryrefslogtreecommitdiff
path: root/lib/fuse_lowlevel.c
diff options
context:
space:
mode:
authorGravatar Nikolaus Rath <Nikolaus@rath.org>2016-10-02 10:26:40 -0700
committerGravatar Nikolaus Rath <Nikolaus@rath.org>2016-10-02 10:51:34 -0700
commit50f5255a44870863e4a9b6bcb7a62b5319fefd62 (patch)
treef2612633cfae824810dd8c0c86d7d0beb5cfcdf1 /lib/fuse_lowlevel.c
parent1ac9551d9a0a7abdce3dd31dad808c89e0467823 (diff)
Introduce separate mount/umount functions for low-level API.
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rwxr-xr-xlib/fuse_lowlevel.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 8b08f3a..ad10175 100755
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -2938,6 +2938,42 @@ out:
return NULL;
}
+struct fuse_chan *fuse_session_mount(const char *mountpoint,
+ struct fuse_args *args)
+{
+ struct fuse_chan *ch;
+ int fd;
+
+ /*
+ * Make sure file descriptors 0, 1 and 2 are open, otherwise chaos
+ * would ensue.
+ */
+ do {
+ fd = open("/dev/null", O_RDWR);
+ if (fd > 2)
+ close(fd);
+ } while (fd >= 0 && fd <= 2);
+
+ fd = fuse_kern_mount(mountpoint, args);
+ if (fd == -1)
+ return NULL;
+
+ ch = fuse_chan_new(fd);
+ if (!ch)
+ fuse_kern_unmount(mountpoint, fd);
+
+ return ch;
+}
+
+void fuse_session_unmount(const char *mountpoint, struct fuse_chan *ch)
+{
+ if (mountpoint) {
+ int fd = ch ? fuse_chan_clearfd(ch) : -1;
+ fuse_kern_unmount(mountpoint, fd);
+ fuse_chan_put(ch);
+ }
+}
+
#ifdef linux
int fuse_req_getgroups(fuse_req_t req, int size, gid_t list[])
{