fix
diff --git a/lib/fuse.c b/lib/fuse.c
index 35dc227..d68ca5d 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -1,6 +1,6 @@
 /*
     FUSE: Filesystem in Userspace
-    Copyright (C) 2001-2005  Miklos Szeredi <miklos@szeredi.hu>
+    Copyright (C) 2001-2006  Miklos Szeredi <miklos@szeredi.hu>
 
     This program can be distributed under the terms of the GNU LGPL.
     See the file COPYING.LIB
@@ -32,7 +32,6 @@
 #define FUSE_UNKNOWN_INO 0xffffffff
 
 struct fuse_config {
-    char *llopts;
     unsigned int uid;
     unsigned int gid;
     unsigned int  umask;
@@ -1807,20 +1806,13 @@
     fuse_getcontext = func;
 }
 
-static int fuse_lib_opt_proc(void *data, const char *arg, int key,
-                             struct fuse_args *outargs)
-{
-    struct fuse_config *conf = data;
-    (void) key;
-    (void) outargs;
-    return fuse_opt_add_opt(&conf->llopts, arg);
-}
-
 #define FUSE_LIB_OPT(t, p, v) { t, offsetof(struct fuse_config, p), v }
 
 static const struct fuse_opt fuse_lib_opts[] = {
-    { "debug", FUSE_OPT_OFFSET_KEY, 0 },
+    FUSE_OPT_KEY("debug", 0),
+    FUSE_OPT_KEY("-d", 0),
     FUSE_LIB_OPT("debug",                 debug, 1),
+    FUSE_LIB_OPT("-d",                    debug, 1),
     FUSE_LIB_OPT("hard_remove",           hard_remove, 1),
     FUSE_LIB_OPT("use_ino",               use_ino, 1),
     FUSE_LIB_OPT("readdir_ino",           readdir_ino, 1),
@@ -1844,7 +1836,7 @@
         fuse_opt_match(fuse_lib_opts, opt);
 }
 
-struct fuse *fuse_new_common(int fd, const char *opts,
+struct fuse *fuse_new_common(int fd, struct fuse_args *args,
                              const struct fuse_operations *op,
                              size_t op_size, int compat)
 {
@@ -1867,12 +1859,8 @@
     f->conf.attr_timeout = 1.0;
     f->conf.negative_timeout = 0.0;
 
-    if (opts) {
-        const char *argv[] = { "", "-o", opts, NULL };
-        if (fuse_opt_parse(3, (char **) argv, &f->conf,
-                           fuse_lib_opts, fuse_lib_opt_proc, NULL) == -1)
+    if (fuse_opt_parse(args, &f->conf, fuse_lib_opts, NULL) == -1)
             goto out_free;
-    }
 
 #ifdef __FreeBSD__
     /*
@@ -1882,9 +1870,7 @@
     f->conf.readdir_ino = 1;
 #endif
 
-    f->se = fuse_lowlevel_new(f->conf.llopts, &fuse_path_ops,
-                              sizeof(fuse_path_ops), f);
-    free(f->conf.llopts);
+    f->se = fuse_lowlevel_new(args, &fuse_path_ops, sizeof(fuse_path_ops), f);
     if (f->se == NULL)
         goto out_free;
 
@@ -1952,10 +1938,10 @@
     return NULL;
 }
 
-struct fuse *fuse_new(int fd, const char *opts,
+struct fuse *fuse_new(int fd, struct fuse_args *args,
                       const struct fuse_operations *op, size_t op_size)
 {
-    return fuse_new_common(fd, opts, op, op_size, 0);
+    return fuse_new_common(fd, args, op, op_size, 0);
 }
 
 void fuse_destroy(struct fuse *f)
@@ -2080,19 +2066,39 @@
     return err;
 }
 
+static struct fuse *fuse_new_common_compat(int fd, const char *opts,
+                                           const struct fuse_operations *op,
+                                           size_t op_size, int compat)
+{
+    struct fuse *f;
+    struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
+
+    if (opts &&
+        (fuse_opt_add_arg(&args, "") == -1 ||
+         fuse_opt_add_arg(&args, "-o") == -1 ||
+         fuse_opt_add_arg(&args, opts) == -1)) {
+        fuse_opt_free_args(&args);
+        return NULL;
+    }
+    f = fuse_new_common(fd, &args, op, op_size, compat);
+    fuse_opt_free_args(&args);
+
+    return f;
+}
+
 struct fuse *fuse_new_compat22(int fd, const char *opts,
                                const struct fuse_operations_compat22 *op,
                                size_t op_size)
 {
-    return fuse_new_common(fd, opts, (struct fuse_operations *) op,
-                           op_size, 22);
+    return fuse_new_common_compat(fd, opts, (struct fuse_operations *) op,
+                                  op_size, 22);
 }
 
 struct fuse *fuse_new_compat2(int fd, const char *opts,
                               const struct fuse_operations_compat2 *op)
 {
-    return fuse_new_common(fd, opts, (struct fuse_operations *) op,
-                           sizeof(struct fuse_operations_compat2), 21);
+    return fuse_new_common_compat(fd, opts, (struct fuse_operations *) op,
+                                  sizeof(struct fuse_operations_compat2), 21);
 }
 
 struct fuse *fuse_new_compat1(int fd, int flags,
@@ -2101,8 +2107,8 @@
     const char *opts = NULL;
     if (flags & FUSE_DEBUG_COMPAT1)
         opts = "debug";
-    return fuse_new_common(fd, opts, (struct fuse_operations *) op,
-                           sizeof(struct fuse_operations_compat1), 11);
+    return fuse_new_common_compat(fd, opts, (struct fuse_operations *) op,
+                                  sizeof(struct fuse_operations_compat1), 11);
 }
 
 __asm__(".symver fuse_exited,__fuse_exited@");