diff options
author | Nikolaus Rath <Nikolaus@rath.org> | 2016-10-02 10:26:40 -0700 |
---|---|---|
committer | Nikolaus Rath <Nikolaus@rath.org> | 2016-10-02 10:51:34 -0700 |
commit | 50f5255a44870863e4a9b6bcb7a62b5319fefd62 (patch) | |
tree | f2612633cfae824810dd8c0c86d7d0beb5cfcdf1 /lib/fuse_lowlevel.c | |
parent | 1ac9551d9a0a7abdce3dd31dad808c89e0467823 (diff) |
Introduce separate mount/umount functions for low-level API.
Diffstat (limited to 'lib/fuse_lowlevel.c')
-rwxr-xr-x | lib/fuse_lowlevel.c | 36 |
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[]) { |