fix
authorMiklos Szeredi <miklos@szeredi.hu>
Fri, 17 Mar 2006 15:05:40 +0000 (15:05 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Fri, 17 Mar 2006 15:05:40 +0000 (15:05 +0000)
18 files changed:
ChangeLog
example/fusexmp.c
example/fusexmp_fh.c
example/hello.c
example/hello_ll.c
example/null.c
include/fuse.h
include/fuse_common.h
include/fuse_common_compat.h
include/fuse_compat.h
include/fuse_lowlevel.h
lib/fuse.c
lib/fuse_i.h
lib/fuse_session.c
lib/fuse_versionscript
lib/helper.c
lib/mount.c
lib/mount_bsd.c

index af85845f81b2ae400943d3825a3f927ca75d8417..7ebda651e335f65be5851ff0928e36f55dc432c8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2006-03-17  Miklos Szeredi <miklos@szeredi.hu>
+
+       * API changes:
+
+       * fuse_main(), fuse_setup() and fuse_new() have an additionl
+       user_data parameter
+
+       * fuse_mount() returns a 'struct fuse_chan' pointer instead of a
+       file descriptor
+
+       * fuse_unmount() receives a 'struct fuse_chan' pointer.  It
+       destroys the given channel
+
+       * fuse_teardown() no longer has a file descriptor parameter
+
+       * new exported functions: fuse_session_remove_chan(),
+       fuse_get_session(), fuse_daemonize()
+
 2006-03-16  Miklos Szeredi <miklos@szeredi.hu>
 
        * Released 2.6.0-pre2
index 172dc883fc8ac5d57f61dae27b1e6f2e9c03e1b4..a30c9fd63e30d84d0f44956a1cb4453ef491728b 100644 (file)
@@ -369,5 +369,5 @@ static struct fuse_operations xmp_oper = {
 int main(int argc, char *argv[])
 {
     umask(0);
-    return fuse_main(argc, argv, &xmp_oper);
+    return fuse_main(argc, argv, &xmp_oper, NULL);
 }
index 89fe8ffcbd37c2abc0a335b58b342e6062455b34..c82d061c15e6046f55efe864f494213323eb3602 100644 (file)
@@ -432,5 +432,5 @@ static struct fuse_operations xmp_oper = {
 int main(int argc, char *argv[])
 {
     umask(0);
-    return fuse_main(argc, argv, &xmp_oper);
+    return fuse_main(argc, argv, &xmp_oper, NULL);
 }
index 8ab7181749ecc5fd3cd1f07d4561473dffc3cc19..f717c3498347661808c6a23754113b3ea2c4429c 100644 (file)
@@ -90,5 +90,5 @@ static struct fuse_operations hello_oper = {
 
 int main(int argc, char *argv[])
 {
-    return fuse_main(argc, argv, &hello_oper);
+    return fuse_main(argc, argv, &hello_oper, NULL);
 }
index 531d1c9731fa8cd570d28c6773f6bf45932574fa..dbe141c1f23efa551d21b36c698b90b0e98d036b 100644 (file)
@@ -149,33 +149,27 @@ static struct fuse_lowlevel_ops hello_ll_oper = {
 int main(int argc, char *argv[])
 {
     struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
+    struct fuse_chan *ch;
     char *mountpoint;
     int err = -1;
-    int fd = -1;
 
     if (fuse_parse_cmdline(&args, &mountpoint, NULL, NULL) != -1 &&
-        (fd = fuse_mount(mountpoint, &args)) != -1) {
+        (ch = fuse_mount(mountpoint, &args)) != NULL) {
         struct fuse_session *se;
 
         se = fuse_lowlevel_new(&args, &hello_ll_oper, sizeof(hello_ll_oper),
                                NULL);
         if (se != NULL) {
             if (fuse_set_signal_handlers(se) != -1) {
-                struct fuse_chan *ch = fuse_kern_chan_new(fd);
-                if (ch != NULL) {
-                    fuse_session_add_chan(se, ch);
-                    err = fuse_session_loop(se);
-                }
+                fuse_session_add_chan(se, ch);
+                err = fuse_session_loop(se);
                 fuse_remove_signal_handlers(se);
+                fuse_session_remove_chan(ch);
             }
-            fuse_unmount(mountpoint, fd);
             fuse_session_destroy(se);
-            goto out;
         }
-        close(fd);
+        fuse_unmount(mountpoint, ch);
     }
-    fuse_unmount(mountpoint, fd);
-out:
     fuse_opt_free_args(&args);
 
     return err ? 1 : 0;
index 82e7c452d3013fac583819c076657a00f491ae95..eda843a5fc5590a0bcad547504971f50dc1ee5ca 100644 (file)
@@ -84,5 +84,5 @@ static struct fuse_operations null_oper = {
 
 int main(int argc, char *argv[])
 {
-    return fuse_main(argc, argv, &null_oper);
+    return fuse_main(argc, argv, &null_oper, NULL);
 }
index 065ae75b48ad891509829656a6ec17d836aad501..f7dba7fa95e044c3af5a07181f0410d9bc9c82b3 100644 (file)
@@ -404,13 +404,15 @@ struct fuse_context {
  * @param argc the argument counter passed to the main() function
  * @param argv the argument vector passed to the main() function
  * @param op the file system operation
+ * @param user_data user data set in context for init() method
  * @return 0 on success, nonzero on failure
  */
 /*
-int fuse_main(int argc, char *argv[], const struct fuse_operations *op);
+int fuse_main(int argc, char *argv[], const struct fuse_operations *op,
+              void *user_data);
 */
-#define fuse_main(argc, argv, op) \
-            fuse_main_real(argc, argv, op, sizeof(*(op)))
+#define fuse_main(argc, argv, op, user_data) \
+            fuse_main_real(argc, argv, op, sizeof(*(op)), user_data)
 
 /* ----------------------------------------------------------- *
  * More detailed API                                           *
@@ -419,14 +421,16 @@ int fuse_main(int argc, char *argv[], const struct fuse_operations *op);
 /**
  * Create a new FUSE filesystem.
  *
- * @param fd the control file descriptor
+ * @param ch the communication channel
  * @param args argument vector
  * @param op the operations
  * @param op_size the size of the fuse_operations structure
+ * @param user_data user data set in context for init() method
  * @return the created FUSE handle
  */
-struct fuse *fuse_new(int fd, struct fuse_args *args,
-                      const struct fuse_operations *op, size_t op_size);
+struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args,
+                      const struct fuse_operations *op, size_t op_size,
+                      void *user_data);
 
 /**
  * Destroy the FUSE handle.
@@ -497,7 +501,7 @@ int fuse_is_lib_option(const char *opt);
  * Do not call this directly, use fuse_main()
  */
 int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op,
-                   size_t op_size);
+                   size_t op_size, void *user_data);
 
 /* ----------------------------------------------------------- *
  * Advanced API for event handling, don't worry about this...  *
@@ -509,10 +513,11 @@ typedef void (*fuse_processor_t)(struct fuse *, struct fuse_cmd *, void *);
 /** This is the part of fuse_main() before the event loop */
 struct fuse *fuse_setup(int argc, char *argv[],
                         const struct fuse_operations *op, size_t op_size,
-                        char **mountpoint, int *multithreaded, int *fd);
+                        char **mountpoint, int *multithreaded,
+                        void *user_data);
 
 /** This is the part of fuse_main() after the event loop */
-void fuse_teardown(struct fuse *fuse, int fd, char *mountpoint);
+void fuse_teardown(struct fuse *fuse, char *mountpoint);
 
 /** Read a single command.  If none are read, return NULL */
 struct fuse_cmd *fuse_read_cmd(struct fuse *f);
@@ -531,6 +536,9 @@ int fuse_exited(struct fuse *f);
 /** Set function which can be used to get the current context */
 void fuse_set_getcontext_func(struct fuse_context *(*func)(void));
 
+/** Get session from fuse object */
+struct fuse_session *fuse_get_session(struct fuse *f);
+
 /* ----------------------------------------------------------- *
  * Compatibility stuff                                         *
  * ----------------------------------------------------------- */
@@ -543,6 +551,7 @@ void fuse_set_getcontext_func(struct fuse_context *(*func)(void));
             fuse_main_real_compat25(argc, argv, op, sizeof(*(op)))
 #    define fuse_new fuse_new_compat25
 #    define fuse_setup fuse_setup_compat25
+#    define fuse_teardown fuse_teardown_compat25
 #    define fuse_operations fuse_operations_compat25
 #  elif FUSE_USE_VERSION == 22
 #    define fuse_main(argc, argv, op) \
index 056b92b7dabde53a89235ab5e3777cf32a18b612..c1b2806fe4810fcc79df5e5c80b129ef8910f65c 100644 (file)
@@ -75,6 +75,9 @@ struct fuse_conn_info {
     unsigned reserved[27];
 };
 
+struct fuse_session;
+struct fuse_chan;
+
 /**
  * Create a FUSE mountpoint
  *
@@ -83,17 +86,17 @@ struct fuse_conn_info {
  *
  * @param mountpoint the mount point path
  * @param args argument vector
- * @return the control file descriptor on success, -1 on failure
+ * @return the communication channel on success, NULL on failure
  */
-int fuse_mount(const char *mountpoint, struct fuse_args *args);
+struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args);
 
 /**
  * Umount a FUSE mountpoint
  *
  * @param mountpoint the mount point path
- * @param the control file descriptor 
+ * @param ch the communication channel
  */
-void fuse_unmount(const char *mountpoint, int fd);
+void fuse_unmount(const char *mountpoint, struct fuse_chan *ch);
 
 /**
  * Parse common options
@@ -120,6 +123,37 @@ int fuse_parse_cmdline(struct fuse_args *args, char **mountpoint,
                        int *multithreaded, int *foreground);
 
 
+int fuse_daemonize(int foreground);
+
+/* ----------------------------------------------------------- *
+ * Signal handling                                             *
+ * ----------------------------------------------------------- */
+
+/**
+ * Exit session on HUP, TERM and INT signals and ignore PIPE signal
+ *
+ * Stores session in a global variable.  May only be called once per
+ * process until fuse_remove_signal_handlers() is called.
+ *
+ * @param se the session to exit
+ * @return 0 on success, -1 on failure
+ */
+int fuse_set_signal_handlers(struct fuse_session *se);
+
+/**
+ * Restore default signal handlers
+ *
+ * Resets global session.  After this fuse_set_signal_handlers() may
+ * be called again.
+ *
+ * @param se the same session as given in fuse_set_signal_handlers()
+ */
+void fuse_remove_signal_handlers(struct fuse_session *se);
+
+/* ----------------------------------------------------------- *
+ * Compatibility stuff                                         *
+ * ----------------------------------------------------------- */
+
 #if FUSE_USE_VERSION < 26
 #    ifdef __FreeBSD__
 #        if FUSE_USE_VERSION < 25
@@ -129,6 +163,7 @@ int fuse_parse_cmdline(struct fuse_args *args, char **mountpoint,
 #    include "fuse_common_compat.h"
 #    undef FUSE_MINOR_VERSION
 #    undef fuse_main
+#    define fuse_mount fuse_mount_compat25
 #    define fuse_unmount fuse_unmount_compat22
 #    if FUSE_USE_VERSION == 25
 #        define FUSE_MINOR_VERSION 5
index ce54fdfa6cd3756d5020f4f44c4980dbcfaf106b..6b6bf3216fee1ed1342df222ecc2a09b3014c34a 100644 (file)
@@ -9,6 +9,8 @@
 /* these definitions provide source compatibility to prior versions.
    Do not include this file directly! */
 
+int fuse_mount_compat25(const char *mountpoint, struct fuse_args *args);
+
 int fuse_mount_compat22(const char *mountpoint, const char *opts);
 
 int fuse_mount_compat1(const char *mountpoint, const char *args[]);
index a2144f053a47efb7d57e2043b7c3b4e860419649..c89637308d00bc2882274faa988c7109c92b74d1 100644 (file)
@@ -62,6 +62,8 @@ struct fuse *fuse_setup_compat25(int argc, char *argv[],
                                  size_t op_size, char **mountpoint,
                                  int *multithreaded, int *fd);
 
+void fuse_teardown_compat25(struct fuse *fuse, int fd, char *mountpoint);
+
 #ifndef __FreeBSD__
 #include <sys/statfs.h>
 
index 3cfff327c973496a8d90eb30cad6811c09ed9e4e..da12152946408f99014e2412b9e3454d3a3e5ef2 100644 (file)
@@ -943,14 +943,6 @@ struct fuse_session *fuse_lowlevel_new(struct fuse_args *args,
                                        const struct fuse_lowlevel_ops *op,
                                        size_t op_size, void *userdata);
 
-/**
- * Create a kernel channel
- *
- * @param fd the file descriptor obtained from fuse_mount()
- * @return the created channel object, or NULL on failure
- */
-struct fuse_chan *fuse_kern_chan_new(int fd);
-
 /* ----------------------------------------------------------- *
  * Session interface                                           *
  * ----------------------------------------------------------- */
@@ -1018,6 +1010,15 @@ struct fuse_session *fuse_session_new(struct fuse_session_ops *op, void *data);
  */
 void fuse_session_add_chan(struct fuse_session *se, struct fuse_chan *ch);
 
+/**
+ * Remove a channel from a session
+ *
+ * If the channel is not assigned to a session, then this is a no-op
+ *
+ * @param ch the channel to remove
+ */
+void fuse_session_remove_chan(struct fuse_chan *ch);
+
 /**
  * Iterate over the channels assigned to a session
  *
@@ -1207,31 +1208,6 @@ int fuse_chan_send(struct fuse_chan *ch, const struct iovec iov[],
  */
 void fuse_chan_destroy(struct fuse_chan *ch);
 
-/* ----------------------------------------------------------- *
- * Signal handling                                             *
- * ----------------------------------------------------------- */
-
-/**
- * Exit session on HUP, TERM and INT signals and ignore PIPE signal
- *
- * Stores session in a global variable.  May only be called once per
- * process until fuse_remove_signal_handlers() is called.
- *
- * @param se the session to exit
- * @return 0 on success, -1 on failure
- */
-int fuse_set_signal_handlers(struct fuse_session *se);
-
-/**
- * Restore default signal handlers
- *
- * Resets global session.  After this fuse_set_signal_handlers() may
- * be called again.
- *
- * @param se the same session as given in fuse_set_signal_handlers()
- */
-void fuse_remove_signal_handlers(struct fuse_session *se);
-
 /* ----------------------------------------------------------- *
  * Compatibility stuff                                         *
  * ----------------------------------------------------------- */
index ec5ace981172337c180a4af65b6fbf6f2c67b53b..82e0e442d0a5a19db6bc66a65f7bcf6f34aa6527 100644 (file)
@@ -617,6 +617,7 @@ static void fuse_data_init(void *data, struct fuse_conn_info *conn)
 
     memset(c, 0, sizeof(*c));
     c->fuse = f;
+    c->private_data = f->user_data;
 
     if (f->op.init)
         f->user_data = f->op.init(conn);
@@ -1998,11 +1999,10 @@ int fuse_is_lib_option(const char *opt)
         fuse_opt_match(fuse_lib_opts, opt);
 }
 
-struct fuse *fuse_new_common(int fd, struct fuse_args *args,
+struct fuse *fuse_new_common(struct fuse_chan *ch, struct fuse_args *args,
                              const struct fuse_operations *op,
-                             size_t op_size, int compat)
+                             size_t op_size, void *user_data, int compat)
 {
-    struct fuse_chan *ch;
     struct fuse *f;
     struct node *root;
 
@@ -2017,6 +2017,7 @@ struct fuse *fuse_new_common(int fd, struct fuse_args *args,
         goto out;
     }
 
+    f->user_data = user_data;
     f->conf.entry_timeout = 1.0;
     f->conf.attr_timeout = 1.0;
     f->conf.negative_timeout = 0.0;
@@ -2045,10 +2046,6 @@ struct fuse *fuse_new_common(int fd, struct fuse_args *args,
     if (f->se == NULL)
         goto out_free;
 
-    ch = fuse_kern_chan_new(fd);
-    if (ch == NULL)
-        goto out_free_session;
-
     fuse_session_add_chan(f->se, ch);
 
     f->ctr = 0;
@@ -2109,10 +2106,11 @@ struct fuse *fuse_new_common(int fd, struct fuse_args *args,
     return NULL;
 }
 
-struct fuse *fuse_new(int fd, struct fuse_args *args,
-                      const struct fuse_operations *op, size_t op_size)
+struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args,
+                      const struct fuse_operations *op, size_t op_size,
+                      void *user_data)
 {
-    return fuse_new_common(fd, args, op, op_size, 0);
+    return fuse_new_common(ch, args, op, op_size, user_data, 0);
 }
 
 void fuse_destroy(struct fuse *f)
@@ -2149,6 +2147,19 @@ void fuse_destroy(struct fuse *f)
 
 #include "fuse_compat.h"
 
+static struct fuse *fuse_new_common_compat25(int fd, struct fuse_args *args,
+                                             const struct fuse_operations *op,
+                                             size_t op_size, int compat)
+{
+    struct fuse *f = NULL;
+    struct fuse_chan *ch = fuse_kern_chan_new(fd);
+
+    if (ch)
+        f = fuse_new_common(ch, args, op, op_size, NULL, compat);
+
+    return f;
+}
+
 #ifndef __FreeBSD__
 
 static int fuse_do_open(struct fuse *f, char *path, struct fuse_file_info *fi)
@@ -2251,7 +2262,7 @@ static struct fuse *fuse_new_common_compat(int fd, const char *opts,
         fuse_opt_free_args(&args);
         return NULL;
     }
-    f = fuse_new_common(fd, &args, op, op_size, compat);
+    f = fuse_new_common_compat25(fd, &args, op, op_size, compat);
     fuse_opt_free_args(&args);
 
     return f;
@@ -2319,8 +2330,8 @@ struct fuse *fuse_new_compat25(int fd, struct fuse_args *args,
                                const struct fuse_operations_compat25 *op,
                                size_t op_size)
 {
-    return fuse_new_common(fd, args, (struct fuse_operations *) op,
-                           op_size, 25);
+    return fuse_new_common_compat25(fd, args, (struct fuse_operations *) op,
+                                    op_size, 25);
 }
 
 __asm__(".symver fuse_new_compat25,fuse_new@FUSE_2.5");
index e54509e20d5ae999e517100e6c1cac5ce24855a8..268bc418b795f978357d656098df93dfcbaa5934 100644 (file)
@@ -18,14 +18,18 @@ struct fuse_cmd {
     struct fuse_chan *ch;
 };
 
-struct fuse_session *fuse_get_session(struct fuse *f);
-
-struct fuse *fuse_new_common(int fd, struct fuse_args *args,
+struct fuse *fuse_new_common(struct fuse_chan *ch, struct fuse_args *args,
                              const struct fuse_operations *op,
-                             size_t op_size, int compat);
+                             size_t op_size, void *user_data, int compat);
 
 int fuse_sync_compat_args(struct fuse_args *args);
 
+struct fuse_chan *fuse_kern_chan_new(int fd);
+
 struct fuse_session *fuse_lowlevel_new_common(struct fuse_args *args,
                                        const struct fuse_lowlevel_ops *op,
                                        size_t op_size, void *userdata);
+
+void fuse_kern_unmount_compat22(const char *mountpoint);
+void fuse_kern_unmount(const char *mountpoint, int fd);
+int fuse_kern_mount(const char *mountpoint, struct fuse_args *args);
index 8943204e1a65da8fc9e937170d4bcc50bb1f802a..040645b75354db017eb9813a209008593c6ed64e 100644 (file)
@@ -59,6 +59,16 @@ void fuse_session_add_chan(struct fuse_session *se, struct fuse_chan *ch)
     ch->se = se;
 }
 
+void fuse_session_remove_chan(struct fuse_chan *ch)
+{
+    struct fuse_session *se = ch->se;
+    if (se) {
+        assert(se->ch == ch);
+        se->ch = NULL;
+        ch->se = NULL;
+    }
+}
+
 struct fuse_chan *fuse_session_next_chan(struct fuse_session *se,
                                          struct fuse_chan *ch)
 {
@@ -162,6 +172,7 @@ int fuse_chan_send(struct fuse_chan *ch, const struct iovec iov[], size_t count)
 
 void fuse_chan_destroy(struct fuse_chan *ch)
 {
+    fuse_session_remove_chan(ch);
     if (ch->op.destroy)
         ch->op.destroy(ch);
     free(ch);
index 2a8067aa31b82efdcdbcabc1c32ba23b62ad4107..467d8709ee5b0cd0ad09055cb7f035d9c448df8e 100644 (file)
@@ -19,7 +19,6 @@ FUSE_2.2 {
                fuse_read_cmd;
                fuse_set_getcontext_func;
                fuse_setup_compat2;
-               fuse_teardown;
 };
 
 FUSE_2.4 {
@@ -62,7 +61,6 @@ FUSE_2.5 {
        global:
                fuse_lowlevel_new_compat;
                fuse_main_real_compat22;
-               fuse_mount;
                fuse_mount_compat22;
                fuse_new_compat22;
                fuse_opt_parse;
@@ -85,15 +83,22 @@ FUSE_2.5 {
 FUSE_2.6 {
        global:
                fuse_add_direntry;
+               fuse_daemonize;
+               fuse_get_session;
                fuse_lowlevel_new;
                fuse_lowlevel_new_compat25;
                fuse_main_real;
                fuse_main_real_compat25;
+               fuse_mount;
+               fuse_mount_compat25;
                fuse_new;
                fuse_new_compat25;
                fuse_opt_insert_arg;
+               fuse_session_remove_chan;
                fuse_setup;
                fuse_setup_compat25;
+               fuse_teardown;
+               fuse_teardown_compat22;
                fuse_unmount;
                fuse_unmount_compat22;
                fuse_chan_recv;
index a5935ded1ebfcca9406abcb113756c90f3453e14..bcdd60b958ba29541ce8511cfbf35a28d43ccab6 100644 (file)
@@ -10,6 +10,7 @@
 #include "fuse_i.h"
 #include "fuse_opt.h"
 #include "fuse_lowlevel.h"
+#include "fuse_common_compat.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -163,7 +164,7 @@ int fuse_parse_cmdline(struct fuse_args *args, char **mountpoint,
     return -1;
 }
 
-static int fuse_daemonize(int foreground)
+int fuse_daemonize(int foreground)
 {
     int res;
 
@@ -184,15 +185,49 @@ static int fuse_daemonize(int foreground)
     return 0;
 }
 
+static struct fuse_chan *fuse_mount_common(const char *mountpoint,
+                                           struct fuse_args *args)
+{
+    struct fuse_chan *ch;
+    int fd = fuse_mount_compat25(mountpoint, args);
+    if (fd == -1)
+        return NULL;
+
+    ch = fuse_kern_chan_new(fd);
+    if (!ch)
+        fuse_unmount(mountpoint, NULL);
+
+    return ch;
+}
+
+struct fuse_chan *fuse_mount(const char *mountpoint, struct fuse_args *args)
+{
+    return fuse_mount_common(mountpoint, args);
+}
+
+static void fuse_unmount_common(const char *mountpoint, struct fuse_chan *ch)
+{
+    int fd = ch ? fuse_chan_fd(ch) : -1;
+    fuse_kern_unmount(mountpoint, fd);
+    fuse_chan_destroy(ch);
+}
+
+void fuse_unmount(const char *mountpoint, struct fuse_chan *ch)
+{
+    fuse_unmount_common(mountpoint, ch);
+}
+
 static struct fuse *fuse_setup_common(int argc, char *argv[],
                                       const struct fuse_operations *op,
                                       size_t op_size,
                                       char **mountpoint,
                                       int *multithreaded,
                                       int *fd,
+                                      void *user_data,
                                       int compat)
 {
     struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
+    struct fuse_chan *ch;
     struct fuse *fuse;
     int foreground;
     int res;
@@ -201,13 +236,13 @@ static struct fuse *fuse_setup_common(int argc, char *argv[],
     if (res == -1)
         return NULL;
 
-    *fd = fuse_mount(*mountpoint, &args);
-    if (*fd == -1) {
+    ch = fuse_mount_common(*mountpoint, &args);
+    if (!ch) {
         fuse_opt_free_args(&args);
         goto err_free;
     }
 
-    fuse = fuse_new_common(*fd, &args, op, op_size, compat);
+    fuse = fuse_new_common(ch, &args, op, op_size, user_data, compat);
     fuse_opt_free_args(&args);
     if (fuse == NULL)
         goto err_unmount;
@@ -220,46 +255,54 @@ static struct fuse *fuse_setup_common(int argc, char *argv[],
     if (res == -1)
         goto err_destroy;
 
+    if (fd)
+        *fd = fuse_chan_fd(ch);
+
     return fuse;
 
  err_destroy:
     fuse_destroy(fuse);
  err_unmount:
-    fuse_unmount(*mountpoint, *fd);
+    fuse_unmount_common(*mountpoint, ch);
  err_free:
     free(*mountpoint);
     return NULL;
 }
 
 struct fuse *fuse_setup(int argc, char *argv[],
-                        const struct fuse_operations *op,
-                        size_t op_size, char **mountpoint,
-                        int *multithreaded, int *fd)
+                        const struct fuse_operations *op, size_t op_size,
+                        char **mountpoint, int *multithreaded, void *user_data)
 {
     return fuse_setup_common(argc, argv, op, op_size, mountpoint,
-                             multithreaded, fd, 0);
+                             multithreaded, NULL, user_data, 0);
 }
 
-void fuse_teardown(struct fuse *fuse, int fd, char *mountpoint)
+static void fuse_teardown_common(struct fuse *fuse, char *mountpoint)
 {
-    fuse_remove_signal_handlers(fuse_get_session(fuse));
-    fuse_unmount(mountpoint, fd);
+    struct fuse_session *se = fuse_get_session(fuse);
+    struct fuse_chan *ch = fuse_session_next_chan(se, NULL);
+    fuse_remove_signal_handlers(se);
+    fuse_unmount_common(mountpoint, ch);
     fuse_destroy(fuse);
     free(mountpoint);
 }
 
+void fuse_teardown(struct fuse *fuse, char *mountpoint)
+{
+    fuse_teardown_common(fuse, mountpoint);
+}
+
 static int fuse_main_common(int argc, char *argv[],
                             const struct fuse_operations *op, size_t op_size,
-                            int compat)
+                            void *user_data, int compat)
 {
     struct fuse *fuse;
     char *mountpoint;
     int multithreaded;
     int res;
-    int fd;
 
     fuse = fuse_setup_common(argc, argv, op, op_size, &mountpoint,
-                             &multithreaded, &fd, compat);
+                             &multithreaded, NULL, user_data, compat);
     if (fuse == NULL)
         return 1;
 
@@ -268,7 +311,7 @@ static int fuse_main_common(int argc, char *argv[],
     else
         res = fuse_loop(fuse);
 
-    fuse_teardown(fuse, fd, mountpoint);
+    fuse_teardown_common(fuse, mountpoint);
     if (res == -1)
         return 1;
 
@@ -276,9 +319,9 @@ static int fuse_main_common(int argc, char *argv[],
 }
 
 int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op,
-                   size_t op_size)
+                   size_t op_size, void *user_data)
 {
-    return fuse_main_common(argc, argv, op, op_size, 0);
+    return fuse_main_common(argc, argv, op, op_size, user_data, 0);
 }
 
 #undef fuse_main
@@ -298,7 +341,7 @@ struct fuse *fuse_setup_compat22(int argc, char *argv[],
                                  int *multithreaded, int *fd)
 {
     return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
-                             op_size, mountpoint, multithreaded, fd, 22);
+                             op_size, mountpoint, multithreaded, fd, NULL, 22);
 }
 
 struct fuse *fuse_setup_compat2(int argc, char *argv[],
@@ -308,7 +351,7 @@ struct fuse *fuse_setup_compat2(int argc, char *argv[],
 {
     return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
                              sizeof(struct fuse_operations_compat2),
-                             mountpoint, multithreaded, fd, 21);
+                             mountpoint, multithreaded, fd, NULL, 21);
 }
 
 int fuse_main_real_compat22(int argc, char *argv[],
@@ -316,21 +359,28 @@ int fuse_main_real_compat22(int argc, char *argv[],
                             size_t op_size)
 {
     return fuse_main_common(argc, argv, (struct fuse_operations *) op, op_size,
-                            22);
+                            NULL, 22);
 }
 
 void fuse_main_compat1(int argc, char *argv[],
                       const struct fuse_operations_compat1 *op)
 {
     fuse_main_common(argc, argv, (struct fuse_operations *) op,
-                     sizeof(struct fuse_operations_compat1), 11);
+                     sizeof(struct fuse_operations_compat1), NULL, 11);
 }
 
 int fuse_main_compat2(int argc, char *argv[],
                       const struct fuse_operations_compat2 *op)
 {
     return fuse_main_common(argc, argv, (struct fuse_operations *) op,
-                            sizeof(struct fuse_operations_compat2), 21);
+                            sizeof(struct fuse_operations_compat2), NULL, 21);
+}
+
+int fuse_mount_compat1(const char *mountpoint, const char *args[])
+{
+    /* just ignore mount args for now */
+    (void) args;
+    return fuse_mount_compat22(mountpoint, NULL);
 }
 
 __asm__(".symver fuse_setup_compat2,__fuse_setup@");
@@ -348,7 +398,7 @@ struct fuse *fuse_setup_compat25(int argc, char *argv[],
                                  int *multithreaded, int *fd)
 {
     return fuse_setup_common(argc, argv, (struct fuse_operations *) op,
-                             op_size, mountpoint, multithreaded, fd, 25);
+                             op_size, mountpoint, multithreaded, fd, NULL, 25);
 }
 
 int fuse_main_real_compat25(int argc, char *argv[],
@@ -356,8 +406,21 @@ int fuse_main_real_compat25(int argc, char *argv[],
                             size_t op_size)
 {
     return fuse_main_common(argc, argv, (struct fuse_operations *) op, op_size,
-                            25);
+                            NULL, 25);
+}
+
+void fuse_teardown_compat22(struct fuse *fuse, int fd, char *mountpoint)
+{
+    (void) fd;
+    fuse_teardown_common(fuse, mountpoint);
+}
+
+int fuse_mount_compat25(const char *mountpoint, struct fuse_args *args)
+{
+    return fuse_kern_mount(mountpoint, args);
 }
 
 __asm__(".symver fuse_setup_compat25,fuse_setup@FUSE_2.5");
+__asm__(".symver fuse_teardown_compat22,fuse_teardown@FUSE_2.2");
 __asm__(".symver fuse_main_real_compat25,fuse_main_real@FUSE_2.5");
+__asm__(".symver fuse_mount_compat25,fuse_mount@FUSE_2.5");
index 5c568e913a3d3c2ea40238d618171044337de4db..045a4a6677657c1ab8575f8b50357f016869a55c 100644 (file)
@@ -6,9 +6,8 @@
     See the file COPYING.LIB.
 */
 
-#include "fuse.h"
+#include "fuse_i.h"
 #include "fuse_opt.h"
-#include "fuse_compat.h"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -167,28 +166,26 @@ static int receive_fd(int fd)
     return *(int*)CMSG_DATA(cmsg);
 }
 
-void fuse_unmount_compat22(const char *mountpoint)
-{
-    fuse_unmount(mountpoint, -1);
-}
-
-void fuse_unmount(const char *mountpoint, int fd)
+void fuse_kern_unmount(const char *mountpoint, int fd)
 {
     const char *mountprog = FUSERMOUNT_PROG;
-    struct pollfd pfd;
-    int res;
     int pid;
 
     if (!mountpoint)
         return;
 
-    pfd.fd = fd;
-    pfd.events = 0;
-    res = poll(&pfd, 1, 0);
-    /* If file poll returns POLLERR on the device file descriptor,
-       then the filesystem is already unmounted */
-    if (res == 1 && (pfd.revents & POLLERR))
-        return;
+    if (fd != -1) {
+        int res;
+        struct pollfd pfd;
+
+        pfd.fd = fd;
+        pfd.events = 0;
+        res = poll(&pfd, 1, 0);
+        /* If file poll returns POLLERR on the device file descriptor,
+           then the filesystem is already unmounted */
+        if (res == 1 && (pfd.revents & POLLERR))
+            return;
+    }
 
 #ifdef HAVE_FORK
     pid = fork();
@@ -216,6 +213,11 @@ void fuse_unmount(const char *mountpoint, int fd)
     waitpid(pid, NULL, 0);
 }
 
+void fuse_unmount_compat22(const char *mountpoint)
+{
+    fuse_kern_unmount(mountpoint, -1);
+}
+
 int fuse_mount_compat22(const char *mountpoint, const char *opts)
 {
     const char *mountprog = FUSERMOUNT_PROG;
@@ -277,7 +279,7 @@ int fuse_mount_compat22(const char *mountpoint, const char *opts)
     return rv;
 }
 
-int fuse_mount(const char *mountpoint, struct fuse_args *args)
+int fuse_kern_mount(const char *mountpoint, struct fuse_args *args)
 {
     struct mount_opts mo;
     int res = -1;
@@ -301,12 +303,5 @@ int fuse_mount(const char *mountpoint, struct fuse_args *args)
     return res;
 }
 
-int fuse_mount_compat1(const char *mountpoint, const char *args[])
-{
-    /* just ignore mount args for now */
-    (void) args;
-    return fuse_mount_compat22(mountpoint, NULL);
-}
-
 __asm__(".symver fuse_mount_compat22,fuse_mount@FUSE_2.2");
 __asm__(".symver fuse_unmount_compat22,fuse_unmount@FUSE_2.2");
index c5661d2131302b0eaeb8ebb204acb68076f4a6a7..8b3a6d1fb1722d52e1ff8d4fa58552fddb5dccb3 100644 (file)
@@ -6,7 +6,7 @@
     See the file COPYING.LIB.
 */
 
-#include "fuse.h"
+#include "fuse_i.h"
 #include "fuse_opt.h"
 
 #include <sys/stat.h>
@@ -197,21 +197,21 @@ void fuse_unmount_compat22(const char *mountpoint)
     system(umount_cmd);
 }
 
-void fuse_unmount(const char *mountpoint, int fd)
+void fuse_kern_unmount(const char *mountpoint, int fd)
 {
     char *ep, *umount_cmd, dev[128];
     struct stat sbuf;
 
     (void)mountpoint;
-   
+
     if (fstat(fd, &sbuf) == -1)
         return;
 
     devname_r(sbuf.st_rdev, S_IFCHR, dev, 128);
-    
+
     if (strncmp(dev, "fuse", 4))
         return;
-    
+
     strtol(dev + 4, &ep, 10);
     if (*ep != '\0')
         return;
@@ -305,7 +305,7 @@ out:
     return fd;
 }
 
-int fuse_mount(const char *mountpoint, struct fuse_args *args)
+int fuse_kern_mount(const char *mountpoint, struct fuse_args *args)
 {
     struct mount_opts mo;
     int res = -1;