From 68e2756a3f808ebe14b41efa5d950e4e05ffa181 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Arkadiusz=20Mi=C5=9Bkiewicz?= Date: Sun, 5 May 2013 10:38:20 +0200 Subject: [PATCH] - rel 2; tiny fixes from svn --- exfat-svn-fuse.patch | 212 +++++++++++++++++++++++++++++++++++++++ exfat-svn-libexfat.patch | 122 ++++++++++++++++++++++ fuse-exfat.spec | 10 +- 3 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 exfat-svn-fuse.patch create mode 100644 exfat-svn-libexfat.patch diff --git a/exfat-svn-fuse.patch b/exfat-svn-fuse.patch new file mode 100644 index 0000000..bf0d195 --- /dev/null +++ b/exfat-svn-fuse.patch @@ -0,0 +1,212 @@ +Index: main.c +=================================================================== +--- main.c (wersja 342) ++++ main.c (wersja 353) +@@ -80,7 +80,7 @@ + if (rc != 0) + return rc; + +- rc = exfat_truncate(&ef, node, size); ++ rc = exfat_truncate(&ef, node, size, true); + exfat_put_node(&ef, node); + return rc; + } +@@ -242,15 +242,25 @@ + return 0; + } + +-#ifdef __APPLE__ + static int fuse_exfat_chmod(const char* path, mode_t mode) + { ++ const mode_t VALID_MODE_MASK = S_IFREG | S_IFDIR | ++ S_IRWXU | S_IRWXG | S_IRWXO; ++ + exfat_debug("[%s] %s 0%ho", __func__, path, mode); +- /* make OS X utilities happy */ ++ if (mode & ~VALID_MODE_MASK) ++ return -EPERM; + return 0; + } +-#endif + ++static int fuse_exfat_chown(const char* path, uid_t uid, gid_t gid) ++{ ++ exfat_debug("[%s] %s %u:%u", __func__, path, uid, gid); ++ if (uid != ef.uid || gid != ef.gid) ++ return -EPERM; ++ return 0; ++} ++ + static int fuse_exfat_statfs(const char* path, struct statvfs* sfs) + { + exfat_debug("[%s]", __func__); +@@ -292,7 +302,7 @@ + + static void usage(const char* prog) + { +- fprintf(stderr, "Usage: %s [-d] [-o options] [-v] \n", prog); ++ fprintf(stderr, "Usage: %s [-d] [-o options] [-V] \n", prog); + exit(1); + } + +@@ -311,9 +321,8 @@ + .mkdir = fuse_exfat_mkdir, + .rename = fuse_exfat_rename, + .utimens = fuse_exfat_utimens, +-#ifdef __APPLE__ + .chmod = fuse_exfat_chmod, +-#endif ++ .chown = fuse_exfat_chown, + .statfs = fuse_exfat_statfs, + .init = fuse_exfat_init, + .destroy = fuse_exfat_destroy, +@@ -344,21 +353,6 @@ + return options; + } + +-static char* add_fsname_option(char* options, const char* spec) +-{ +- char* spec_abs = realpath(spec, NULL); +- +- if (spec_abs == NULL) +- { +- free(options); +- exfat_error("failed to get absolute path for `%s'", spec); +- return NULL; +- } +- options = add_option(options, "fsname", spec_abs); +- free(spec_abs); +- return options; +-} +- + static char* add_user_option(char* options) + { + struct passwd* pw; +@@ -390,7 +384,7 @@ + + 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); +@@ -413,7 +407,7 @@ + int debug = 0; + struct fuse_chan* fc = NULL; + struct fuse* fh = NULL; +- char** pp; ++ int opt; + + printf("FUSE exfat %u.%u.%u\n", + EXFAT_VERSION_MAJOR, EXFAT_VERSION_MINOR, EXFAT_VERSION_PATCH); +@@ -425,40 +419,39 @@ + return 1; + } + +- for (pp = argv + 1; *pp; pp++) ++ while ((opt = getopt(argc, argv, "dno:Vv")) != -1) + { +- if (strcmp(*pp, "-o") == 0) ++ switch (opt) + { +- pp++; +- if (*pp == NULL) +- usage(argv[0]); +- mount_options = add_option(mount_options, *pp, NULL); ++ case 'd': ++ debug = 1; ++ break; ++ case 'n': ++ break; ++ case 'o': ++ mount_options = add_option(mount_options, optarg, NULL); + if (mount_options == NULL) + return 1; +- } +- else if (strcmp(*pp, "-d") == 0) +- debug = 1; +- else if (strcmp(*pp, "-v") == 0) +- { ++ break; ++ case 'V': + free(mount_options); + puts("Copyright (C) 2010-2013 Andrew Nayenko"); + return 0; +- } +- else if (spec == NULL) +- spec = *pp; +- else if (mount_point == NULL) +- mount_point = *pp; +- else +- { ++ case 'v': ++ break; ++ default: + free(mount_options); + usage(argv[0]); ++ break; + } + } +- if (spec == NULL || mount_point == NULL) ++ if (argc - optind != 2) + { + free(mount_options); + usage(argv[0]); + } ++ spec = argv[optind]; ++ mount_point = argv[optind + 1]; + + if (exfat_mount(&ef, spec, mount_options) != 0) + { +Index: mount.exfat-fuse.8 +=================================================================== +--- mount.exfat-fuse.8 (wersja 342) ++++ mount.exfat-fuse.8 (wersja 353) +@@ -9,10 +9,16 @@ + .B \-d + ] + [ ++.B \-n ++] ++[ + .B \-o + .I options + ] + [ ++.B \-V ++] ++[ + .B \-v + ] + .I device dir +@@ -21,7 +27,7 @@ + .B mount.exfat-fuse + is a free exFAT file system implementation with write support. exFAT is a + simple file system created by Microsoft. It is intended to replace FAT32 +-removing some of it's limitations. exFAT is a standard FS for SDXC memory ++removing some of its limitations. exFAT is a standard FS for SDXC memory + cards. + + .SH COMMAND LINE OPTIONS +@@ -30,13 +36,19 @@ + .BI \-d + Enable debug logging and do not detach from shell. + .TP ++.BI \-n ++Ignored. ++.TP + .BI \-o " options" + File system specific options. For more details see + .B FILE SYSTEM OPTIONS + section below. + .TP ++.BI \-V ++Print version and copyright. ++.TP + .BI \-v +-Print version and copyright. ++Ignored. + + .SH FILE SYSTEM OPTIONS + .TP diff --git a/exfat-svn-libexfat.patch b/exfat-svn-libexfat.patch new file mode 100644 index 0000000..4ebe69f --- /dev/null +++ b/exfat-svn-libexfat.patch @@ -0,0 +1,122 @@ +Index: cluster.c +=================================================================== +--- cluster.c (wersja 342) ++++ cluster.c (wersja 353) +@@ -134,7 +134,7 @@ + ef->cmap.dirty = false; + } + +-static void set_next_cluster(const struct exfat* ef, int contiguous, ++static void set_next_cluster(const struct exfat* ef, bool contiguous, + cluster_t current, cluster_t next) + { + off_t fat_offset; +@@ -187,7 +187,7 @@ + cluster_t c; + + for (c = first; c < last; c++) +- set_next_cluster(ef, 0, c, c + 1); ++ set_next_cluster(ef, false, c, c + 1); + } + + static int shrink_file(struct exfat* ef, struct exfat_node* node, +@@ -344,7 +344,8 @@ + return 0; + } + +-int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size) ++int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size, ++ bool erase) + { + uint32_t c1 = bytes2clusters(ef, node->size); + uint32_t c2 = bytes2clusters(ef, size); +@@ -364,9 +365,12 @@ + if (rc != 0) + return rc; + +- rc = erase_range(ef, node, node->size, size); +- if (rc != 0) +- return rc; ++ if (erase) ++ { ++ rc = erase_range(ef, node, node->size, size); ++ if (rc != 0) ++ return rc; ++ } + + exfat_update_mtime(node); + node->size = size; +Index: node.c +=================================================================== +--- node.c (wersja 342) ++++ node.c (wersja 353) +@@ -56,7 +56,7 @@ + if (node->flags & EXFAT_ATTRIB_UNLINKED) + { + /* free all clusters and node structure itself */ +- exfat_truncate(ef, node, 0); ++ exfat_truncate(ef, node, 0, true); + free(node); + } + if (ef->cmap.dirty) +@@ -627,7 +627,7 @@ + new_size = CLUSTER_SIZE(*ef->sb); + if (new_size == dir->size) + return 0; +- rc = exfat_truncate(ef, dir, new_size); ++ rc = exfat_truncate(ef, dir, new_size, true); + if (rc != 0) + return rc; + return 0; +@@ -673,7 +673,7 @@ + { + return exfat_truncate(ef, dir, + DIV_ROUND_UP(asize + difference, CLUSTER_SIZE(*ef->sb)) +- * CLUSTER_SIZE(*ef->sb)); ++ * CLUSTER_SIZE(*ef->sb), true); + } + + static int find_slot(struct exfat* ef, struct exfat_node* dir, +@@ -826,7 +826,7 @@ + if (rc != 0) + return 0; + /* directories always have at least one cluster */ +- rc = exfat_truncate(ef, node, CLUSTER_SIZE(*ef->sb)); ++ rc = exfat_truncate(ef, node, CLUSTER_SIZE(*ef->sb), true); + if (rc != 0) + { + delete(ef, node); +Index: io.c +=================================================================== +--- io.c (wersja 342) ++++ io.c (wersja 353) +@@ -351,9 +351,12 @@ + const char* bufp = buffer; + off_t lsize, loffset, remainder; + +- if (offset + size > node->size) +- if (exfat_truncate(ef, node, offset + size) != 0) +- return -1; ++ if (offset > node->size) ++ if (exfat_truncate(ef, node, offset, true) != 0) ++ return -1; ++ if (offset + size > node->size) ++ if (exfat_truncate(ef, node, offset + size, false) != 0) ++ return -1; + if (size == 0) + return 0; + +Index: exfat.h +=================================================================== +--- exfat.h (wersja 342) ++++ exfat.h (wersja 353) +@@ -164,7 +164,8 @@ + cluster_t exfat_advance_cluster(const struct exfat* ef, + struct exfat_node* node, uint32_t count); + void exfat_flush_cmap(struct exfat* ef); +-int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size); ++int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size, ++ bool erase); + uint32_t exfat_count_free_clusters(const struct exfat* ef); + int exfat_find_used_sectors(const struct exfat* ef, off_t* a, off_t* b); + diff --git a/fuse-exfat.spec b/fuse-exfat.spec index 84a5c9c..08da885 100644 --- a/fuse-exfat.spec +++ b/fuse-exfat.spec @@ -2,12 +2,16 @@ Summary: FUSE module to access exFAT filesystem Summary(pl.UTF-8): Moduł FUSE pozwalający na dostęp do systemu plików exFAT Name: fuse-exfat Version: 1.0.1 -Release: 1 +Release: 2 License: GPL v3+ Group: Applications/System #Source0Download: http://code.google.com/p/exfat/downloads/list Source0: http://exfat.googlecode.com/files/%{name}-%{version}.tar.gz # Source0-md5: 7988a5111841593231f20af22153362d +# svn diff -r342:HEAD http://exfat.googlecode.com/svn/trunk/fuse > exfat-svn-fuse.patch +Patch0: exfat-svn-fuse.patch +# svn diff -r342:HEAD http://exfat.googlecode.com/svn/trunk/libexfat > exfat-svn-libexfat.patch +Patch1: exfat-svn-libexfat.patch URL: http://code.google.com/p/exfat/ BuildRequires: libfuse-devel >= 2.6 BuildRequires: rpmbuild(macros) >= 1.385 @@ -26,6 +30,10 @@ moduł FUSE. %prep %setup -q +cd fuse +%patch0 -p0 +cd ../libexfat +%patch1 -p0 %build %scons -- 2.44.0