Unreleased Changes
==================
+* There are now new `fuse_session_unmount` and `fuse_session_mount`
+ functions that should be used in the low-level API. The
+ `fuse_mount` and `fuse_unmount` functions should be used with the
+ high-level API only.
+
* The ``fuse_lowlevel_notify_*`` functions now all take a `struct
fuse_session` parameter instead of a `struct fuse_chan`.
if (ino == FUSE_ROOT_ID)
return &lo_data(req)->root;
else
- return (struct lo_inode *) (uintptr_t) ino;
+ return (struct lo_inode *) (uintptr_t) ino;
}
static int lo_fd(fuse_req_t req, fuse_ino_t ino)
err(1, "open(\"/\", O_PATH)");
if (fuse_parse_cmdline(&args, &mountpoint, NULL, NULL) != -1 &&
- (ch = fuse_mount(mountpoint, &args)) != NULL) {
+ (ch = fuse_session_mount(mountpoint, &args)) != NULL) {
struct fuse_session *se;
se = fuse_lowlevel_new(&args, &lo_oper, sizeof(lo_oper), &lo);
if (se != NULL) {
}
fuse_session_destroy(se);
}
- fuse_unmount(mountpoint, ch);
+ fuse_session_unmount(mountpoint, ch);
free(mountpoint);
}
fuse_opt_free_args(&args);
int err = -1;
if (fuse_parse_cmdline(&args, &mountpoint, NULL, NULL) != -1 &&
- (ch = fuse_mount(mountpoint, &args)) != NULL) {
+ (ch = fuse_session_mount(mountpoint, &args)) != NULL) {
struct fuse_session *se;
se = fuse_lowlevel_new(&args, &hello_ll_oper,
}
fuse_session_destroy(se);
}
- fuse_unmount(mountpoint, ch);
+ fuse_session_unmount(mountpoint, ch);
}
fuse_opt_free_args(&args);
const struct fuse_operations *op, size_t op_size,
void *user_data);
+/**
+ * Create a FUSE mountpoint
+ *
+ * Returns a control file descriptor suitable for passing to
+ * fuse_new(). Unknown parameters in `args` are passed through
+ * unchanged. Known parameters (with the exception of --help and
+ * --version) are removed from `args`.
+ *
+ * If the --help or --version parameters are specified, the function
+ * prints the requested information to stdout and returns a valid
+ * pointer. However, it does not actually perform the mount.
+ *
+ * @param mountpoint the mount point path
+ * @param args argument vector
+ * @return the communication channel on success, NULL on failure
+ */
+struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args);
+
+/**
+ * Umount a FUSE mountpoint
+ *
+ * @param mountpoint the mount point path
+ * @param ch the communication channel
+ */
+void fuse_unmount(const char *mountpoint, struct fuse_chan *ch);
+
/**
* Destroy the FUSE handle.
*
struct fuse_chan;
struct fuse_pollhandle;
-/**
- * Create a FUSE mountpoint
- *
- * Returns a control file descriptor suitable for passing to
- * fuse_new(). Unknown parameters in `args` are passed through
- * unchanged. Known parameters (with the exception of --help and
- * --version) are removed from `args`.
- *
- * If the --help or --version parameters are specified, the function
- * prints the requested information to stdout and returns a valid
- * pointer. However, it does not actually perform the mount.
- *
- * @param mountpoint the mount point path
- * @param args argument vector
- * @return the communication channel on success, NULL on failure
- */
-struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args);
-
-/**
- * Umount a FUSE mountpoint
- *
- * @param mountpoint the mount point path
- * @param ch the communication channel
- */
-void fuse_unmount(const char *mountpoint, struct fuse_chan *ch);
-
/**
* Utility functions for simple file systems to parse common options.
*
*/
int fuse_session_loop_mt(struct fuse_session *se);
+/**
+ * Create a FUSE mountpoint
+ *
+ * Returns a control file descriptor suitable for passing to
+ * fuse_new(). Unknown parameters in `args` are passed through
+ * unchanged. Known parameters (with the exception of --help and
+ * --version) are removed from `args`.
+ *
+ * If the --help or --version parameters are specified, the function
+ * prints the requested information to stdout and returns a valid
+ * pointer. However, it does not actually perform the mount.
+ *
+ * @param mountpoint the mount point path
+ * @param args argument vector
+ * @return the communication channel on success, NULL on failure
+ */
+struct fuse_chan *fuse_session_mount(const char *mountpoint,
+ struct fuse_args *args);
+
+/**
+ * Umount a FUSE mountpoint
+ *
+ * @param mountpoint the mount point path
+ * @param ch the communication channel
+ */
+void fuse_session_unmount(const char *mountpoint, struct fuse_chan *ch);
+
/* ----------------------------------------------------------- *
* Channel interface *
* ----------------------------------------------------------- */
free(f);
fuse_delete_context_key();
}
+
+struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args)
+{
+ return fuse_session_mount(mountpoint, args);
+}
+
+void fuse_unmount(const char *mountpoint, struct fuse_chan *ch)
+{
+ fuse_session_unmount(mountpoint, ch);
+}
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[])
{
fuse_lowlevel_new;
fuse_main_real;
fuse_mount;
+ fuse_session_mount;
fuse_new;
fuse_opt_insert_arg;
fuse_reply_lock;
fuse_req_interrupted;
fuse_session_remove_chan;
fuse_unmount;
+ fuse_session_unmount;
fuse_fs_access;
fuse_fs_bmap;
fuse_fs_chmod;
return 0;
}
-struct fuse_chan *fuse_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_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);
- }
-}
-
static struct fuse *fuse_setup(int argc, char *argv[],
const struct fuse_operations *op, size_t op_size,
char **mountpoint, int *multithreaded, void *user_data)