]> git.sven.stormbind.net Git - sven/fuse-exfat.git/blobdiff - fuse/main.c
Imported Upstream version 1.2.1
[sven/fuse-exfat.git] / fuse / main.c
index 58b7b2f12c8cdb6ab8afd8738ef53d8d32187e68..030362e0f5d2295f31799cd51828bb63ea8d47b1 100644 (file)
@@ -3,7 +3,7 @@
        FUSE-based exFAT implementation. Requires FUSE 2.6 or later.
 
        Free exFAT implementation.
-       Copyright (C) 2010-2014  Andrew Nayenko
+       Copyright (C) 2010-2015  Andrew Nayenko
 
        This program is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
@@ -20,6 +20,7 @@
        51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
+#include <exfat.h>
 #define FUSE_USE_VERSION 26
 #include <fuse.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <exfat.h>
 #include <inttypes.h>
 #include <limits.h>
 #include <sys/types.h>
 #include <pwd.h>
 #include <unistd.h>
 
-#define exfat_debug(format, ...)
+#ifndef DEBUG
+       #define exfat_debug(format, ...)
+#endif
 
 #if !defined(FUSE_VERSION) || (FUSE_VERSION < 26)
        #error FUSE 2.6 or later is required
 #endif
 
 const char* default_options = "ro_fallback,allow_other,blkdev,big_writes,"
-               "defer_permissions";
+               "default_permissions";
 
 struct exfat ef;
 
@@ -53,6 +55,7 @@ static struct exfat_node* get_node(const struct fuse_file_info* fi)
 static void set_node(struct fuse_file_info* fi, struct exfat_node* node)
 {
        fi->fh = (uint64_t) (size_t) node;
+       fi->keep_cache = 1;
 }
 
 static int fuse_exfat_getattr(const char* path, struct stat* stbuf)
@@ -150,7 +153,24 @@ static int fuse_exfat_open(const char* path, struct fuse_file_info* fi)
        if (rc != 0)
                return rc;
        set_node(fi, node);
-       fi->keep_cache = 1;
+       return 0;
+}
+
+static int fuse_exfat_create(const char* path, mode_t mode,
+               struct fuse_file_info* fi)
+{
+       struct exfat_node* node;
+       int rc;
+
+       exfat_debug("[%s] %s 0%ho", __func__, path, mode);
+
+       rc = exfat_mknod(&ef, path);
+       if (rc != 0)
+               return rc;
+       rc = exfat_lookup(&ef, &node, path);
+       if (rc != 0)
+               return rc;
+       set_node(fi, node);
        return 0;
 }
 
@@ -357,6 +377,7 @@ static struct fuse_operations fuse_exfat_ops =
        .truncate       = fuse_exfat_truncate,
        .readdir        = fuse_exfat_readdir,
        .open           = fuse_exfat_open,
+       .create         = fuse_exfat_create,
        .release        = fuse_exfat_release,
        .flush          = fuse_exfat_flush,
        .fsync          = fuse_exfat_fsync,
@@ -459,8 +480,7 @@ int main(int argc, char* argv[])
        struct fuse* fh = NULL;
        int opt;
 
-       printf("FUSE exfat %u.%u.%u\n",
-                       EXFAT_VERSION_MAJOR, EXFAT_VERSION_MINOR, EXFAT_VERSION_PATCH);
+       printf("FUSE exfat %s\n", VERSION);
 
        mount_options = strdup(default_options);
        if (mount_options == NULL)
@@ -485,7 +505,7 @@ int main(int argc, char* argv[])
                        break;
                case 'V':
                        free(mount_options);
-                       puts("Copyright (C) 2010-2014  Andrew Nayenko");
+                       puts("Copyright (C) 2010-2015  Andrew Nayenko");
                        return 0;
                case 'v':
                        break;