Hello community, here is the log from the commit of package fuse-exfat for openSUSE:Factory checked in at 2018-12-12 17:31:40 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fuse-exfat (Old) and /work/SRC/openSUSE:Factory/.fuse-exfat.new.28833 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fuse-exfat" Wed Dec 12 17:31:40 2018 rev:2 rq:657516 version:1.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/fuse-exfat/fuse-exfat.changes 2017-12-04 10:01:29.742332959 +0100 +++ /work/SRC/openSUSE:Factory/.fuse-exfat.new.28833/fuse-exfat.changes 2018-12-12 17:31:44.970629238 +0100 @@ -1,0 +2,19 @@ +Tue Dec 11 13:49:16 UTC 2018 - Jan Engelhardt <[email protected]> + +- Trim filler wording from description. + +------------------------------------------------------------------- +Mon Dec 10 20:26:48 UTC 2018 - [email protected] + +- fuse-exfat 1.3.0: + * Clean up FUSE code preparing for FUSE 3 support + +------------------------------------------------------------------- +Mon Dec 10 20:18:13 UTC 2018 - [email protected] + +- fuse-exfat 1.2.8: + * Fixed new files or directories creation in the root directory: + ensure there are no 0x00 entries before valid ones; otherwise + Windows can corrupt them boo#1118871 + +------------------------------------------------------------------- Old: ---- fuse-exfat-1.2.7.tar.gz New: ---- fuse-exfat-1.3.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fuse-exfat.spec ++++++ --- /var/tmp/diff_new_pack.CHer4U/_old 2018-12-12 17:31:45.706628310 +0100 +++ /var/tmp/diff_new_pack.CHer4U/_new 2018-12-12 17:31:45.710628304 +0100 @@ -1,7 +1,7 @@ # # spec file for package fuse-exfat # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # Copyright (c) 2013 Sidlovsky, Yaroslav <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -13,32 +13,31 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # Name: fuse-exfat -Version: 1.2.7 +Version: 1.3.0 Release: 0 -Summary: Free exFAT file system implementation -License: GPL-2.0+ +Summary: exFAT file system implementation +License: GPL-2.0-or-later Group: System/Filesystems -Url: https://github.com/relan/exfat +URL: https://github.com/relan/exfat Source0: https://github.com/relan/exfat/releases/download/v%{version}/%{name}-%{version}.tar.gz BuildRequires: autoconf BuildRequires: automake BuildRequires: fuse-devel >= 2.6 BuildRequires: libtool -BuildRequires: pkg-config +BuildRequires: pkgconfig Requires: fuse >= 2.6 Recommends: exfat-utils -BuildRoot: %{_tmppath}/%{name}-%{version}-build %description -This driver is the first 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 cards. +This driver is an 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 its limitations. exFAT is +a standard FS for SDXC memory cards. %prep %setup -q @@ -75,13 +74,13 @@ fi %files -%defattr(-,root,root) -%doc ChangeLog COPYING README +%license COPYING +%doc ChangeLog README #UsrMerge /sbin/* #EndUsrMerge %{_sbindir}/mount.exfat %{_sbindir}/mount.exfat-fuse -%{_mandir}/man8/mount.exfat-fuse.8%{ext_man} +%{_mandir}/man8/mount.exfat-fuse.8%{?ext_man} %changelog ++++++ fuse-exfat-1.2.7.tar.gz -> fuse-exfat-1.3.0.tar.gz ++++++ ++++ 4955 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/ChangeLog new/fuse-exfat-1.3.0/ChangeLog --- old/fuse-exfat-1.2.7/ChangeLog 2017-06-05 09:04:11.000000000 +0200 +++ new/fuse-exfat-1.3.0/ChangeLog 2018-09-15 07:04:52.000000000 +0200 @@ -1,3 +1,20 @@ +1.3.0 (2018-09-15) + +* exfatfsck can now repair some errors. +* Added experimental Android support for exfat-utils [liminghao, LongPingWEI, +Pablo Mendez Hernandez, Pierre-Hugues Husson]. +* Cleaned up FUSE code preparing for FUSE 3 support. +* Removed OpenBSD support as it does not handle -o option in fuse_main(). +* Re-introduced FreeBSD support [Oleksii Samorukov]. +* Fixed DragonFly BSD support [Tomohiro Kusumi]. +* dirent->d_type in now filled on readdir() [Mark Browning]. + +1.2.8 (2018-02-03) + +* Fixed new files or directories creation in the root directory: ensure there +are no 0x00 entries before valid ones; otherwise Windows can corrupt them. +* Fixed compilation on GNU/HURD platform. + 1.2.7 (2017-06-05) * Fixed handling of two last clusters: operations with files that occupy these diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/Makefile.am new/fuse-exfat-1.3.0/Makefile.am --- old/fuse-exfat-1.2.7/Makefile.am 2017-06-05 09:05:51.000000000 +0200 +++ new/fuse-exfat-1.3.0/Makefile.am 2018-09-15 07:05:57.000000000 +0200 @@ -3,7 +3,7 @@ # Automake source. # # Free exFAT implementation. -# Copyright (C) 2010-2017 Andrew Nayenko +# Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/README new/fuse-exfat-1.3.0/README --- old/fuse-exfat-1.2.7/README 2017-06-05 09:05:51.000000000 +0200 +++ new/fuse-exfat-1.3.0/README 2018-09-15 07:05:57.000000000 +0200 @@ -7,7 +7,7 @@ * GNU/Linux * Mac OS X 10.5 or later -* OpenBSD +* FreeBSD Most GNU/Linux distributions already have fuse-exfat and exfat-utils in their repositories, so you can just install and use them. The next chapter describes how to compile them from source. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/configure.ac new/fuse-exfat-1.3.0/configure.ac --- old/fuse-exfat-1.2.7/configure.ac 2017-06-05 09:05:51.000000000 +0200 +++ new/fuse-exfat-1.3.0/configure.ac 2018-09-15 07:05:57.000000000 +0200 @@ -3,7 +3,7 @@ # Autoconf source. # # Free exFAT implementation. -# Copyright (C) 2010-2017 Andrew Nayenko +# Copyright (C) 2010-2018 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 @@ -21,7 +21,7 @@ # AC_INIT([Free exFAT implementation], - [1.2.7], + [1.3.0], [[email protected]], [fuse-exfat], [https://github.com/relan/exfat]) @@ -31,6 +31,12 @@ AC_PROG_RANLIB AM_PROG_AR AC_SYS_LARGEFILE +PKG_CHECK_MODULES([UBLIO], [libublio], [ + CFLAGS="$CFLAGS $UBLIO_CFLAGS" + LIBS="$LIBS $UBLIO_LIBS" + AC_DEFINE([USE_UBLIO], [1], + [Define if block devices are not supported.]) +], [:]) PKG_CHECK_MODULES([FUSE], [fuse]) AC_CONFIG_HEADERS([libexfat/config.h]) AC_CONFIG_FILES([ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/fuse/Makefile.am new/fuse-exfat-1.3.0/fuse/Makefile.am --- old/fuse-exfat-1.2.7/fuse/Makefile.am 2017-06-05 08:49:02.000000000 +0200 +++ new/fuse-exfat-1.3.0/fuse/Makefile.am 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ # Automake source. # # Free exFAT implementation. -# Copyright (C) 2010-2017 Andrew Nayenko +# Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/fuse/main.c new/fuse-exfat-1.3.0/fuse/main.c --- old/fuse-exfat-1.2.7/fuse/main.c 2017-06-05 08:49:02.000000000 +0200 +++ new/fuse-exfat-1.3.0/fuse/main.c 2018-09-15 07:04:52.000000000 +0200 @@ -3,7 +3,7 @@ FUSE-based exFAT implementation. Requires FUSE 2.6 or later. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 @@ -42,9 +42,6 @@ #error FUSE 2.6 or later is required #endif -const char* default_options = "ro_fallback,allow_other,blkdev,big_writes," - "default_permissions"; - struct exfat ef; static struct exfat_node* get_node(const struct fuse_file_info* fi) @@ -105,6 +102,7 @@ struct exfat_iterator it; int rc; char name[EXFAT_UTF8_NAME_BUFFER_MAX]; + struct stat stbuf; exfat_debug("[%s] %s", __func__, path); @@ -134,7 +132,8 @@ exfat_debug("[%s] %s: %s, %"PRId64" bytes, cluster 0x%x", __func__, name, node->is_contiguous ? "contiguous" : "fragmented", node->size, node->start_cluster); - filler(buffer, name, NULL, 0); + exfat_stat(&ef, node, &stbuf); + filler(buffer, name, &stbuf, 0); exfat_put_node(&ef, node); } exfat_closedir(&ef, &it); @@ -447,6 +446,12 @@ return options; } +static char* add_ro_option(char* options, bool ro) +{ + return ro ? add_option(options, "ro", NULL) : options; +} + +#if defined(__linux__) || defined(__FreeBSD__) static char* add_user_option(char* options) { struct passwd* pw; @@ -463,7 +468,9 @@ } return add_option(options, "user", pw->pw_name); } +#endif +#if defined(__linux__) static char* add_blksize_option(char* options, long cluster_size) { long page_size = sysconf(_SC_PAGESIZE); @@ -475,38 +482,57 @@ snprintf(blksize, sizeof(blksize), "%ld", MIN(page_size, cluster_size)); return add_option(options, "blksize", blksize); } +#endif -static char* add_fuse_options(char* options, const char* spec) +static char* add_fuse_options(char* options, const char* spec, bool ro) { options = add_fsname_option(options, spec); if (options == NULL) return NULL; + options = add_ro_option(options, ro); + if (options == NULL) + return NULL; +#if defined(__linux__) || defined(__FreeBSD__) options = add_user_option(options); if (options == NULL) return NULL; +#endif +#if defined(__linux__) options = add_blksize_option(options, CLUSTER_SIZE(*ef.sb)); if (options == NULL) return NULL; - +#endif return options; } +static int fuse_exfat_main(char* mount_options, char* mount_point) +{ + char* argv[] = {"exfat", "-s", "-o", mount_options, mount_point, NULL}; + return fuse_main(sizeof(argv) / sizeof(argv[0]) - 1, argv, + &fuse_exfat_ops, NULL); +} + int main(int argc, char* argv[]) { - struct fuse_args mount_args = FUSE_ARGS_INIT(0, NULL); - struct fuse_args newfs_args = FUSE_ARGS_INIT(0, NULL); const char* spec = NULL; - const char* mount_point = NULL; - char* mount_options; - int debug = 0; - struct fuse_chan* fc = NULL; - struct fuse* fh = NULL; + char* mount_point = NULL; + char* fuse_options; + char* exfat_options; int opt; + int rc; printf("FUSE exfat %s\n", VERSION); - mount_options = strdup(default_options); - if (mount_options == NULL) + fuse_options = strdup("allow_other," +#if defined(__linux__) || defined(__FreeBSD__) + "big_writes," +#endif +#if defined(__linux__) + "blkdev," +#endif + "default_permissions"); + exfat_options = strdup("ro_fallback"); + if (fuse_options == NULL || exfat_options == NULL) { exfat_error("failed to allocate options string"); return 1; @@ -517,122 +543,65 @@ switch (opt) { case 'd': - debug = 1; + fuse_options = add_option(fuse_options, "debug", NULL); + if (fuse_options == NULL) + { + free(exfat_options); + return 1; + } break; case 'n': break; case 'o': - mount_options = add_option(mount_options, optarg, NULL); - if (mount_options == NULL) + exfat_options = add_option(exfat_options, optarg, NULL); + if (exfat_options == NULL) + { + free(fuse_options); return 1; + } break; case 'V': - free(mount_options); - puts("Copyright (C) 2010-2017 Andrew Nayenko"); + free(exfat_options); + free(fuse_options); + puts("Copyright (C) 2010-2018 Andrew Nayenko"); return 0; case 'v': break; default: - free(mount_options); + free(exfat_options); + free(fuse_options); usage(argv[0]); break; } } if (argc - optind != 2) { - free(mount_options); + free(exfat_options); + free(fuse_options); usage(argv[0]); } spec = argv[optind]; mount_point = argv[optind + 1]; - if (exfat_mount(&ef, spec, mount_options) != 0) + if (exfat_mount(&ef, spec, exfat_options) != 0) { - free(mount_options); + free(exfat_options); + free(fuse_options); return 1; } - if (ef.ro == -1) /* read-only fallback was used */ - { - mount_options = add_option(mount_options, "ro", NULL); - if (mount_options == NULL) - { - exfat_unmount(&ef); - return 1; - } - } - - mount_options = add_fuse_options(mount_options, spec); - if (mount_options == NULL) - { - exfat_unmount(&ef); - return 1; - } + free(exfat_options); - /* create arguments for fuse_mount() */ - if (fuse_opt_add_arg(&mount_args, "exfat") != 0 || - fuse_opt_add_arg(&mount_args, "-o") != 0 || - fuse_opt_add_arg(&mount_args, mount_options) != 0) + fuse_options = add_fuse_options(fuse_options, spec, ef.ro != 0); + if (fuse_options == NULL) { exfat_unmount(&ef); - free(mount_options); return 1; } - free(mount_options); + /* let FUSE do all its wizardry */ + rc = fuse_exfat_main(fuse_options, mount_point); - /* create FUSE mount point */ - fc = fuse_mount(mount_point, &mount_args); - fuse_opt_free_args(&mount_args); - if (fc == NULL) - { - exfat_unmount(&ef); - return 1; - } - - /* create arguments for fuse_new() */ - if (fuse_opt_add_arg(&newfs_args, "") != 0 || - (debug && fuse_opt_add_arg(&newfs_args, "-d") != 0)) - { - fuse_unmount(mount_point, fc); - exfat_unmount(&ef); - return 1; - } - - /* create new FUSE file system */ - fh = fuse_new(fc, &newfs_args, &fuse_exfat_ops, - sizeof(struct fuse_operations), NULL); - fuse_opt_free_args(&newfs_args); - if (fh == NULL) - { - fuse_unmount(mount_point, fc); - exfat_unmount(&ef); - return 1; - } - - /* exit session on HUP, TERM and INT signals and ignore PIPE signal */ - if (fuse_set_signal_handlers(fuse_get_session(fh)) != 0) - { - fuse_unmount(mount_point, fc); - fuse_destroy(fh); - exfat_unmount(&ef); - exfat_error("failed to set signal handlers"); - return 1; - } - - /* go to background (unless "-d" option is passed) and run FUSE - main loop */ - if (fuse_daemonize(debug) == 0) - { - if (fuse_loop(fh) != 0) - exfat_error("FUSE loop failure"); - } - else - exfat_error("failed to daemonize"); - - fuse_remove_signal_handlers(fuse_get_session(fh)); - /* note that fuse_unmount() must be called BEFORE fuse_destroy() */ - fuse_unmount(mount_point, fc); - fuse_destroy(fh); - return 0; + free(fuse_options); + return rc; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/fuse/mount.exfat-fuse.8 new/fuse-exfat-1.3.0/fuse/mount.exfat-fuse.8 --- old/fuse-exfat-1.2.7/fuse/mount.exfat-fuse.8 2017-05-03 07:37:23.000000000 +0200 +++ new/fuse-exfat-1.3.0/fuse/mount.exfat-fuse.8 2018-09-15 07:04:52.000000000 +0200 @@ -1,6 +1,6 @@ .\" Copyright (C) 2010-2016 Andrew Nayenko .\" -.TH EXFAT-FUSE 8 "July 2010" +.TH EXFAT-FUSE 8 "November 2015" .SH NAME mount.exfat-fuse \- mount an exFAT file system .SH SYNOPSIS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/Makefile.am new/fuse-exfat-1.3.0/libexfat/Makefile.am --- old/fuse-exfat-1.2.7/libexfat/Makefile.am 2017-05-02 19:28:31.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/Makefile.am 2018-09-15 07:04:52.000000000 +0200 @@ -3,7 +3,7 @@ # Automake source. # # Free exFAT implementation. -# Copyright (C) 2010-2017 Andrew Nayenko +# Copyright (C) 2010-2018 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 @@ -33,6 +33,7 @@ mount.c \ node.c \ platform.h \ + repair.c \ time.c \ utf.c \ utils.c diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/byteorder.h new/fuse-exfat-1.3.0/libexfat/byteorder.h --- old/fuse-exfat-1.2.7/libexfat/byteorder.h 2017-05-02 19:28:31.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/byteorder.h 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ Endianness stuff. exFAT uses little-endian byte order. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/cluster.c new/fuse-exfat-1.3.0/libexfat/cluster.c --- old/fuse-exfat-1.2.7/libexfat/cluster.c 2017-05-30 17:18:46.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/cluster.c 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/compiler.h new/fuse-exfat-1.3.0/libexfat/compiler.h --- old/fuse-exfat-1.2.7/libexfat/compiler.h 2017-05-18 09:44:16.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/compiler.h 2018-09-15 06:12:42.000000000 +0200 @@ -4,7 +4,7 @@ showstopper. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/config.h.in new/fuse-exfat-1.3.0/libexfat/config.h.in --- old/fuse-exfat-1.2.7/libexfat/config.h.in 2017-06-05 09:05:55.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/config.h.in 2018-09-15 07:06:02.000000000 +0200 @@ -21,6 +21,9 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* Define if block devices are not supported. */ +#undef USE_UBLIO + /* Version number of package */ #undef VERSION diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/exfat.h new/fuse-exfat-1.3.0/libexfat/exfat.h --- old/fuse-exfat-1.2.7/libexfat/exfat.h 2017-05-30 17:18:46.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/exfat.h 2018-09-15 07:04:52.000000000 +0200 @@ -4,7 +4,7 @@ implementation. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 @@ -24,7 +24,10 @@ #ifndef EXFAT_H_INCLUDED #define EXFAT_H_INCLUDED +#ifndef ANDROID +/* Android.bp is used instead of autotools when targeting Android */ #include "config.h" +#endif #include "compiler.h" #include "exfatfs.h" #include <stdio.h> @@ -61,6 +64,9 @@ #define BMAP_CLR(bitmap, index) \ ((bitmap)[BMAP_BLOCK(index)] &= ~BMAP_MASK(index)) +#define EXFAT_REPAIR(hook, ef, ...) \ + (exfat_ask_to_fix(ef) && exfat_fix_ ## hook(ef, __VA_ARGS__)) + /* The size of off_t type must be 64 bits. File systems larger than 2 GB will be corrupted with 32-bit off_t. */ STATIC_ASSERT(sizeof(off_t) == 8); @@ -119,6 +125,7 @@ gid_t gid; int ro; bool noatime; + enum { EXFAT_REPAIR_NO, EXFAT_REPAIR_ASK, EXFAT_REPAIR_YES } repair; }; /* in-core nodes iterator */ @@ -135,6 +142,7 @@ }; extern int exfat_errors; +extern int exfat_errors_fixed; void exfat_bug(const char* format, ...) PRINTF NORETURN; void exfat_error(const char* format, ...) PRINTF; @@ -225,4 +233,12 @@ uint8_t* centisec); void exfat_tzset(void); +bool exfat_ask_to_fix(const struct exfat* ef); +bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector, + uint32_t vbr_checksum); +bool exfat_fix_invalid_node_checksum(const struct exfat* ef, + struct exfat_node* node); +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entry, off_t offset); + #endif /* ifndef EXFAT_H_INCLUDED */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/exfatfs.h new/fuse-exfat-1.3.0/libexfat/exfatfs.h --- old/fuse-exfat-1.2.7/libexfat/exfatfs.h 2017-05-02 19:28:31.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/exfatfs.h 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ Definitions of structures and constants used in exFAT file system. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/io.c new/fuse-exfat-1.3.0/libexfat/io.c --- old/fuse-exfat-1.2.7/libexfat/io.c 2017-05-30 17:18:46.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/io.c 2018-09-15 07:04:52.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 @@ -35,14 +35,23 @@ #include <sys/disklabel.h> #include <sys/dkio.h> #include <sys/ioctl.h> -#endif +#elif __linux__ #include <sys/mount.h> +#endif +#ifdef USE_UBLIO +#include <sys/uio.h> +#include <ublio.h> +#endif struct exfat_dev { int fd; enum exfat_mode mode; off_t size; /* in bytes */ +#ifdef USE_UBLIO + off_t pos; + ublio_filehandle_t ufh; +#endif }; static bool is_open(int fd) @@ -79,12 +88,15 @@ { struct exfat_dev* dev; struct stat stbuf; +#ifdef USE_UBLIO + struct ublio_param up; +#endif /* The system allocates file descriptors sequentially. If we have been started with stdin (0), stdout (1) or stderr (2) closed, the system will give us descriptor 0, 1 or 2 later when we open block device, FUSE communication pipe, etc. As a result, functions using stdin, - stdout or stderr will actualy work with a different thing and can + stdout or stderr will actually work with a different thing and can corrupt it. Protect descriptors 0, 1 and 2 from such misuse. */ while (!is_open(STDIN_FILENO) || !is_open(STDOUT_FILENO) @@ -234,6 +246,24 @@ } } +#ifdef USE_UBLIO + memset(&up, 0, sizeof(struct ublio_param)); + up.up_blocksize = 256 * 1024; + up.up_items = 64; + up.up_grace = 32; + up.up_priv = &dev->fd; + + dev->pos = 0; + dev->ufh = ublio_open(&up); + if (dev->ufh == NULL) + { + close(dev->fd); + free(dev); + exfat_error("failed to initialize ublio"); + return NULL; + } +#endif + return dev; } @@ -241,6 +271,13 @@ { int rc = 0; +#ifdef USE_UBLIO + if (ublio_close(dev->ufh) != 0) + { + exfat_error("failed to close ublio"); + rc = -EIO; + } +#endif if (close(dev->fd) != 0) { exfat_error("failed to close device: %s", strerror(errno)); @@ -254,6 +291,13 @@ { int rc = 0; +#ifdef USE_UBLIO + if (ublio_fsync(dev->ufh) != 0) + { + exfat_error("ublio fsync failed"); + rc = -EIO; + } +#endif if (fsync(dev->fd) != 0) { exfat_error("fsync failed: %s", strerror(errno)); @@ -274,29 +318,56 @@ off_t exfat_seek(struct exfat_dev* dev, off_t offset, int whence) { +#ifdef USE_UBLIO + /* XXX SEEK_CUR will be handled incorrectly */ + return dev->pos = lseek(dev->fd, offset, whence); +#else return lseek(dev->fd, offset, whence); +#endif } ssize_t exfat_read(struct exfat_dev* dev, void* buffer, size_t size) { +#ifdef USE_UBLIO + ssize_t result = ublio_pread(dev->ufh, buffer, size, dev->pos); + if (result >= 0) + dev->pos += size; + return result; +#else return read(dev->fd, buffer, size); +#endif } ssize_t exfat_write(struct exfat_dev* dev, const void* buffer, size_t size) { +#ifdef USE_UBLIO + ssize_t result = ublio_pwrite(dev->ufh, buffer, size, dev->pos); + if (result >= 0) + dev->pos += size; + return result; +#else return write(dev->fd, buffer, size); +#endif } ssize_t exfat_pread(struct exfat_dev* dev, void* buffer, size_t size, off_t offset) { +#ifdef USE_UBLIO + return ublio_pread(dev->ufh, buffer, size, offset); +#else return pread(dev->fd, buffer, size, offset); +#endif } ssize_t exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size, off_t offset) { +#ifdef USE_UBLIO + return ublio_pwrite(dev->ufh, buffer, size, offset); +#else return pwrite(dev->fd, buffer, size, offset); +#endif } ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/log.c new/fuse-exfat-1.3.0/libexfat/log.c --- old/fuse-exfat-1.2.7/libexfat/log.c 2017-05-30 17:18:46.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/log.c 2018-09-15 07:04:52.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 @@ -22,7 +22,11 @@ #include "exfat.h" #include <stdarg.h> +#ifdef __ANDROID__ +#include <android/log.h> +#else #include <syslog.h> +#endif #include <unistd.h> int exfat_errors; @@ -43,8 +47,12 @@ va_end(ap); fputs(".\n", stderr); +#ifdef __ANDROID__ + __android_log_vprint(ANDROID_LOG_FATAL, PACKAGE, format, aq); +#else if (!isatty(STDERR_FILENO)) vsyslog(LOG_CRIT, format, aq); +#endif va_end(aq); abort(); @@ -67,8 +75,12 @@ va_end(ap); fputs(".\n", stderr); +#ifdef __ANDROID__ + __android_log_vprint(ANDROID_LOG_ERROR, PACKAGE, format, aq); +#else if (!isatty(STDERR_FILENO)) vsyslog(LOG_ERR, format, aq); +#endif va_end(aq); } @@ -89,8 +101,12 @@ va_end(ap); fputs(".\n", stderr); +#ifdef __ANDROID__ + __android_log_vprint(ANDROID_LOG_WARN, PACKAGE, format, aq); +#else if (!isatty(STDERR_FILENO)) vsyslog(LOG_WARNING, format, aq); +#endif va_end(aq); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/lookup.c new/fuse-exfat-1.3.0/libexfat/lookup.c --- old/fuse-exfat-1.2.7/libexfat/lookup.c 2017-05-30 17:18:46.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/lookup.c 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/mount.c new/fuse-exfat-1.3.0/libexfat/mount.c --- old/fuse-exfat-1.2.7/libexfat/mount.c 2017-05-30 17:18:46.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/mount.c 2018-09-15 07:04:52.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 @@ -103,15 +103,28 @@ ef->gid = get_int_option(options, "gid", 10, getegid()); ef->noatime = match_option(options, "noatime"); + + switch (get_int_option(options, "repair", 10, 0)) + { + case 1: + ef->repair = EXFAT_REPAIR_ASK; + break; + case 2: + ef->repair = EXFAT_REPAIR_YES; + break; + default: + ef->repair = EXFAT_REPAIR_NO; + break; + } } -static bool verify_vbr_checksum(struct exfat_dev* dev, void* sector, - off_t sector_size) +static bool verify_vbr_checksum(const struct exfat* ef, void* sector) { + off_t sector_size = SECTOR_SIZE(*ef->sb); uint32_t vbr_checksum; int i; - if (exfat_pread(dev, sector, sector_size, 0) < 0) + if (exfat_pread(ef->dev, sector, sector_size, 0) < 0) { exfat_error("failed to read boot sector"); return false; @@ -119,7 +132,7 @@ vbr_checksum = exfat_vbr_start_checksum(sector, sector_size); for (i = 1; i < 11; i++) { - if (exfat_pread(dev, sector, sector_size, i * sector_size) < 0) + if (exfat_pread(ef->dev, sector, sector_size, i * sector_size) < 0) { exfat_error("failed to read VBR sector"); return false; @@ -127,7 +140,7 @@ vbr_checksum = exfat_vbr_add_checksum(sector, sector_size, vbr_checksum); } - if (exfat_pread(dev, sector, sector_size, i * sector_size) < 0) + if (exfat_pread(ef->dev, sector, sector_size, i * sector_size) < 0) { exfat_error("failed to read VBR checksum sector"); return false; @@ -137,7 +150,8 @@ { exfat_error("invalid VBR checksum 0x%x (expected 0x%x)", le32_to_cpu(((const le32_t*) sector)[i]), vbr_checksum); - return false; + if (!EXFAT_REPAIR(invalid_vbr_checksum, ef, sector, vbr_checksum)) + return false; } return true; } @@ -252,7 +266,7 @@ return -ENOMEM; } /* use zero_cluster as a temporary buffer for VBR checksum verification */ - if (!verify_vbr_checksum(ef->dev, ef->zero_cluster, SECTOR_SIZE(*ef->sb))) + if (!verify_vbr_checksum(ef, ef->zero_cluster)) { exfat_free(ef); return -EIO; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/node.c new/fuse-exfat-1.3.0/libexfat/node.c --- old/fuse-exfat-1.2.7/libexfat/node.c 2017-05-30 17:18:46.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/node.c 2018-09-15 07:04:52.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 @@ -223,7 +223,8 @@ exfat_get_name(node, buffer); exfat_error("'%s' has invalid checksum (%#hx != %#hx)", buffer, le16_to_cpu(actual_checksum), le16_to_cpu(meta1->checksum)); - ret = false; + if (!EXFAT_REPAIR(invalid_node_checksum, ef, node)) + ret = false; } /* @@ -516,7 +517,8 @@ break; /* deleted entry, ignore it */ exfat_error("unknown entry type %#hhx", entry.type); - return -EIO; + if (!EXFAT_REPAIR(unknown_entry, ef, parent, &entry, *offset)) + return -EIO; } *offset += sizeof(entry); } @@ -855,7 +857,8 @@ free(dmap); return -EIO; case -EINVAL: - /* slot is occupied, continue searching */ + /* slot at (i-n) is occupied, go back and check (i-n+1) */ + i -= contiguous - 1; contiguous = 0; break; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/platform.h new/fuse-exfat-1.3.0/libexfat/platform.h --- old/fuse-exfat-1.2.7/libexfat/platform.h 2017-05-02 19:28:31.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/platform.h 2018-09-15 07:04:52.000000000 +0200 @@ -4,7 +4,7 @@ same kernel can use different libc implementations. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 @@ -46,7 +46,7 @@ #define EXFAT_LITTLE_ENDIAN LITTLE_ENDIAN #define EXFAT_BIG_ENDIAN BIG_ENDIAN -#elif defined(__FreeBSD__) || defined(__DragonFlyBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) +#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) #include <sys/endian.h> #define exfat_bswap16(x) bswap16(x) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/repair.c new/fuse-exfat-1.3.0/libexfat/repair.c --- old/fuse-exfat-1.2.7/libexfat/repair.c 1970-01-01 01:00:00.000000000 +0100 +++ new/fuse-exfat-1.3.0/libexfat/repair.c 2018-09-15 07:04:52.000000000 +0200 @@ -0,0 +1,102 @@ +/* + repair.c (09.03.17) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 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 + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include <strings.h> + +int exfat_errors_fixed; + +bool exfat_ask_to_fix(const struct exfat* ef) +{ + const char* question = "Fix (Y/N)?"; + char answer[8]; + bool yeah, nope; + + switch (ef->repair) + { + case EXFAT_REPAIR_NO: + return false; + case EXFAT_REPAIR_YES: + printf("%s %s", question, "Y\n"); + return true; + case EXFAT_REPAIR_ASK: + do + { + printf("%s ", question); + fflush(stdout); + if (fgets(answer, sizeof(answer), stdin)) + { + yeah = strcasecmp(answer, "Y\n") == 0; + nope = strcasecmp(answer, "N\n") == 0; + } + else + { + yeah = false; + nope = true; + } + } + while (!yeah && !nope); + return yeah; + } + exfat_bug("invalid repair option value: %d", ef->repair); +} + +bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector, + uint32_t vbr_checksum) +{ + size_t i; + off_t sector_size = SECTOR_SIZE(*ef->sb); + + for (i = 0; i < sector_size / sizeof(vbr_checksum); i++) + ((le32_t*) sector)[i] = cpu_to_le32(vbr_checksum); + if (exfat_pwrite(ef->dev, sector, sector_size, 11 * sector_size) < 0) + { + exfat_error("failed to write correct VBR checksum"); + return false; + } + exfat_errors_fixed++; + return true; +} + +bool exfat_fix_invalid_node_checksum(const struct exfat* ef, + struct exfat_node* node) +{ + /* checksum will be rewritten by exfat_flush_node() */ + node->is_dirty = true; + + exfat_errors_fixed++; + return true; +} + +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entry, off_t offset) +{ + struct exfat_entry deleted = *entry; + + deleted.type &= ~EXFAT_ENTRY_VALID; + if (exfat_generic_pwrite(ef, dir, &deleted, sizeof(struct exfat_entry), + offset) != sizeof(struct exfat_entry)) + return false; + + exfat_errors_fixed++; + return true; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/time.c new/fuse-exfat-1.3.0/libexfat/time.c --- old/fuse-exfat-1.2.7/libexfat/time.c 2017-05-02 19:28:31.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/time.c 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/utf.c new/fuse-exfat-1.3.0/libexfat/utf.c --- old/fuse-exfat-1.2.7/libexfat/utf.c 2017-05-02 19:28:31.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/utf.c 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/fuse-exfat-1.2.7/libexfat/utils.c new/fuse-exfat-1.3.0/libexfat/utils.c --- old/fuse-exfat-1.2.7/libexfat/utils.c 2017-05-02 19:28:31.000000000 +0200 +++ new/fuse-exfat-1.3.0/libexfat/utils.c 2018-09-15 06:12:42.000000000 +0200 @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2017 Andrew Nayenko + Copyright (C) 2010-2018 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
