fix
diff --git a/lib/fuse.c b/lib/fuse.c
index 7d66a7d..2cfb436 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -553,7 +553,7 @@
         reply_err(req, err);
 }
 
-static void fuse_data_init(void *data)
+static void fuse_data_init(void *data, struct fuse_conn_info *conn)
 {
     struct fuse *f = (struct fuse *) data;
     struct fuse_context *c = fuse_get_context();
@@ -562,7 +562,7 @@
     c->fuse = f;
 
     if (f->op.init)
-        f->user_data = f->op.init();
+        f->user_data = f->op.init(conn);
 }
 
 static void fuse_data_destroy(void *data)
@@ -1808,7 +1808,6 @@
 
 enum {
     KEY_HELP,
-    KEY_KEEP
 };
 
 #define FUSE_LIB_OPT(t, p, v) { t, offsetof(struct fuse_config, p), v }
@@ -1816,8 +1815,8 @@
 static const struct fuse_opt fuse_lib_opts[] = {
     FUSE_OPT_KEY("-h",                    KEY_HELP),
     FUSE_OPT_KEY("--help",                KEY_HELP),
-    FUSE_OPT_KEY("debug",                 KEY_KEEP),
-    FUSE_OPT_KEY("-d",                    KEY_KEEP),
+    FUSE_OPT_KEY("debug",                 FUSE_OPT_KEY_KEEP),
+    FUSE_OPT_KEY("-d",                    FUSE_OPT_KEY_KEEP),
     FUSE_LIB_OPT("debug",                 debug, 1),
     FUSE_LIB_OPT("-d",                    debug, 1),
     FUSE_LIB_OPT("hard_remove",           hard_remove, 1),
@@ -1906,6 +1905,11 @@
     f->conf.readdir_ino = 1;
 #endif
 
+    if (compat && compat <= 25) {
+        if (fuse_sync_compat_args(args) == -1)
+            goto out_free;
+    }
+
     f->se = fuse_lowlevel_new(args, &fuse_path_ops, sizeof(fuse_path_ops), f);
     if (f->se == NULL)
         goto out_free;
@@ -2012,13 +2016,13 @@
     free(f);
 }
 
-#ifndef __FreeBSD__
-
 #include "fuse_compat.h"
 
+#ifndef __FreeBSD__
+
 static int fuse_do_open(struct fuse *f, char *path, struct fuse_file_info *fi)
 {
-    if (!f->compat)
+    if (!f->compat || f->compat >= 25)
         return f->op.open(path, fi);
     else if (f->compat == 22) {
         int err;
@@ -2045,7 +2049,7 @@
 static int fuse_do_opendir(struct fuse *f, char *path,
                            struct fuse_file_info *fi)
 {
-    if (!f->compat) {
+    if (!f->compat || f->compat >= 25) {
         return f->op.opendir(path, fi);
     } else {
         int err;
@@ -2085,7 +2089,7 @@
 {
     int err;
 
-    if (!f->compat) {
+    if (!f->compat || f->compat >= 25) {
         err = f->op.statfs(path, buf);
     } else if (f->compat > 11) {
         struct statfs oldbuf;
@@ -2179,3 +2183,13 @@
 }
 
 #endif /* __FreeBSD__ */
+
+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);
+}
+
+__asm__(".symver fuse_new_compat25,fuse_new@FUSE_2.5");