commit b1d5b8283561e7954d1d31307160b9902396b42a Author: zyppe <210hcl@gmail.com> Date: Wed Feb 7 22:45:12 2024 +0800 Initialize for dosfstools diff --git a/.dosfstools.metadata b/.dosfstools.metadata new file mode 100644 index 0000000..bb676a3 --- /dev/null +++ b/.dosfstools.metadata @@ -0,0 +1 @@ +3e8602960b8ec95de62f0e48c57464815d29af2a5d9d7bb7444eb9e544c6aa10 dosfstools-4.1.tar.gz diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bb1af3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +dosfstools-4.1.tar.gz diff --git a/dosfstools-4.1.tar.gz.sig b/dosfstools-4.1.tar.gz.sig new file mode 100644 index 0000000..a968ea6 Binary files /dev/null and b/dosfstools-4.1.tar.gz.sig differ diff --git a/dosfstools-add-g.patch b/dosfstools-add-g.patch new file mode 100644 index 0000000..3cf5c46 --- /dev/null +++ b/dosfstools-add-g.patch @@ -0,0 +1,101 @@ +From e579a7df89bb3a6df08847d45c70c8ebfabca7d2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Sat, 17 Nov 2018 01:12:52 +0100 +Subject: [PATCH] mkfs.fat: Allow to specify disk geometry via new -g option + +Backported. + +--- + manpages/mkfs.fat.8.in | 8 ++++++++ + src/mkfs.fat.c | 25 ++++++++++++++++++++++--- + 2 files changed, 30 insertions(+), 3 deletions(-) + +Index: dosfstools-4.1/manpages/mkfs.fat.8.in +=================================================================== +--- dosfstools-4.1.orig/manpages/mkfs.fat.8.in ++++ dosfstools-4.1/manpages/mkfs.fat.8.in +@@ -89,6 +89,14 @@ The default is 2. + Specifies the type of file allocation tables used (12, 16 or 32 bit). + If nothing is specified, \fBmkfs.fat\fR will automatically select between 12, 16 + and 32 bit, whatever fits better for the filesystem size. ++.IP "\fB\-g\fR \fIHEADS\fR/\fISECTORS-PER-TRACK\fR" 4 ++Specify \fIHEADS\fR and \fISECTORS-PER-TRACK\fR numbers which represents ++disk geometry of \fIDEVICE\fR. Both numbers are stored into the FAT boot sector. ++Number \fISECTORS-PER-TRACK\fR is used also for aligning the total count of FAT ++sectors. By default disk geometry is read from \fIDEVICE\fR itself. If it is not ++available then \fILBA-Assist Translation\fR and translation table from the ++\fISD Card Part 2 File System Specification\fR based on total number of disk ++sectors is used. + .IP "\fB\-h\fR \fINUMBER-OF-HIDDEN-SECTORS\fR" 4 + Select the number of hidden sectors in the volume. + Apparently some digital cameras get indigestion if you feed them a CF card +Index: dosfstools-4.1/src/mkfs.fat.c +=================================================================== +--- dosfstools-4.1.orig/src/mkfs.fat.c ++++ dosfstools-4.1/src/mkfs.fat.c +@@ -620,8 +620,10 @@ static void establish_params(struct devi + if (!root_dir_entries) + root_dir_entries = def_root_dir_entries; + +- bs.secs_track = htole16(sec_per_track); +- bs.heads = htole16(heads); ++ if (!bs.secs_track) ++ bs.secs_track = htole16(sec_per_track); ++ if (!bs.heads) ++ bs.heads = htole16(heads); + bs.media = media; + bs.cluster_size = cluster_size; + } +@@ -1268,9 +1270,9 @@ static void usage(int exitval) + Usage: mkfs.fat [-a][-A][-c][-C][-v][-I][-l bad-block-file][-b backup-boot-sector]\n\ + [-m boot-msg-file][-n volume-name][-i volume-id]\n\ + [-s sectors-per-cluster][-S logical-sector-size][-f number-of-FATs]\n\ +- [-h hidden-sectors][-F fat-size][-r root-dir-entries][-R reserved-sectors]\n\ +- [-M FAT-media-byte][-D drive_number]\n\ +- [--invariant]\n\ ++ [-h hidden-sectors][-F fat-size][-g heads/sector_per_track]\n\ ++ [-r root-dir-entries][-R reserved-sectors][-M FAT-media-byte]\n\ ++ [-D drive_number][--invariant]\n\ + [--help]\n\ + /dev/name [blocks]\n"); + exit(exitval); +@@ -1319,6 +1321,7 @@ int main(int argc, char **argv) + uint64_t cblocks = 0; + int blocks_specified = 0; + struct timeval create_timeval; ++ long long conversion; + + enum {OPT_HELP=1000, OPT_INVARIANT,}; + const struct option long_options[] = { +@@ -1341,7 +1344,7 @@ int main(int argc, char **argv) + + printf("mkfs.fat " VERSION " (" VERSION_DATE ")\n"); + +- while ((c = getopt_long(argc, argv, "aAb:cCf:D:F:Ii:l:m:M:n:r:R:s:S:h:v", ++ while ((c = getopt_long(argc, argv, "aAb:cCf:D:F:g:Ii:l:m:M:n:r:R:s:S:h:v", + long_options, NULL)) != -1) + /* Scan the command line for options */ + switch (c) { +@@ -1396,6 +1399,22 @@ int main(int argc, char **argv) + size_fat_by_user = 1; + break; + ++ case 'g': /* g : geometry: heads and sectors per track */ ++ errno = 0; ++ conversion = strtol(optarg, &tmp, 0); ++ if (!*optarg || isspace(*optarg) || tmp[0] != '/' || !tmp[1] || isspace(tmp[1]) || errno || conversion <= 0 || conversion > UINT16_MAX) { ++ printf("Bad format of geometry : %s\n", optarg); ++ usage(1); ++ } ++ bs.heads = htole16(conversion); ++ conversion = strtol(tmp+1, &tmp, 0); ++ if (*tmp || errno || conversion <= 0 || conversion > UINT16_MAX) { ++ printf("Bad format of geometry : %s\n", optarg); ++ usage(1); ++ } ++ bs.secs_track = htole16(conversion); ++ break; ++ + case 'h': /* h : number of hidden sectors */ + hidden_sectors = (int)strtol(optarg, &tmp, 0); + if (*tmp || hidden_sectors < 0) { diff --git a/dosfstools.changes b/dosfstools.changes new file mode 100644 index 0000000..a2232e9 --- /dev/null +++ b/dosfstools.changes @@ -0,0 +1,330 @@ +* Tue Dec 21 2021 sbrabec@suse.com +- To be able to create filesystems compatible with previous + version, add -g command line option to mkfs (boo#1188401, + dosfstools-add-g.patch). +- BREAKING CHANGES: + After fixing of bsc#1172863 in the last update, mkfs started to + create different images than before. Applications that depend on + exact FAT file format (e. g. embedded systems) may be broken in + two ways: + * The introduction of the alignment may create smaller images + than before, with a different positions of important image + elements. It can break existing software that expect images in + doststools <= 4.1 style. + To work around these problems, use "-a" command line argument. + * The new image may contain a different geometry values. Geometry + sensitive applications expecting doststools <= 4.1 style images + can fails to accept different geometry values. + There is no direct work around for this problem. But you can + take the old image, use "file -s $IMAGE", check its + "sectors/track" and "heads", and use them in the newly + introduced "-g" command line argument. +* Wed May 26 2021 mcepl@suse.com +- Add fix-calculation.patch (gh#dosfstools/dosfstools#153, bsc#1172863) + to work with different size of clusters. +* Thu Jan 26 2017 mpluskal@suse.com +- Update to version 4.1: + * Now the default for mkfs for filesystems smaller than 512 MB is + 64 / 32 sectors + * The parsing of octal character specifications for filenames in + the -u and -d 25 options of fsck now works. + * Fixed a possible fatlabel crash when writing a label to an + unlabelled filesystem + * Testsuite is now available +* Sat May 7 2016 mpluskal@suse.com +- Update to 4.0 + * Switch build system to autotools. + * Fixed data corruption errors in fsck.fat Writing to the third + to last cluster on FAT12 with an odd number of clusters would + corrupt the following cluster. + * The automatic alignment of data clusters that was added in + 3.0.8 and broken for FAT32 starting with 3.0.20 has been + reinstated. +- Small spec file cleanup +- Drop no longer needed dosfstools-suse-dirs.patch +* Wed Jun 3 2015 mpluskal@suse.com +- Update to 3.0.28 + * mkfs.fat now allows choosing 0xF0 as the media byte which was + previously rejected. + * mkfs.fat now supports the --invariant option to facilitate + testing mkfs.fat itself. + * Bugs fixed in fsck.fat are a read one byte beyond the end of + an allocated array when checking some FAT12 filesystems, and + checking that the first cluster of a file as specified in the + directory entry is not 1. +- Cleanup spec file with spec-cleaner +* Mon May 11 2015 pgajdos@suse.com +- fix url +* Fri Jan 16 2015 pgajdos@suse.com +- updated to 3.0.27: + * fsck.fat: Don't print version string every time -v is + encountered + * Fix attempt to rename root dir in fsck due to uninitialized + fields + * Support long file names in volume labeling code +- upstream changed +* Tue Sep 23 2014 jengelh@inai.de +- Drop gpg-offline build-time requirement; this is now handled by + the local source validator +* Thu Jun 26 2014 pgajdos@suse.com +- added fsck.{v,}fat and mkfs.{v,}fat compat symlinks in /sbin + [bnc#884516] +- call spec-cleaner +* Mon Mar 17 2014 pgajdos@suse.com +- updated to 3.0.26: + * Fix "odd" files created by frequent power-loss. +* Thu Mar 6 2014 pgajdos@suse.com +- updated to 3.0.25: + * Prevent corruption of FAT during fsck on 64 bit platforms. + unsigned long is 64 bit on x86-64, which means set_fat was writing two + entries, which corrupts the next entry. This can cause loss of data in + another file. + * Fixed remaining 64 bit build warnings. +* Mon Nov 25 2013 pgajdos@suse.com +- updated to 3.0.24: + * Fixed dosfsck on big endian platforms. +* Wed Oct 16 2013 pgajdos@suse.com +- updated to 3.0.23: + * Corrects clustersize to fix issues with EFI System Partitions. +* Mon Jul 29 2013 pgajdos@suse.com +- updated to 3.0.22: + * Improved boot compatiblity. +* Wed Jul 17 2013 pgajdos@suse.com +- updated to 3.0.21 + * Minor miscellaneous cleanups. +* Thu Jun 13 2013 jengelh@inai.de +- Update to new upstream release 3.0.20 + * This release updates default sectors per cluster for FAT32. +- Remove ppc-reserved-sectors-fix.patch (implemented upstream) + (use -a switch to disable aligning structures) +- Signature verification; more robust make install call +* Wed Jun 12 2013 pgajdos@suse.com +- update to 3.0.19: + * This release fixes a segfault with fortify. +- removed dosfstools-system_id-overflow.patch +* Tue Jun 11 2013 pgajdos@suse.com +- update to 3.0.18: + * Adding initial i18n support for manpages with po4a. + * Renaming tools to sane namespace and keeping legacy symlinks in place. + | dosfslabel becomes fatlabel, + | dosfsck becomes fsck.fat, + | and mkdosfs becomes mkfs.fat. + * Correcting spelling typo in boot.c. + * dosfslabel: Do not read beyond string length (Closes: #709587). +- refreshed both dosfstools-suse-dirs.patch and + ppc-reserved-sectors-fix.patch +- added dosfstools-system_id-overflow.patch +* Mon Jun 3 2013 pgajdos@suse.com +- update to 3.0.17: + * Fixing segfault in dosfslabel. + * Allow operation on SH4 CPUs. + * Finish cleanup of byteswap code. + * Fix offsetof definition. + * etc., see ChangeLog +- refreshed ppc-reserved-sectors-fix.patch +* Mon Mar 25 2013 mmeister@suse.com +- Added url as source. + Please see http://en.opensuse.org/SourceUrls +* Mon Mar 4 2013 pgajdos@suse.com +- update to 3.0.16: label fixes + * dropped upstreamed + - dosfstools-create-rootdir-label.patch + - dosfstools-dosfslabel-forbid-lowercase.patch + - dosfstools-dosfslabel-from-rootdir.patch + - dosfstools-fsck-file-name.patch + - dosfstools-mkdosfs-no-label.patch + - dosfstools-mkdosfs-uppercase-label.patch +* Mon Feb 25 2013 pgajdos@suse.com +- update to 3.0.15: bugfixes for device detection, root directory + allocation, and messages about unicode filenames. + * dropped dosfstools-filename-buffer-overflow.patch (upstreamed) + * dropped dosfstools-mdraid-partition.patch (upstreamed) + * refreshed dosfstools-suse-dirs.patch + * refreshed ppc-reserved-sectors-fix.patch + (will be dropped if not upstreamed) + * dosfstools-label.patch splitted to: + - dosfstools-create-rootdir-label.patch + - dosfstools-dosfslabel-forbid-lowercase.patch + - dosfstools-dosfslabel-from-rootdir.patch + - dosfstools-fsck-file-name.patch + - dosfstools-mkdosfs-no-label.patch + - dosfstools-mkdosfs-uppercase-label.patch + (will be upstreamed or dropped) +* Fri Oct 26 2012 dvaleev@suse.com +- hack to use just 1 sector for embedded devices. should be made + into a flag, but this shouldn't break normal systems ... + lunchpad bug (746262) +- fixes ppc boot from vfat (in case root on raid,lvm,ext4) +* Fri Sep 28 2012 cfarrell@suse.com +- license update: GPL-3.0+ + No indication that the authors restricted the package to GPL-3.0 (i.e. + "only"). Accordingly, GPL-3.0+ seems a better choice and is also the + choice made by Fedora +* Wed Feb 8 2012 rschweikert@suse.com +- place binaries in /usr tree (UsrMerge project) +* Fri Sep 30 2011 uli@suse.com +- cross-build fix: use %%__cc macro +* Sun Sep 18 2011 jengelh@medozas.de +- Remove redundant tags/sections from specfile + (cf. packaging guidelines) +- Use %%_smp_mflags for parallel build +* Tue Mar 8 2011 pgajdos@suse.cz +- fixed fsck.vfat crashing [bnc#677236] +* Mon Dec 20 2010 pgajdos@suse.cz +- fixed dosfslabel crashing and improved label handling in mkdosfs + and dosfslabel [bnc#657011] +* Mon Nov 1 2010 pgajdos@suse.cz +- fixed: + * [bnc#639553] -- mkdosfs now detects md raid partition correctly + * [bnc#649046] -- install dosfslabel + * spec file cleanup +* Mon Sep 13 2010 pgajdos@suse.cz +- updated to 3.0.10: + * LFN handling and false positives with bad filenames were + corrected. +* Mon Feb 1 2010 pgajdos@suse.cz +- updated to 3.0.9: + * A bug in aligning was fixed. +* Mon Jan 25 2010 pgajdos@suse.cz +- new upstream + http://freshmeat.net/projects/dosfstools +- updated to 3.0.8 +- removed upstreamed/obsoleted patches + * linuxfs.patch + * buffer.patch + * o_excl.patch + * mkdosfs-geo0.diff + * determine-sector-size.patch + * unsupported-sector-size.patch + * unaligned.patch +- major changes: + * aligning structures to cluster boundaries, + 64bit and crosscompile fixes + * bugfix in dosfslabel, cleanups for FORTIFY_SOURCE + * bugfix in dosfsck on big-endian systems, + bugfix in dosfck cluster handling + * bugfix and cleanup for VFAT patent avoidance + kernel patch + * compatible with VFAT patent avoidance kernel + patch, bugfix in dosfsck repair mode + * supporting limited-memory embedded systems + * fixes rare dosfsck corruption + * improves dosfsck cluster handling, fixes timing + issues + * merged patches from various distributions +* Tue Nov 3 2009 coolo@novell.com +- updated patches to apply with fuzz=0 +* Tue Jun 24 2008 pgajdos@suse.cz +- added warning for creation msdos on filesystem with sector size + greater than 4096 [fate#303325] (unsupported-sector-size.patch) +* Thu Sep 6 2007 pgajdos@suse.cz +- determine sector size of device automatically or if -S parameter + present, verify, that it's not under physical sector size + (determine-sector-size.patch) +* Thu Aug 9 2007 olh@suse.de +- remove inclusion of asm/unaligned.h, use private copy of + asm-generic/unaligned.h +* Thu Apr 26 2007 lnussel@suse.de +- remove obsolete subfs patch +- fix handling of zero heads and sectors +* Wed Apr 4 2007 pgajdos@suse.cz +- added Supplements: filesystem(vfat) line to spec file + [fate#301966] +* Tue Jan 30 2007 prusnak@suse.cz +- mkdosfs now opens device with O_EXCL [#238687] +* Sat May 27 2006 schwab@suse.de +- Don't strip binaries. +* Wed Jan 25 2006 mls@suse.de +- converted neededforbuild to BuildRequires +* Tue Nov 8 2005 dmueller@suse.de +- don't build as root +* Mon Nov 7 2005 yxu@suse.de +- fixed overflowing buffer problem +* Mon Apr 11 2005 mcihar@suse.cz +- update to 2.11 +- use sys/mount.h instead of linux/fs.h, this fixes compilation with current GCC +* Tue Feb 15 2005 mcihar@suse.cz +- deal with subfs (bug #50838) + - use /proc/mounts if available for deciding whether device is + mounted or not + - just issue warning if it is mounted as subfs +* Thu Aug 19 2004 mcihar@suse.cz +- merged some dosfsck fixes from FreeDOS +* Thu Jul 15 2004 schwab@suse.de +- Fix unaligned accesses [#40296]. +* Tue Jun 1 2004 ro@suse.de +- avoid inclusion of linux/audit.h +* Thu Mar 18 2004 mcihar@suse.cz +- fix dosfsck man page (pointed out in bug #34757) +* Mon Mar 8 2004 mcihar@suse.cz +- fix broken dosfsck (bug #34757) +* Thu Jan 29 2004 mcihar@suse.cz +- include more documentation +* Thu Jan 15 2004 kukuk@suse.de +- Make compile with kernel 2.6.1 headers +* Thu Oct 23 2003 schwab@suse.de +- Don't define llseek to lseek64, creates infinite recursion. +* Tue Oct 14 2003 mcihar@suse.cz +- install links also for {fsck,mkfs}.vfat + man pages (bug #32284) +* Mon Sep 29 2003 mcihar@suse.cz +- updated to 2.10: + - dosfsck: various 64-bit fixes and removed some warnings by Michal + Cihar + - mkdosfs: better error message if called without parameters (also + suggested by Michal) +* Mon Jun 9 2003 mcihar@suse.cz +- new upstream version 2.9: + * dosfsck: Fix potential for "Internal error: next_cluster on bad cluster". + * dosfsck: When clearing long file names, don't overwrite the dir + entries with all zeros, but put 0xe5 into the first byte. + Otherwise, some OSes stop reading the directory at that point... + * dosfsck: in statistics printed by -v, fix 32bit overflow in number + of data bytes. + * dosfsck: fix an potential overflow in "too many clusters" check + * dosfsck: allow FAT size > 32MB. + * dosfsck: allow for only one FAT + * dosfsck: with -v, also check that last sector of the filesystem can + be read (in case a partition is smaller than the fs thinks) +- realy working large file support +- don't package obsolette documentation +* Wed Dec 4 2002 mcihar@suse.cz +- don't allow -fPIC on i386 in CFLAGS, even on i386-debug, because + this package doesn't build with it +* Sun Dec 1 2002 ro@suse.de +- include errno.h where needed +* Tue Sep 10 2002 mcihar@suse.cz +- added -D_FILE_OFFSET_BITS=64 to CFLAGS to support larger files/partitions +* Mon May 20 2002 ro@suse.de +- extend 64bit ifdefs for new platforms +* Fri Mar 1 2002 jantos@suse.cz +- Fixed missing files in documentation (bug 13973) +* Fri Sep 14 2001 schwab@suse.de +- Fix crash if mkdosfs is called without arguments. +* Tue May 22 2001 pblaha@suse.cz +- fixed include files on ia64 +* Sun Apr 8 2001 schwab@suse.de +- Fix to build on ia64. +* Mon Mar 5 2001 pblaha@suse.cz +- update on 2.8 +* Mon Feb 12 2001 ro@suse.de +- don't include linux/fs.h +* Thu Jan 18 2001 schwab@suse.de +- Add Obsoletes: dosfstls. +* Wed Jan 17 2001 pblaha@suse.cz +- added message "not enough memory to run dosfsck\n" +- if not free memory for malloc +* Fri Dec 22 2000 pblaha@suse.cz +- upgrade on 2.6 and rename on dosfstools +* Mon Dec 4 2000 sf@suse.de +- corrected patch to compile on Alpha and ia64 +* Tue Nov 21 2000 uli@suse.de +- worked around strncasecmp declaration conflict in mkdosfs.c +* Mon Nov 13 2000 ro@suse.de +- hacked to compile on 2.4 includes +* Thu Nov 2 2000 pblaha@suse.cz +- update to version 2.4 +* Mon Jun 5 2000 schwab@suse.de +- Fix llseek on ia64. +* Fri Jun 2 2000 bubnikv@suse.cz +- new package in SuSE, version 2.2 +- makes packages dosfsck and mkdosfs obsolette diff --git a/dosfstools.keyring b/dosfstools.keyring new file mode 100644 index 0000000..1403dfa --- /dev/null +++ b/dosfstools.keyring @@ -0,0 +1,513 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +Zxz8PQg= +=N3ZS +-----END PGP PUBLIC KEY BLOCK----- diff --git a/dosfstools.spec b/dosfstools.spec new file mode 100644 index 0000000..5d561e6 --- /dev/null +++ b/dosfstools.spec @@ -0,0 +1,84 @@ +# +# spec file for package dosfstools +# +# Copyright (c) 2022-2023 ZhuningOS +# + + +Name: dosfstools +Version: 4.1 +Release: 3.6.1 +Summary: Utilities for Making and Checking MS-DOS FAT File Systems on Linux +License: GPL-3.0+ +Group: System/Filesystems +Url: https://github.com/dosfstools/dosfstools +Source: https://github.com/dosfstools/dosfstools/releases/download/v%{version}/dosfstools-%{version}.tar.gz +Source2: https://github.com/dosfstools/dosfstools/releases/download/v%{version}/dosfstools-%{version}.tar.gz.sig +Source3: %{name}.keyring +# PATCH-FIX-UPSTREAM fix-calculation.patch gh#dosfstools/dosfstools#153 mcepl@suse.com +# Fix calculation of sectors and clusters +Patch0: fix-calculation.patch +# PATCH-FEATURE-UPSTREAM dosfstools-add-g.patch boo1188401 sbrabec@suse.com -- To be able to create filesystems compatible with previous version, add -g command line option. +Patch1: dosfstools-add-g.patch +# xxd from vim is required for testsuite +BuildRequires: pkgconfig +BuildRequires: vim +BuildRequires: automake +BuildRequires: pkgconfig(libudev) +Supplements: filesystem(vfat) +Provides: dosfsck +Provides: mkdosfs +BuildRoot: %{_tmppath}/%{name}-%{version}-build + +%description +The dosfstools package includes the mkdosfs and dosfsck utilities, which +respectively make and check MS-DOS FAT file systems on hard drives or on +floppies. + +%prep +%autosetup -p1 + +%build +%configure \ + --docdir=%{_docdir}/dosfstools \ + --enable-compat-symlinks +make %{?_smp_mflags} CFLAGS="%{optflags} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" + +%install +%make_install +#UsrMerge +mkdir %{buildroot}/sbin +ln -sf %{_sbindir}/{dosfsck,dosfslabel,mkdosfs,fsck.msdos,mkfs.msdos,fsck.fat,fsck.vfat,mkfs.fat,mkfs.vfat} %{buildroot}/sbin +#EndUsrMerge + +%check +make check + +%files +%defattr(-,root,root) +%doc %{_docdir}/dosfstools +#UsrMerge +/sbin/* +#EndUsrMerge +%{_sbindir}/dosfsck +%{_sbindir}/dosfslabel +%{_sbindir}/fatlabel +%{_sbindir}/fsck.fat +%{_sbindir}/fsck.msdos +%{_sbindir}/fsck.vfat +%{_sbindir}/mkdosfs +%{_sbindir}/mkfs.fat +%{_sbindir}/mkfs.msdos +%{_sbindir}/mkfs.vfat +%{_mandir}/man8/dosfsck.8%{ext_man} +%{_mandir}/man8/dosfslabel.8%{ext_man} +%{_mandir}/man8/fatlabel.8%{ext_man} +%{_mandir}/man8/fsck.fat.8%{ext_man} +%{_mandir}/man8/fsck.msdos.8%{ext_man} +%{_mandir}/man8/fsck.vfat.8%{ext_man} +%{_mandir}/man8/mkdosfs.8%{ext_man} +%{_mandir}/man8/mkfs.fat.8%{ext_man} +%{_mandir}/man8/mkfs.msdos.8%{ext_man} +%{_mandir}/man8/mkfs.vfat.8%{ext_man} + +%changelog diff --git a/fix-calculation.patch b/fix-calculation.patch new file mode 100644 index 0000000..7778ffd --- /dev/null +++ b/fix-calculation.patch @@ -0,0 +1,341 @@ +From b29eb5be67e9e8a06908ee10f6c205cb609b1021 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Wed, 15 Aug 2018 15:15:06 +0200 +Subject: [PATCH 1/7] mkfs.fat: Align total number of sectors to be multiple of + sectors per track + +This requirement is needed by DOS systems and also by Linux mtools project. +Without proper alignment, mtools applications refuse to work on such +filesystem. +--- + configure.ac | 2 + src/mkfs.fat.c | 119 ++++++++++++++++++++++------------------------- + tests/Makefile.am | 3 - + tests/mkfs-fat32_4K.mkfs | 3 + + tests/mkfs-fat32_4K.xxd | 63 ++++++++++++++++++++++++ + tests/referenceFAT32.xxd | 5 + + 6 files changed, 132 insertions(+), 63 deletions(-) + +--- a/configure.ac ++++ b/configure.ac +@@ -16,7 +16,7 @@ + + AC_INIT([dosfstools], [4.1]) + AC_SUBST([RELEASE_DATE], [2017-01-24]) +-AM_INIT_AUTOMAKE([1.11 foreign subdir-objects parallel-tests]) ++AM_INIT_AUTOMAKE([1.15.1 foreign subdir-objects parallel-tests]) + + AC_ARG_ENABLE([compat-symlinks], + [AS_HELP_STRING([--enable-compat-symlinks], +--- a/src/mkfs.fat.c ++++ b/src/mkfs.fat.c +@@ -7,6 +7,7 @@ + Copyright (C) 1998-2005 Roman Hodek + Copyright (C) 2008-2014 Daniel Baumann + Copyright (C) 2015-2016 Andreas Bombe ++ Copyright (C) 2018 Pali Rohár + + 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 +@@ -107,14 +108,26 @@ static inline int cdiv(int a, int b) + + #define BOOT_SIGN 0xAA55 /* Boot sector magic number */ + +-#define MAX_CLUST_12 ((1 << 12) - 16) +-#define MAX_CLUST_16 ((1 << 16) - 16) +-#define MIN_CLUST_32 65529 ++/* According to Microsoft FAT specification (fatgen103.doc) disk with ++ * 4085 clusters (or more) is FAT16, but Microsoft Windows FAT driver ++ * fastfat.sys detects disk with less then 4087 clusters as FAT12. ++ * Linux FAT drivers msdos.ko and vfat.ko detect disk with at least ++ * 4085 clusters as FAT16, therefore for compatibility reasons with ++ * both systems disallow formatting disks to 4085 or 4086 clusters. */ ++#define MAX_CLUST_12 4084 ++#define MIN_CLUST_16 4087 ++ ++/* According to Microsoft FAT specification (fatgen103.doc) disk with ++ * 65525 clusters (or more) is FAT32, but Microsoft Windows FAT driver ++ * fastfat.sys, Linux FAT drivers msdos.ko and vfat.ko detect disk as ++ * FAT32 when Sectors Per FAT (fat_length) is set to zero. And not by ++ * number of clusters. Still there is cluster upper limit for FAT16. */ ++#define MAX_CLUST_16 65524 ++#define MIN_CLUST_32 65525 ++ + /* M$ says the high 4 bits of a FAT32 FAT entry are reserved and don't belong + * to the cluster number. So the max. cluster# is based on 2^28 */ +-#define MAX_CLUST_32 ((1 << 28) - 16) +- +-#define FAT12_THRESHOLD 4085 ++#define MAX_CLUST_32 268435446 + + #define OLDGEMDOS_MAX_SECTORS 32765 + #define GEMDOS_MAX_SECTORS 65531 +@@ -588,13 +601,12 @@ static void establish_params(struct devi + * fs size <= 16G: 8k clusters + * fs size <= 32G: 16k clusters + * fs size > 32G: 32k clusters +- * +- * This only works correctly for 512 byte sectors! + */ +- uint32_t sz_mb = info->size / (1024 * 1024); +- cluster_size = +- sz_mb > 32 * 1024 ? 64 : sz_mb > 16 * 1024 ? 32 : sz_mb > +- 8 * 1024 ? 16 : sz_mb > 260 ? 8 : 1; ++ unsigned long long int sectors = info->size / sector_size; ++ cluster_size = sectors > 32*1024*1024*2 ? 64 : ++ sectors > 16*1024*1024*2 ? 32 : ++ sectors > 8*1024*1024*2 ? 16 : ++ sectors > 260*1024*2 ? 8 : 1; + } + + if (info->geom_heads > 0) { +@@ -733,6 +745,9 @@ static void setup_tables(void) + (long long)(blocks * BLOCK_SIZE / sector_size) + orphaned_sectors; + } + ++ /* Align number of sectors to be multiple of sectors per track, needed by DOS and mtools */ ++ num_sectors = num_sectors / le16toh(bs.secs_track) * le16toh(bs.secs_track); ++ + if (!atari_format) { + unsigned fatdata1216; /* Sectors for FATs + data area (FAT12/16) */ + unsigned fatdata32; /* Sectors for FATs + data area (FAT32) */ +@@ -781,13 +796,13 @@ static void setup_tables(void) + maxclust12 = (fatlength12 * 2 * sector_size) / 3; + if (maxclust12 > MAX_CLUST_12) + maxclust12 = MAX_CLUST_12; +- if (verbose >= 2) +- printf("FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 12)) ++ printf("Trying FAT12: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", + clust12, fatlength12, maxclust12, MAX_CLUST_12); +- if (clust12 > maxclust12 - 2) { ++ if (clust12 > maxclust12) { + clust12 = 0; +- if (verbose >= 2) +- printf("FAT12: too much clusters\n"); ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 12)) ++ printf("Trying FAT12: too much clusters\n"); + } + + clust16 = ((long long)fatdata1216 * sector_size + nr_fats * 4) / +@@ -801,20 +816,19 @@ static void setup_tables(void) + maxclust16 = (fatlength16 * sector_size) / 2; + if (maxclust16 > MAX_CLUST_16) + maxclust16 = MAX_CLUST_16; +- if (verbose >= 2) +- printf("FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", +- clust16, fatlength16, maxclust16, MAX_CLUST_16); +- if (clust16 > maxclust16 - 2) { +- if (verbose >= 2) +- printf("FAT16: too much clusters\n"); ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 16)) ++ printf("Trying FAT16: #clu=%u, fatlen=%u, maxclu=%u, limit=%u/%u\n", ++ clust16, fatlength16, maxclust16, MIN_CLUST_16, MAX_CLUST_16); ++ if (clust16 > maxclust16) { ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 16)) ++ printf("Trying FAT16: too much clusters\n"); + clust16 = 0; + } +- /* The < 4078 avoids that the filesystem will be misdetected as having a ++ /* This avoids that the filesystem will be misdetected as having a + * 12 bit FAT. */ +- if (clust16 < FAT12_THRESHOLD +- && !(size_fat_by_user && size_fat == 16)) { +- if (verbose >= 2) +- printf("FAT16: would be misdetected as FAT12\n"); ++ if (clust16 && clust16 < MIN_CLUST_16) { ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 16)) ++ printf("Trying FAT16: not enough clusters, would be misdetected as FAT12\n"); + clust16 = 0; + } + +@@ -829,19 +843,20 @@ static void setup_tables(void) + maxclust32 = (fatlength32 * sector_size) / 4; + if (maxclust32 > MAX_CLUST_32) + maxclust32 = MAX_CLUST_32; +- if (clust32 && clust32 < MIN_CLUST_32 +- && !(size_fat_by_user && size_fat == 32)) { ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 32)) ++ printf("Trying FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u/%u\n", ++ clust32, fatlength32, maxclust32, MIN_CLUST_32, MAX_CLUST_32); ++ if (clust32 > maxclust32) { ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 32)) ++ printf("Trying FAT32: too much clusters\n"); + clust32 = 0; +- if (verbose >= 2) +- printf("FAT32: not enough clusters (%d)\n", MIN_CLUST_32); + } +- if (verbose >= 2) +- printf("FAT32: #clu=%u, fatlen=%u, maxclu=%u, limit=%u\n", +- clust32, fatlength32, maxclust32, MAX_CLUST_32); +- if (clust32 > maxclust32) { ++ /* When explicitely asked, allow to create FAT32 with less then MIN_CLUST_32 */ ++ if (clust32 && clust32 < MIN_CLUST_32 ++ && !(size_fat_by_user && size_fat == 32)) { ++ if (verbose >= 2 && (size_fat == 0 || size_fat == 32)) ++ printf("Trying FAT32: not enough clusters\n"); + clust32 = 0; +- if (verbose >= 2) +- printf("FAT32: too much clusters\n"); + } + + if ((clust12 && (size_fat == 0 || size_fat == 12)) || +@@ -869,23 +884,6 @@ static void setup_tables(void) + break; + + case 16: +- if (clust16 < FAT12_THRESHOLD) { +- if (size_fat_by_user) { +- fprintf(stderr, "WARNING: Not enough clusters for a " +- "16 bit FAT! The filesystem will be\n" +- "misinterpreted as having a 12 bit FAT without " +- "mount option \"fat=16\".\n"); +- } else { +- fprintf(stderr, "This filesystem has an unfortunate size. " +- "A 12 bit FAT cannot provide\n" +- "enough clusters, but a 16 bit FAT takes up a little " +- "bit more space so that\n" +- "the total number of clusters becomes less than the " +- "threshold value for\n" +- "distinction between 12 and 16 bit FATs.\n"); +- die("Make the filesystem a bit smaller manually."); +- } +- } + cluster_count = clust16; + fat_length = fatlength16; + bs.fat_length = htole16(fatlength16); +@@ -894,8 +892,7 @@ static void setup_tables(void) + + case 32: + if (clust32 < MIN_CLUST_32) +- fprintf(stderr, +- "WARNING: Not enough clusters for a 32 bit FAT!\n"); ++ fprintf(stderr, "WARNING: Number of clusters for 32 bit FAT is less then suggested minimum.\n"); + cluster_count = clust32; + fat_length = fatlength32; + bs.fat_length = htole16(0); +@@ -1053,9 +1050,9 @@ static void setup_tables(void) + + if (!cluster_count) { + if (sectors_per_cluster) /* If yes, die if we'd spec'd sectors per cluster */ +- die("Too many clusters for filesystem - try more sectors per cluster"); ++ die("Not enough or too many clusters for filesystem - try less or more sectors per cluster"); + else +- die("Attempting to create a too large filesystem"); ++ die("Attempting to create a too small or a too large filesystem"); + } + fat_entries = cluster_count + 2; + +@@ -1076,8 +1073,8 @@ static void setup_tables(void) + (le16toh(bs.secs_track) != 1) ? "s" : ""); + printf("hidden sectors 0x%04x;\n", hidden_sectors); + printf("logical sector size is %d,\n", sector_size); +- printf("using 0x%02x media descriptor, with %d sectors;\n", +- (int)(bs.media), num_sectors); ++ printf("using 0x%02x media descriptor, with %u sectors;\n", ++ (int)(bs.media), (unsigned)num_sectors); + printf("drive number 0x%02x;\n", (int) (vi->drive_number)); + printf("filesystem has %d %d-bit FAT%s and %d sector%s per cluster.\n", + (int)(bs.fats), size_fat, (bs.fats != 1) ? "s" : "", +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -6,7 +6,6 @@ endif + + TESTS = referenceFAT12.mkfs \ + referenceFAT16.mkfs \ +- referenceFAT32.mkfs \ + check-bad_names.fsck \ + check-chain_to_free_cluster.fsck \ + check-chain_too_long.fsck \ +@@ -28,6 +27,8 @@ dist_check_DATA = test-mkfs test-fsck + referenceFAT16.xxd \ + referenceFAT32.mkfs \ + referenceFAT32.xxd \ ++ mkfs-fat32_4K.mkfs \ ++ mkfs-fat32_4K.xxd \ + check-bad_names.fsck \ + check-chain_to_free_cluster.fsck \ + check-chain_too_long.fsck \ +--- /dev/null ++++ b/tests/mkfs-fat32_4K.mkfs +@@ -0,0 +1,3 @@ ++ARGS="-n TEST4K -S 4096" ++SIZE=614400 ++CMP_LIMIT=10M +--- /dev/null ++++ b/tests/mkfs-fat32_4K.xxd +@@ -0,0 +1,63 @@ ++00000000: eb58 906d 6b66 732e 6661 7400 1001 2000 .X.mkfs.fat... . ++00000010: 0200 0000 00f8 0000 2000 0800 0000 0000 ........ ....... ++00000020: 0058 0200 9600 0000 0000 0000 0200 0000 .X.............. ++00000030: 0100 0600 0000 0000 0000 0000 0000 0000 ................ ++00000040: 8000 29cd ab34 1254 4553 5434 4b20 2020 ..)..4.TEST4K ++00000050: 2020 4641 5433 3220 2020 0e1f be77 7cac FAT32 ...w|. ++00000060: 22c0 740b 56b4 0ebb 0700 cd10 5eeb f032 ".t.V.......^..2 ++00000070: e4cd 16cd 19eb fe54 6869 7320 6973 206e .......This is n ++00000080: 6f74 2061 2062 6f6f 7461 626c 6520 6469 ot a bootable di ++00000090: 736b 2e20 2050 6c65 6173 6520 696e 7365 sk. Please inse ++000000a0: 7274 2061 2062 6f6f 7461 626c 6520 666c rt a bootable fl ++000000b0: 6f70 7079 2061 6e64 0d0a 7072 6573 7320 oppy and..press ++000000c0: 616e 7920 6b65 7920 746f 2074 7279 2061 any key to try a ++000000d0: 6761 696e 202e 2e2e 200d 0a00 0000 0000 gain ... ....... ++000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++000001f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U. ++00000200: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++00001000: 5252 6141 0000 0000 0000 0000 0000 0000 RRaA............ ++00001010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++000011e0: 0000 0000 7272 4161 b356 0200 0200 0000 ....rrAa.V...... ++000011f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U. ++00001200: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++00006000: eb58 906d 6b66 732e 6661 7400 1001 2000 .X.mkfs.fat... . ++00006010: 0200 0000 00f8 0000 2000 0800 0000 0000 ........ ....... ++00006020: 0058 0200 9600 0000 0000 0000 0200 0000 .X.............. ++00006030: 0100 0600 0000 0000 0000 0000 0000 0000 ................ ++00006040: 8000 29cd ab34 1254 4553 5434 4b20 2020 ..)..4.TEST4K ++00006050: 2020 4641 5433 3220 2020 0e1f be77 7cac FAT32 ...w|. ++00006060: 22c0 740b 56b4 0ebb 0700 cd10 5eeb f032 ".t.V.......^..2 ++00006070: e4cd 16cd 19eb fe54 6869 7320 6973 206e .......This is n ++00006080: 6f74 2061 2062 6f6f 7461 626c 6520 6469 ot a bootable di ++00006090: 736b 2e20 2050 6c65 6173 6520 696e 7365 sk. Please inse ++000060a0: 7274 2061 2062 6f6f 7461 626c 6520 666c rt a bootable fl ++000060b0: 6f70 7079 2061 6e64 0d0a 7072 6573 7320 oppy and..press ++000060c0: 616e 7920 6b65 7920 746f 2074 7279 2061 any key to try a ++000060d0: 6761 696e 202e 2e2e 200d 0a00 0000 0000 gain ... ....... ++000060e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++000061f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U. ++00006200: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++00007000: 5252 6141 0000 0000 0000 0000 0000 0000 RRaA............ ++00007010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++000071e0: 0000 0000 7272 4161 b356 0200 0200 0000 ....rrAa.V...... ++000071f0: 0000 0000 0000 0000 0000 0000 0000 55aa ..............U. ++00007200: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++00020000: f8ff ff0f ffff ff0f f8ff ff0f 0000 0000 ................ ++00020010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++000b6000: f8ff ff0f ffff ff0f f8ff ff0f 0000 0000 ................ ++000b6010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++0014c000: 5445 5354 344b 2020 2020 2008 0000 5a4b TEST4K ...ZK ++0014c010: 6e46 6e46 0000 5a4b 6e46 0000 0000 0000 nFnF..ZKnF...... ++0014c020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++257ffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ +--- a/tests/referenceFAT32.xxd ++++ b/tests/referenceFAT32.xxd +@@ -52,3 +52,8 @@ + 001f8020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ + * + 3e7ffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++001f8000: 5445 5354 4641 5433 3220 2008 0000 5a4b TESTFAT32 ...ZK ++001f8010: 6e46 6e46 0000 5a4b 6e46 0000 0000 0000 nFnF..ZKnF...... ++001f8020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ++* ++3e7ffff0: 0000 0000 0000 0000 0000 0000 0000 0000 ................