X-Git-Url: http://git.sven.stormbind.net/?a=blobdiff_plain;f=fuse%2Fmain.c;h=3c91b12f446740bd57bfda5c25f0b28dfcfc79fe;hb=914023217c196c0831fe3295d9d8c7176b7e3609;hp=aad082b68f21265f21686cdab57097ecafc60b4d;hpb=1166675ac1cefab70acdf900c238a9e2b726e2de;p=sven%2Ffuse-exfat.git diff --git a/fuse/main.c b/fuse/main.c index aad082b..3c91b12 100644 --- a/fuse/main.c +++ b/fuse/main.c @@ -3,7 +3,7 @@ FUSE-based exFAT implementation. Requires FUSE 2.6 or later. Free exFAT implementation. - Copyright (C) 2010-2015 Andrew Nayenko + Copyright (C) 2010-2017 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 @@ -104,17 +104,17 @@ static int fuse_exfat_readdir(const char* path, void* buffer, struct exfat_node* node; struct exfat_iterator it; int rc; - char name[UTF8_BYTES(EXFAT_NAME_MAX) + 1]; + char name[EXFAT_UTF8_NAME_BUFFER_MAX]; exfat_debug("[%s] %s", __func__, path); rc = exfat_lookup(&ef, &parent, path); if (rc != 0) return rc; - if (!(parent->flags & EXFAT_ATTRIB_DIR)) + if (!(parent->attrib & EXFAT_ATTRIB_DIR)) { exfat_put_node(&ef, parent); - exfat_error("'%s' is not a directory (0x%x)", path, parent->flags); + exfat_error("'%s' is not a directory (%#hx)", path, parent->attrib); return -ENOTDIR; } @@ -130,9 +130,9 @@ static int fuse_exfat_readdir(const char* path, void* buffer, } while ((node = exfat_readdir(&ef, &it))) { - exfat_get_name(node, name, sizeof(name) - 1); + exfat_get_name(node, name); exfat_debug("[%s] %s: %s, %"PRId64" bytes, cluster 0x%x", __func__, - name, IS_CONTIGUOUS(*node) ? "contiguous" : "fragmented", + name, node->is_contiguous ? "contiguous" : "fragmented", node->size, node->start_cluster); filler(buffer, name, NULL, 0); exfat_put_node(&ef, node); @@ -218,25 +218,15 @@ static int fuse_exfat_fsync(const char* path, int datasync, 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); - ret = exfat_generic_pread(&ef, get_node(fi), buffer, size, offset); - if (ret < 0) - return -EIO; - return ret; + return exfat_generic_pread(&ef, get_node(fi), buffer, size, offset); } 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); - ret = exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset); - if (ret < 0) - return -EIO; - return ret; + return exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset); } static int fuse_exfat_unlink(const char* path) @@ -427,6 +417,36 @@ static char* add_option(char* options, const char* name, const char* value) return options; } +static void escape(char* escaped, const char* orig) +{ + do + { + if (*orig == ',' || *orig == '\\') + *escaped++ = '\\'; + } + while ((*escaped++ = *orig++)); +} + +static char* add_fsname_option(char* options, const char* spec) +{ + /* escaped string cannot be more than twice as big as the original one */ + char* escaped = malloc(strlen(spec) * 2 + 1); + + if (escaped == NULL) + { + free(options); + exfat_error("failed to allocate escaped string for %s", spec); + return NULL; + } + + /* on some platforms (e.g. Android, Solaris) device names can contain + commas */ + escape(escaped, spec); + options = add_option(options, "fsname", escaped); + free(escaped); + return options; +} + static char* add_user_option(char* options) { struct passwd* pw; @@ -458,7 +478,7 @@ static char* add_blksize_option(char* options, long cluster_size) static char* add_fuse_options(char* options, const char* spec) { - options = add_option(options, "fsname", spec); + options = add_fsname_option(options, spec); if (options == NULL) return NULL; options = add_user_option(options); @@ -508,7 +528,7 @@ int main(int argc, char* argv[]) break; case 'V': free(mount_options); - puts("Copyright (C) 2010-2015 Andrew Nayenko"); + puts("Copyright (C) 2010-2017 Andrew Nayenko"); return 0; case 'v': break;