OSDN Git Service

Add fsname parameter as is, without canonicalization and symbolic links expansion...
[android-x86/external-exfat.git] / fuse / main.c
index ee1e505..53bafc1 100644 (file)
@@ -2,7 +2,7 @@
        main.c (01.09.09)
        FUSE-based exFAT implementation. Requires FUSE 2.6 or later.
 
-       Copyright (C) 2010-2012  Andrew Nayenko
+       Copyright (C) 2010-2013  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
@@ -38,7 +38,8 @@
        #error FUSE 2.6 or later is required
 #endif
 
-const char* default_options = "ro_fallback,allow_other,blkdev,big_writes";
+const char* default_options = "ro_fallback,allow_other,blkdev,big_writes,"
+               "defer_permissions";
 
 struct exfat ef;
 
@@ -154,19 +155,25 @@ static int fuse_exfat_release(const char* path, struct fuse_file_info* fi)
 static int fuse_exfat_read(const char* path, char* buffer, size_t size,
                off_t offset, struct fuse_file_info* fi)
 {
+       ssize_t ret;
+
        exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
-       if (exfat_generic_pread(&ef, get_node(fi), buffer, size, offset) != size)
-               return EOF;
-       return size;
+       ret = exfat_generic_pread(&ef, get_node(fi), buffer, size, offset);
+       if (ret < 0)
+               return -EIO;
+       return ret;
 }
 
 static int fuse_exfat_write(const char* path, const char* buffer, size_t size,
                off_t offset, struct fuse_file_info* fi)
 {
+       ssize_t ret;
+
        exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
-       if (exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset) != size)
-               return EOF;
-       return size;
+       ret = exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset);
+       if (ret < 0)
+               return -EIO;
+       return ret;
 }
 
 static int fuse_exfat_unlink(const char* path)
@@ -305,7 +312,7 @@ static struct fuse_operations fuse_exfat_ops =
        .rename         = fuse_exfat_rename,
        .utimens        = fuse_exfat_utimens,
 #ifdef __APPLE__
-       .chmod          = fuse_exfat_chmod,
+       .chmod          = fuse_exfat_chmod,
 #endif
        .statfs         = fuse_exfat_statfs,
        .init           = fuse_exfat_init,
@@ -337,19 +344,6 @@ static char* add_option(char* options, const char* name, const char* value)
        return options;
 }
 
-static char* add_fsname_option(char* options, const char* spec)
-{
-       char spec_abs[PATH_MAX];
-
-       if (realpath(spec, spec_abs) == NULL)
-       {
-               free(options);
-               exfat_error("failed to get absolute path for `%s'", spec);
-               return NULL;
-       }
-       return add_option(options, "fsname", spec_abs);
-}
-
 static char* add_user_option(char* options)
 {
        struct passwd* pw;
@@ -381,7 +375,7 @@ static char* add_blksize_option(char* options, long cluster_size)
 
 static char* add_fuse_options(char* options, const char* spec)
 {
-       options = add_fsname_option(options, spec);
+       options = add_option(options, "fsname", spec);
        if (options == NULL)
                return NULL;
        options = add_user_option(options);
@@ -432,7 +426,7 @@ int main(int argc, char* argv[])
                else if (strcmp(*pp, "-v") == 0)
                {
                        free(mount_options);
-                       puts("Copyright (C) 2010-2012  Andrew Nayenko");
+                       puts("Copyright (C) 2010-2013  Andrew Nayenko");
                        return 0;
                }
                else if (spec == NULL)