summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Android.mk9
-rw-r--r--dosfstools/Android.mk50
-rw-r--r--dosfstools/ChangeLog1682
-rw-r--r--dosfstools/Makefile136
-rw-r--r--dosfstools/VERSION1
-rw-r--r--dosfstools/doc/ANNOUNCE.mkdosfs2
-rw-r--r--dosfstools/doc/README.dosfsck4
-rw-r--r--dosfstools/doc/README.mkdosfs4
-rw-r--r--dosfstools/man/dosfsck.8112
-rw-r--r--dosfstools/man/dosfslabel.829
-rw-r--r--dosfstools/man/mkdosfs.8224
-rw-r--r--dosfstools/manpages/Makefile50
-rwxr-xr-xdosfstools/manpages/bin/update-version.sh55
-rw-r--r--dosfstools/manpages/de/fatlabel.de.868
-rw-r--r--dosfstools/manpages/de/fsck.fat.de.8189
-rw-r--r--dosfstools/manpages/de/mkfs.fat.de.8172
-rw-r--r--dosfstools/manpages/en/fatlabel.865
-rw-r--r--dosfstools/manpages/en/fsck.fat.8206
-rw-r--r--dosfstools/manpages/en/mkfs.fat.8178
-rw-r--r--dosfstools/manpages/po/de/fatlabel.8.po173
-rw-r--r--dosfstools/manpages/po/de/fsck.fat.8.po559
-rw-r--r--dosfstools/manpages/po/de/mkfs.fat.8.po481
-rw-r--r--dosfstools/manpages/po4a.cfg5
-rw-r--r--dosfstools/manpages/pot/fatlabel.8.pot176
-rw-r--r--dosfstools/manpages/pot/fsck.fat.8.pot562
-rw-r--r--dosfstools/manpages/pot/mkfs.fat.8.pot484
-rw-r--r--dosfstools/src/boot.c226
-rw-r--r--dosfstools/src/boot.h4
-rw-r--r--dosfstools/src/check.c184
-rw-r--r--dosfstools/src/check.h7
-rw-r--r--dosfstools/src/common.c9
-rw-r--r--dosfstools/src/common.h11
-rw-r--r--dosfstools/src/dosfsck.h218
-rw-r--r--dosfstools/src/fat.c107
-rw-r--r--dosfstools/src/fat.h21
-rw-r--r--dosfstools/src/fatlabel.c (renamed from dosfstools/src/dosfslabel.c)46
-rw-r--r--dosfstools/src/file.c12
-rw-r--r--dosfstools/src/file.h5
-rw-r--r--dosfstools/src/fsck.fat.c (renamed from dosfstools/src/dosfsck.c)79
-rw-r--r--dosfstools/src/fsck.fat.h191
-rw-r--r--dosfstools/src/io.c16
-rw-r--r--dosfstools/src/io.h11
-rw-r--r--dosfstools/src/lfn.c62
-rw-r--r--dosfstools/src/lfn.h3
-rw-r--r--dosfstools/src/mkfs.fat.c (renamed from dosfstools/src/mkdosfs.c)493
-rw-r--r--dosfstools/src/msdos_fs.h61
-rw-r--r--dosfstools/src/version.h7
-rw-r--r--gui/action.cpp2
-rw-r--r--partition.cpp16
-rw-r--r--partitions.hpp2
-rw-r--r--prebuilt/Android.mk6
51 files changed, 6059 insertions, 1416 deletions
diff --git a/Android.mk b/Android.mk
index 5ee7bf966..33a43d8b4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -341,10 +341,9 @@ LOCAL_ADDITIONAL_DEPENDENCIES := \
toolbox_symlinks \
twrp \
unpigz_symlink \
- dosfsck \
- dosfslabel \
- fsck_msdos_symlink \
- mkdosfs \
+ fsck.fat \
+ fatlabel \
+ mkfs.fat \
permissive.sh
ifneq ($(TARGET_ARCH), arm64)
@@ -418,7 +417,7 @@ ifneq ($(TW_USE_TOOLBOX), true)
include $(CLEAR_VARS)
# Create busybox symlinks... gzip and gunzip are excluded because those need to link to pigz instead
BUSYBOX_LINKS := $(shell cat external/busybox/busybox-full.links)
-exclude := tune2fs mke2fs mkdosfs gzip gunzip
+exclude := tune2fs mke2fs mkdosfs mkfs.vfat gzip gunzip
# If busybox does not have restorecon, assume it does not have SELinux support.
# Then, let toolbox provide 'ls' so -Z is available to list SELinux contexts.
diff --git a/dosfstools/Android.mk b/dosfstools/Android.mk
index 67cc5df92..b241a738c 100644
--- a/dosfstools/Android.mk
+++ b/dosfstools/Android.mk
@@ -2,53 +2,51 @@ ifneq ($(TARGET_SIMULATOR),true)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := src/boot.c src/check.c src/common.c \
- src/fat.c src/file.c src/io.c src/lfn.c src/dosfsck.c
-#LOCAL_C_INCLUDES := $(KERNEL_HEADERS)
+LOCAL_SRC_FILES := \
+ src/boot.c \
+ src/check.c \
+ src/common.c \
+ src/fat.c \
+ src/file.c \
+ src/io.c \
+ src/lfn.c \
+ src/fsck.fat.c
+
LOCAL_SHARED_LIBRARIES := libc
LOCAL_CFLAGS += -D_USING_BIONIC_
LOCAL_CFLAGS += -DUSE_ANDROID_RETVALS
-LOCAL_MODULE = dosfsck
+LOCAL_MODULE = fsck.fat
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
include $(BUILD_EXECUTABLE)
-# build symlink
-SYMLINKS := $(addprefix $(TARGET_RECOVERY_ROOT_OUT)/sbin/,fsck_msdos)
-$(SYMLINKS): DOSFSCK_BINARY := $(LOCAL_MODULE)
-$(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk
- @echo "Symlink: $@ -> $(DOSFSCK_BINARY)"
- @mkdir -p $(dir $@)
- @rm -rf $@
- $(hide) ln -sf $(DOSFSCK_BINARY) $@
-
include $(CLEAR_VARS)
-LOCAL_MODULE := fsck_msdos_symlink
-LOCAL_MODULE_TAGS := optional
-LOCAL_ADDITIONAL_DEPENDENCIES := $(SYMLINKS)
-include $(BUILD_PHONY_PACKAGE)
-SYMLINKS :=
+LOCAL_SRC_FILES := \
+ src/boot.c \
+ src/check.c \
+ src/common.c \
+ src/fat.c \
+ src/file.c \
+ src/io.c \
+ src/lfn.c \
+ src/fatlabel.c
-include $(CLEAR_VARS)
-LOCAL_SRC_FILES := src/boot.c src/check.c src/common.c src/fat.c \
- src/file.c src/io.c src/lfn.c src/dosfslabel.c
-#LOCAL_C_INCLUDES := $(KERNEL_HEADERS)
LOCAL_C_INCLUDES += bionic/libc/kernel/common
LOCAL_SHARED_LIBRARIES := libc
LOCAL_CFLAGS += -D_USING_BIONIC_
-LOCAL_MODULE = dosfslabel
+LOCAL_MODULE = fatlabel
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
-LOCAL_SRC_FILES := src/mkdosfs.c
-#LOCAL_C_INCLUDES := $(KERNEL_HEADERS)
+LOCAL_SRC_FILES := src/mkfs.fat.c
+
LOCAL_SHARED_LIBRARIES := libc
LOCAL_CFLAGS += -D_USING_BIONIC_
-LOCAL_MODULE = mkdosfs
+LOCAL_MODULE = mkfs.fat
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := RECOVERY_EXECUTABLES
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin
diff --git a/dosfstools/ChangeLog b/dosfstools/ChangeLog
index b8dc2e010..f6a1e3da9 100644
--- a/dosfstools/ChangeLog
+++ b/dosfstools/ChangeLog
@@ -1,4 +1,1150 @@
-commit 2e20319843ea85d77c51a9ce9a9b278662426d98
+commit ad1342e
+Author: Andreas Bombe <aeb@debian.org>
+Date: Sat May 16 02:10:18 2015 +0200
+
+ manpages: Mark MT and ME tags as untranslated for po4a
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 3ed9ec2
+Author: Andreas Bombe <aeb@debian.org>
+Date: Sun May 10 19:59:02 2015 +0200
+
+ mkfs: Small changes to FAT32 cluster size selection
+
+ Put the cluster size selection back in line with the table used in
+ Microsoft's fatgen103.pdf and fix the comment. This only involved
+ changing some comparison operators, all values stayed the same.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 9984552
+Author: Andreas Bombe <aeb@debian.org>
+Date: Mon Apr 20 23:41:34 2015 +0200
+
+ fsck: Mention -r is default in usage message
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 3eaca68
+Author: Andreas Bombe <aeb@debian.org>
+Date: Mon Apr 20 23:30:56 2015 +0200
+
+ manpages: Remove obsolete information about Linux FAT support
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit a5e34de
+Author: Andreas Bombe <aeb@debian.org>
+Date: Thu Apr 16 23:16:08 2015 +0200
+
+ manpages: Convert the rest of argument placeholders to upper case
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 2303765
+Author: Andreas Bombe <aeb@debian.org>
+Date: Thu Apr 16 22:51:20 2015 +0200
+
+ manpages: Fix formatting
+
+ Make the manpages conform to the rules for groff sources. First,
+ eliminate empty lines because these create vertical spaces where it
+ isn't desired. Man page sources should not contain empty lines. Second,
+ put a line break between sentences in a paragraph. A period is
+ recognized and formatted as a full stop period only when a line break
+ comes right after it.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit d3969b8
+Author: Andreas Bombe <aeb@debian.org>
+Date: Fri Apr 10 20:32:50 2015 +0200
+
+ fsck: Verify first cluster of a file is not 1
+
+ Previously the FAT was checked for any out of bounds entries which were
+ cleared. However the first cluster of a file, as specified in its
+ directory entry, was not verified to not be 1.
+
+ In addition to missing this filesystem error, code that correctly
+ assumes the FAT contained no bad entries anymore could still look up
+ invalid table indices depending on the value stored in entry 1. With
+ the right values and FAT size this can lead to a segfault by accessing
+ unallocated memory.
+
+ Now test_file() will ignore files where the first cluster equals 1 and
+ an additional check in check_file() will truncate them.
+
+ This bug was reported in http://bugs.debian.org/773885 by Jakub Wilk.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 2a56575
+Author: Andreas Bombe <aeb@debian.org>
+Date: Thu Apr 2 23:35:00 2015 +0200
+
+ Simplify synopses of man pages
+
+ Since there is only one mode of invocation for the tools, it is
+ somewhat pointless to list every possible option in the synopsis.
+
+ Fix a few style inconsistencies in addition, specifically that
+ placeholders for option arguments are in capital letters and should be
+ shown where the option is described.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 40f1436
+Author: Andreas Bombe <aeb@debian.org>
+Date: Wed Apr 1 20:55:58 2015 +0200
+
+ Update homepage and maintainer sections of man pages
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 0169db8
+Author: Andreas Bombe <aeb@debian.org>
+Date: Wed Apr 1 20:05:01 2015 +0200
+
+ mkfs: Show a clearer message that file already exists with -C
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 2967e27
+Author: Andreas Bombe <aeb@debian.org>
+Date: Mon Mar 30 21:12:51 2015 +0200
+
+ mkfs: Remove O_TRUNC from file creation call
+
+ open() is called with O_EXCL | O_CREAT, so it will definitely create a
+ new, empty file or error out. O_TRUNC is superfluous and may be harmless
+ in practice but its effect under these circumstances is unspecified.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 90612df
+Author: Andreas Bombe <aeb@debian.org>
+Date: Mon Mar 30 21:09:51 2015 +0200
+
+ mkfs: Use ftruncate() for expanding created file
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 58e8e09
+Author: Andreas Bombe <aeb@debian.org>
+Date: Tue Mar 24 21:32:40 2015 +0100
+
+ mkfs: Add --invariant option
+
+ The --invariant option is designed to prevent random or time based
+ differences to end up in generated filesystems so that multiple runs
+ generate on the same file or device create completely identical results.
+
+ This is intended for debugging or regression testing of mkfs.fat.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 354feaf
+Author: Andreas Bombe <aeb@debian.org>
+Date: Thu Mar 19 21:35:21 2015 +0100
+
+ mkfs: Add long option parsing
+
+ Add long option parsing with getopt_long() to mkfs and define --help as
+ the first long option. The usage() function now takes an exit code
+ parameter so that the --help option handling can exit the program with
+ a success exit code.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit b611549
+Author: Andreas Bombe <aeb@debian.org>
+Date: Mon Mar 16 21:08:35 2015 +0100
+
+ Do not expect EOF as return value of getopt()
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit a41fc32
+Author: Andreas Bombe <aeb@debian.org>
+Date: Wed Mar 11 21:45:04 2015 +0100
+
+ fsck.fat: Fix read beyond end of array on FAT12
+
+ When a FAT12 filesystem contains an odd number of clusters, setting the
+ last cluster with set_fat() will trigger a read of the next entry,
+ which does not exist in the fat array allocated for this.
+
+ Round up the allocation to an even number of FAT entries for FAT12 so
+ that this is fixed without introducing special casing in get_fat().
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit e18d72f
+Author: Álvaro Fernández Rojas <noltari@gmail.com>
+Date: Sat Mar 7 13:23:23 2015 +0100
+
+ Remove linux/msdos_fs.h includes
+
+ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 245d0cc
+Author: Álvaro Fernández Rojas <noltari@gmail.com>
+Date: Thu Feb 26 19:22:54 2015 +0100
+
+ Remove non standard int types
+
+ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 628b3ec
+Author: Álvaro Fernández Rojas <noltari@gmail.com>
+Date: Thu Feb 26 19:41:19 2015 +0100
+
+ Improve .gitignore
+
+ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 02b5a6d
+Author: Álvaro Fernández Rojas <noltari@gmail.com>
+Date: Thu Feb 26 12:51:23 2015 +0100
+
+ Makefile: avoid using install -D
+
+ OS X and FreeBSD are not compatible with this option
+
+ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit fb6aea6
+Author: Álvaro Fernández Rojas <noltari@gmail.com>
+Date: Thu Feb 26 12:50:57 2015 +0100
+
+ Makefile: fix typo in uninstall-man
+
+ Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 357ab07
+Author: Andreas Bombe <aeb@debian.org>
+Date: Thu Feb 19 21:22:54 2015 +0100
+
+ fsck.fat: Make -r option default
+
+ Default mode is now to interactively repair with the option to write
+ the changes back at the end (like the -r option) instead of the previous
+ default mode of interactively correcting but never writing back the
+ changes.
+
+ The -r option continues to be recognized by fsck.fat.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 266a5fc
+Author: Andreas Bombe <aeb@debian.org>
+Date: Fri Feb 20 03:19:28 2015 +0100
+
+ mkfs.fat: Allow 0xF0 to be specified as media byte
+
+ Let the -M option accept 0xF0, which should be the proper descriptor
+ byte for 3.5" 1.44 MB and 2.88 MB floppies.
+
+ Also split the error reporting for -M between badly formatted and
+ invalid numbers.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 16e97e9
+Author: Andreas Bombe <aeb@debian.org>
+Date: Wed Jan 28 15:07:18 2015 +0100
+
+ Make all char* that may take literals const
+
+ Every char* variable or function argument that may be given a literal
+ string is now made const. Additionally add -Wwrite-strings to CFLAGS to
+ enable a warning where const would be missing.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 8b8948c
+Author: Andreas Bombe <aeb@debian.org>
+Date: Mon Dec 29 18:24:54 2014 +0100
+
+ mkfs.fat.c: Use unsigned char for binary data
+
+ Simple char technically works for the dummy_boot_jump variables, but
+ some compiler warning settings would give a warning over a signed char
+ overflowing with the values given as initializers.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 45aeed0
+Author: Andreas Bombe <aeb@debian.org>
+Date: Sun Nov 16 19:49:22 2014 +0100
+
+ Fix indentation of "fix power loss damage" commit
+
+ I fixed the (sometimes misleading) indentation of the code introduced in
+ commit 6893c45 to be in line with the reset of the code and also removed
+ the /* PATCH ED+DL */ comments which are quite meaningless to the wider
+ world.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 75c5446
+Author: Andreas Bombe <aeb@debian.org>
+Date: Sat Nov 15 16:48:48 2014 +0100
+
+ Add tags and editor backup files to .gitignore
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit cb98ae2 (tag: v3.0.27)
+Author: Andreas Bombe <aeb@debian.org>
+Date: Wed Nov 12 01:10:23 2014 +0100
+
+ Releasing version 3.0.27.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit e2c8f06
+Author: Andreas Bombe <aeb@debian.org>
+Date: Wed Nov 12 00:22:17 2014 +0100
+
+ fsck.fat: Don't print version string every time -v is encountered
+
+ Remove the printing of the version string every time -v is seen during
+ command line parsing in fsck.fat. The version string is printed anyway
+ before opening the filesystem device/image.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 82076b6
+Author: Andreas Bombe <aeb@debian.org>
+Date: Tue Nov 11 23:25:30 2014 +0100
+
+ Fix attempt to rename root dir in fsck due to uninitialized fields
+
+ When add_file() is called with offset 0, it will construct a DIR_ENT for
+ the root directory instead of reading the contents from the filesystem.
+ It did not initialize the whole DIR_ENT on the stack, just select
+ values.
+
+ In particular, the lcase field was left with an undefined value. If
+ that value happened to include the FAT_NO_83NAME bit, the "neither long
+ nor short file name" check in bad_name() added in 3.0.26 would trigger
+ and cause an attempt to rename the entry (which is not possible).
+ Example run:
+
+ $ /sbin/fsck.fat -y bad.img
+ fsck.fat 3.0.26 (2014-03-07)
+ /
+ Bad short file name ().
+ Auto-renaming it.
+ Renamed to
+ bad.img: 14 files, 19388/403266 clusters
+
+ This commit changes the initialization zeroize the whole struct before
+ setting individual fields. Thanks to AlexisM, who found the cause and
+ posted a patch on the Debian bug http://bugs.debian.org/764992 .
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit c24ecb6
+Author: Andreas Bombe <aeb@debian.org>
+Date: Tue Nov 11 22:49:50 2014 +0100
+
+ Support long file names in volume labeling code
+
+ The code to find the volume label directory entry in find_volume_de()
+ did not consider long file names so far. Directory entries that make up
+ long file names have four attribute bits set, including the "volume"
+ bit.
+
+ This caused the code to mistake a directory entry that is part of a
+ long file name as the volume name entry. If such an entry is found
+ first, fatlabel would print garbage when asked to display the label and
+ mangle the long file name when asked to set it. The latter would lead
+ to the loss of the long file name and require a fsck to clean up.
+
+ Change so that the set of attributes equal that of LFN entries will no
+ langer match as a volume label.
+
+ Signed-off-by: Andreas Bombe <aeb@debian.org>
+
+commit 1646f6e (tag: v3.0.26)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Mar 7 18:40:13 2014 +0100
+
+ Releasing version 3.0.26.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 6893c45
+Author: Dir Lotter <dirk.lotter@siemens.com>
+Date: Fri Mar 7 18:25:39 2014 +0100
+
+ Fix "odd" files created by frequent power-loss.
+
+ After running many power losses the filesystem can degrate, containing "odd"
+ files making the filesystem corrupt that could not be solved by fsck:
+
+ * file was not visible in a ls -l
+ * ls -i reported a "invalid file name" on the console
+ * a test program with diropen/dirread showed the file, a stat on this file
+ failed
+ * file was not accessible and could not be deleted
+
+ After digging into the code we found why fsck didn't repair the file system:
+ One thing was we don't have short filenames. Another issue was that the LFN
+ pointer was set to NULL and so it looked like we didn't have short and long
+ filenames.
+
+ Our patch of check.c includes:
+
+ * returns 1 from function bad_name() in case no short and no long filename
+ exist
+ * auto_rename() and rename_file() got a special handling for the case no short
+ file name exist:
+ - it enables the short file name (we think here was a weakness of the old
+ code: it changed the short filename but didn't enabled it in the
+ file->dir_ent.lcase entry)
+ - it reset all attributes except ATTR_DIR and ATTR_VOLUME
+
+ This solved our problem pretty well.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 621e11f
+Author: Natanael Copa <ncopa@alpinelinux.org>
+Date: Sat Feb 8 18:53:30 2014 +0100
+
+ Build fixes for musl libc.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 52588b7 (tag: v3.0.25)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Jan 17 07:11:11 2014 +0100
+
+ Releasing version 3.0.25.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit acf64ae
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Jan 17 07:09:54 2014 +0100
+
+ Updating copyright headers for 2014.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 21fe921
+Author: Andrew Tridgell <tridge@samba.org>
+Date: Tue Jan 14 09:37:51 2014 +1100
+
+ Fixed remaining 64 bit build warnings.
+
+ Some of these may be real bugs.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 9e3a2b1
+Author: Andrew Tridgell <tridge@samba.org>
+Date: Tue Jan 14 09:25:28 2014 +1100
+
+ 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.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 0d2c9bc (tag: v3.0.24)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Sat Nov 23 10:36:55 2013 +0100
+
+ Releasing version 3.0.24.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 55bd7b7
+Author: Jaroslav Skarvada <jskarvad@redhat.com>
+Date: Sat Nov 23 10:34:48 2013 +0100
+
+ Fixed dosfsck on big endian platforms (Resolves: rhbz#1029695).
+
+ It seems there is problem in the double conversion on big endians.
+ The first conversion is done by the explicit conversion to __u16
+ in the GET_UNALIGNED_W macro, so the secondary conversion by le16toh
+ seems to be redundant (and wrong).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 6debb4a (tag: v3.0.23)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Oct 15 08:05:46 2013 +0200
+
+ Releasing version 3.0.23.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 07d85ff
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Oct 15 08:04:11 2013 +0200
+
+ Reformating mkfs.fat manpage.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 137552f
+Author: Michael Shigorin <mike@altlinux.org>
+Date: Tue Oct 15 01:29:33 2013 +0400
+
+ Fixing "Fixing default sectors per cluster for FAT32" for UEFI.
+
+ FAT32 "EFI System Partition" is basically required for UEFI boot;
+ commit ge048a8d broke that for me with both virtualbox-4.2 and
+ real hardware (ASUS C60M1-I to be exact) given ~250Mb filesystem.
+
+ This commit amends that one by reverting its effects for these
+ small sizes by restoring 512b cluster size for <= 260Mb FAT32.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 2000696
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Aug 9 09:38:13 2013 +0200
+
+ Also allowing lowercase labels in mkfs (with warning message) consistent with the recent fsck change, thanks to Michael Baum <mbaum@devonit.com>.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 9b04807
+Author: Tim Harder <radhermit@gentoo.org>
+Date: Fri Jul 19 18:15:21 2013 +0200
+
+ Add install-man dependency to install-symlinks Makefile target.
+
+ This fixes a race condition during parallel installs where man page
+ symlinks won't be installed because install-man hasn't been run yet.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 651f91c (tag: v3.0.22)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Jul 19 07:01:19 2013 +0200
+
+ Releasing version 3.0.22.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 3dc5560
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Jul 19 06:55:24 2013 +0200
+
+ Addding install-symlinks target to phony targets in Makefile.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit c6c0581
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Jul 19 06:55:00 2013 +0200
+
+ Adding uninstall-symlinks target in Makefile.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 465dd8c
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Jul 19 06:45:40 2013 +0200
+
+ Allowing fatlabel to write labels in all lowercase but give a warning about DOS/Windows (Closes: #714971).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 3621b30
+Author: John S Gruber <JohnSGruber@gmail.com>
+Date: Fri Jul 19 06:40:21 2013 +0200
+
+ Add options and make dos boot sector more compatible with reference system (Closes: #552673).
+
+ Unless overridden by the user sets the DOS boot sector's
+ hidden-sectors field to match the start of a hard disk's
+ partition.
+
+ Initialize DOS boot sector drive_number according to FAT media type
+ Addresses LP: #398241 and Debian #552673
+
+ Adds options to override the DOS boot sector device_number and
+ the FAT media type.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit be1eed5
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jul 17 12:52:20 2013 +0200
+
+ Correcting wrong check preventing installation of fatlabel legacy manpage symlink.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit d0065d3 (tag: v3.0.21)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Jul 16 08:34:28 2013 +0200
+
+ Releasing version 3.0.21.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit a74c12c
+Author: Jaroslav Skarvada <jskarvad@redhat.com>
+Date: Tue Jun 25 14:53:14 2013 +0200
+
+ Adding the missing -p option to the fsck manpage (to be consistent with the output of the tool).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 25e03c9
+Author: Patrick J. Volkerding <volkerdi@slackware.com>
+Date: Mon Jun 24 14:23:00 2013 +0200
+
+ Using $MANDIR instead of hardcoded ${PREFIX}/share/man in the Makefile.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 7fd9cf7
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Fri Jun 14 18:50:31 2013 +0200
+
+ Making install-symlinks Makefile target depend on install-bin to not break when using make in parallel, thanks to David Walser <luigiwalser@yahoo.com>.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit a76bbcd
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jun 12 13:00:10 2013 +0200
+
+ Using US digit date format in version date, rather than name abbrev.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit a64195f (tag: v3.0.20)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jun 12 12:25:32 2013 +0200
+
+ Releasing version 3.0.20.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 1a5d99f
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jun 12 12:07:58 2013 +0200
+
+ Softening message about different boot sectors a bit (Closes: #704198).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 4727286
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jun 12 11:42:52 2013 +0200
+
+ Harmonizing program name output.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 17c956c
+Author: Martin Wilck <mwilck@arcor.de>
+Date: Wed Jun 12 11:38:00 2013 +0200
+
+ Don't align FAT to cluster size.
+
+ See previous patch for explanation.
+
+ With this patch and the previous two, the
+ mkdosfs generated FAT32 file systems work well in my extremely
+ picky TechniSat device. Of course, they're also detected cleanly
+ by Linux and Windows.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit d63e0d6
+Author: Martin Wilck <mwilck@arcor.de>
+Date: Wed Jun 12 11:36:08 2013 +0200
+
+ Don't align FAT32 reserved sectors to cluster size.
+
+ For certain file system sizes (in particular, exact GB sizes -
+ don't ask me why) a Technisat HD S2 Plus DVB receiver will still
+ choke on mkdosfs generated file systems, even if the sectors per
+ cluster problem is fixed.
+
+ By comparing the properties of generated FAT32 FS with results
+ of the Windows tool "h2format" (www.heise.de/download/h2format.html),
+ I found that the remaining problems were caused by rounding of the
+ reserved sectors and FAT space to cluster size (the h2format tool
+ doesn't do this).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit e048a8d
+Author: Martin Wilck <mwilck@arcor.de>
+Date: Wed Jun 12 11:33:33 2013 +0200
+
+ Fixing default sectors per cluster for FAT32 (Closes: #690062).
+
+ The default sectors per cluster calculated by mkdosfs are outdated,
+ see http://technet.microsoft.com/en-us/library/cc938438.aspx.
+
+ The deviations may cause some 3rd party devices (e.g. TechniSat DVB
+ receivers) to hang when reading mkdosfs generated file systems.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 86509aa
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Jun 11 20:19:09 2013 +0200
+
+ Splitting out legacy symlink creation in toplevel Makefile to own target.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit da37dd1
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jun 12 11:29:12 2013 +0200
+
+ Correcting wrong toolname in fsck.fat.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit b29a722
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Jun 11 19:51:47 2013 +0200
+
+ Consistently spelling filesystem as filesystem, and not file system.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 977d7aa
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Jun 11 19:30:19 2013 +0200
+
+ Removing Debian reference in GPL license headers.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 5505cc2 (tag: v3.0.19)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Jun 11 18:46:03 2013 +0200
+
+ Releasing version 3.0.19.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 2c88f35
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Jun 11 18:44:50 2013 +0200
+
+ Running indent on source files.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit d495d43
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Tue Jun 11 18:41:41 2013 +0200
+
+ Using memcpy instead of strcpy to fix segfault with fortify, thanks to Dave Reisner <falconindy@jabber.org>.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 9fb4ffc
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Sun Jun 9 13:17:16 2013 +0200
+
+ Correcting fsck.fat spelling error in manpages, thanks to E.J.M. Hartman <E.J.M.Hartman@tudelft.nl>.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 2d8ef9b (tag: v3.0.18)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Thu Jun 6 09:49:00 2013 +0200
+
+ Releasing version 3.0.18.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit d4e1180
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Thu Jun 6 09:38:45 2013 +0200
+
+ Adding initial i18n support for manpages with po4a.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit ea8f712
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Thu Jun 6 09:17:13 2013 +0200
+
+ Renaming tools to sane namespace and keeping legacy symlinks in place.
+
+ dosfslabel becomes fatlabel,
+ dosfsck becomes fsck.fat,
+ and mkdosfs becomes mkfs.fat.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit a42b127
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jun 5 07:12:03 2013 +0200
+
+ Correcting wrong spelling of Debian in mkdosfs manpage.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 2749084
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jun 5 07:10:50 2013 +0200
+
+ Correcting spelling typo in boot.c.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 6461c83
+Author: Martin Pitt <martinpitt@gnome.org>
+Date: Fri May 24 09:35:44 2013 +0200
+
+ dosfslabel: Do not read beyond string length (Closes: #709587).
+
+ When checking whether the label contains any lower-case characters, do not read
+ beyond the end of the string.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 4203a90 (tag: v3.0.17)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed May 29 10:14:09 2013 +0200
+
+ Releasing version 3.0.17.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 3aa88ed
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed May 29 09:48:24 2013 +0200
+
+ Updating maximal lenght of a label in manpage to talk about bytes instead of characters, thanks to Francois Wendling <frwendling@gmail.com> (Closes: #655953).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 0916f8a
+Author: Jaroslav Skarvada <jskarvad@redhat.com>
+Date: Wed May 29 09:56:08 2013 +0200
+
+ Fixing segfault in dosfslabel.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 4a265c6
+Author: James Byrne <jbyrne@aminocom.com>
+Date: Mon Apr 22 12:29:51 2013 +0100
+
+ Allow operation on SH4 CPUs and remove compiler warnings.
+
+ Simplify the GET_UNALIGNED_W macro and use it in all cases instead of making it
+ conditional on CPU types. This missed some CPUs that needed it (e.g. SH4), and
+ in any case the implementation caused "dereferencing type-punned pointer will
+ break strict-aliasing rules" warnings.
+
+ Enable extra warnings, but disable signed comparison and missing field
+ initializer warnings as these are not helpful.
+
+ Update write_boot_label() so that the boot_sector_16 and boot_sector cases are
+ handled separately instead of using an aliased pointer, as that causes
+ "dereferencing type-punned pointer will break strict-aliasing rules" warnings.
+
+ Make date_dos2unix(), usage() and cdiv() static functions as they are only used
+ in the files in which they are declared.
+
+ Update bad_name() and lfn_get() so that the extension is processed separately
+ instead of by indexing past the end of the name field as that causes "array
+ subscript is above array bounds" warnings.
+
+ Update the dosfsck() main function to avoid a warning that free_clusters may
+ be used uninitialized. Do not print the final count of files and clusters when
+ dosfsck is run with the "-b" option because the used files and clusters have
+ not been counted in this case.
+
+ Alter the setup_tables() function so that it does not cause an "array subscript
+ is below array bounds" warning.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit eb68a14
+Author: James Byrne <jbyrne@aminocom.com>
+Date: Mon Apr 22 13:32:01 2013 +0100
+
+ Add a .gitignore file.
+
+ Add a .gitignore file so that the results of compilation do not appear as
+ changes.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 336e8f1
+Author: James Byrne <jbyrne@aminocom.com>
+Date: Mon Apr 22 12:38:52 2013 +0100
+
+ Finish cleanup of byteswap code.
+
+ Commit 9ba8992 left three references to the old CT_LE_W macro.
+ Remove these since no conversion was needed as the value being
+ converted was zero.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 64b6227
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Thu Apr 4 08:08:00 2013 +0200
+
+ Shortening links to upstream homepage.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 76304be
+Author: Cristian Rodríguez <crrodriguez@opensuse.org>
+Date: Fri Mar 1 08:23:34 2013 +0100
+
+ Fix offsetof definition.
+
+ * include stddef.h to get the correct offsetof definition.
+ * remove local offsetof definition, systems not having it on stddef.h
+ are in violation of C89, C99, POSIX.1-2001.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 9ba8992
+Author: Cristian Rodríguez <crrodriguez@opensuse.org>
+Date: Fri Mar 1 08:58:36 2013 +0100
+
+ Cleanup byteswap code.
+
+ Remove all duplicate macro definitions for byteswapping routines
+ and replace them for proper usage of userspace endian(3).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 8733e12 (tag: v3.0.16)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed May 29 10:06:01 2013 +0200
+
+ Releasing version 3.0.16.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit a9fa87e
+Author: Petr Gajdos <pgajdos@suse.cz>
+Date: Fri Mar 1 08:34:12 2013 +0100
+
+ Create rootdir entry volume label with mkdosfs, create it when
+ it doesn't exist with dosfslabel.
+
+ See https://bugzilla.novell.com/show_bug.cgi?id=657011#c4
+ for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 92057f1
+Author: Petr Gajdos <pgajdos@suse.cz>
+Date: Fri Mar 1 08:33:18 2013 +0100
+
+ Forbid lowercase letters in label.
+
+ See https://bugzilla.novell.com/show_bug.cgi?id=657011#c4 and
+ http://support.microsoft.com/kb/71715/en-us for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 5e265c4
+Author: Petr Gajdos <pgajdos@suse.cz>
+Date: Fri Mar 1 08:32:02 2013 +0100
+
+ Read label also from rootdir entry.
+
+ See https://bugzilla.novell.com/show_bug.cgi?id=657011#c4
+ for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 5cec53c
+Author: Petr Gajdos <pgajdos@suse.cz>
+Date: Fri Mar 1 08:30:21 2013 +0100
+
+ alloc_rootdir_entry() is intended to be called with pattern == "FSCK%04dREC",
+ the old code (probably c&p from auto_rename()) doesn't reflect this.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 63938f0
+Author: Petr Gajdos <pgajdos@suse.cz>
+Date: Fri Mar 1 08:29:00 2013 +0100
+
+ Instead of eleven blanks, fill in "NO NAME " as specification tells.
+
+ See https://bugzilla.novell.com/show_bug.cgi?id=657011#c4 and
+ http://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 10c1c41
+Author: Petr Gajdos <pgajdos@suse.cz>
+Date: Fri Mar 1 08:58:15 2013 +0100
+
+ Write uppercase letters in label.
+
+ See https://bugzilla.novell.com/show_bug.cgi?id=657011#c4 and
+ http://support.microsoft.com/kb/71715/en-us for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit a75fb1c (tag: v3.0.15)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Thu Feb 21 15:06:52 2013 +0100
+
+ Releasing version 3.0.15.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit c8f84fd
+Author: Alexander Korolkov <alexander.korolkov@gmail.com>
+Date: Mon Feb 4 00:22:34 2013 +0400
+
+ Using wcstombs() to convert LFN unicode characters to printable text.
+
+ This closes Debian bug #596336.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 1546545
+Author: Alexander Korolkov <alexander.korolkov@gmail.com>
+Date: Sun Sep 5 18:59:47 2010 +0400
+
+ Recode short filenames from DOS codepage (default 437).
+
+ Recode short filenames from DOS codepage (default 437) to the current
+ character encoding. This makes messages of dosfsck more readable.
+ Partially closes Debian bug #596336.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit ad76cae
+Author: Jaroslav Skarvada <jskarvad@redhat.com>
+Date: Thu Feb 21 14:40:52 2013 +0100
+
+ Fixing root directory allocation.
+
+ See https://bugzilla.redhat.com/show_bug.cgi?id=674095 for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit b8201b3
+Author: Jaroslav Skarvada <jskarvad@redhat.com>
+Date: Thu Feb 21 14:40:25 2013 +0100
+
+ Fixing device detection.
+
+ See https://bugzilla.redhat.com/show_bug.cgi?id=710480 for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 7a75638 (tag: v3.0.14)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jan 23 13:22:01 2013 +0100
+
+ Releasing version 3.0.14.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 5bdd7ef
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jan 23 13:16:20 2013 +0100
+
+ Documenting dosfsck -b in its manpage.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit a307be2
+Author: Oleksij Rempel <bug-track@fisher-privat.net>
+Date: Wed Jan 23 12:36:56 2013 +0100
+
+ Adding option for bootsector read-only check.
+
+ Most boot sectors may contains marker for filesystem state. We can this
+ bit on every mount and warn user if some thing wrong, without checking
+ complete filesystem.
+
+ Signed-off-by: Oleksij Rempel <bug-track@fisher-privat.net>
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit ce2f8dc
+Author: Oleksij Rempel <bug-track@fisher-privat.net>
+Date: Wed Jan 23 12:35:13 2013 +0100
+
+ Checking boot sector for dirty bit.
+
+ Some OSos use reseved byte of boot sector to set state of the file
+ system. If first bit set, then filesystem is proably damaged - write
+ operation was not finished/cache not snycted/...
+
+ Signed-off-by: Oleksij Rempel <bug-track@fisher-privat.net>
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit f33ee8c
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jan 23 12:25:59 2013 +0100
+
+ Completing and updating all copyright headers for 2013.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit bfe6d25
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Wed Jan 23 12:17:20 2013 +0100
+
+ Updating my email address.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 13cdb4d (tag: v3.0.13)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Sat Jun 30 19:10:44 2012 +0200
+
+ Releasing version 3.0.13.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit d039482
+Author: Jaroslav Škarvada <jskarvad@redhat.com>
+Date: Sat Jun 30 19:09:11 2012 +0200
+
+ Fix 'dosfslabel throws "Seek to 114116076544:Invalid argument" error when labeling'.
+
+ See https://bugzilla.redhat.com/show_bug.cgi?id=693662 for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit e243612 (tag: v3.0.12)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
+Date: Sat Oct 29 08:40:53 2011 +0200
+
+ Releasing version 3.0.12.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
+
+commit 025b4f0
Author: Michael Casadevall <mcasadevall@ubuntu.com>
Date: Tue Jun 7 19:19:30 2011 +0200
@@ -16,14 +1162,18 @@ Date: Tue Jun 7 19:19:30 2011 +0200
See https://bugs.launchpad.net/ubuntu/+source/dosfstools/+bug/794043
for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 45c3a5d8229ef998962e495f1efe7d2a6cd8a825
-Author: Daniel Baumann <daniel@debian.org>
+commit 91a1fb9
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sat Jan 8 23:38:59 2011 +0100
Re-running Nindent.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 37115695884422e6f58ec490d11d460539715f8a
+commit 0390c4c
Author: Sergey Gusarov <laborer2008@gmail.com>
Date: Sat Jan 8 23:36:11 2011 +0100
@@ -32,8 +1182,10 @@ Date: Sat Jan 8 23:36:11 2011 +0100
These warnings appear when you compile the project with the option "-Wall", what
is done with the current default Makefile.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit a9055613f0d826021db65c79c2df87ac91e89215
+commit 4a8f8a6
Author: Jaroslav Skarvada <jskarvad@redhat.com>
Date: Thu Jan 6 22:35:00 2011 +0100
@@ -44,32 +1196,42 @@ Date: Thu Jan 6 22:35:00 2011 +0100
filename buffer is only 8 chars long. Due to pattern mask used it results to
only 10 files at max (FSCK0-9REC). If there is more than 10 files, it overflows
and hangs.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 5a2b37f3ef664dbc7850f3d800890d7bb919b3cd
+commit e0366da
Author: Sergey Gusarov <laborer2008@gmail.com>
Date: Thu Jan 6 22:31:39 2011 +0100
Fixing conversion specifiers in accordance with the type of expressions.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 258e5ebbb24fd6293a86fe22d6bcda8ce1794dcd
-Author: Daniel Baumann <daniel@debian.org>
+commit 2d8be9c
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Jan 2 15:41:44 2011 +0100
Indenting source files.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 9c22278dda0f8fc05aa537eb0bcb07e51f0dec6a
-Author: Daniel Baumann <daniel@debian.org>
+commit 697af85
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Jan 2 15:39:03 2011 +0100
Adding Nindent script from syslinux.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit e6008ff5c15dc2e6d5b33f88a447d1159165c95d
-Author: Daniel Baumann <daniel@debian.org>
+commit 66d55cd (tag: v3.0.11)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Dec 24 17:58:29 2010 +0100
- Releasing upstream version 3.0.11.
+ Releasing version 3.0.11.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit bce60d1b0b739612b63852722d8504986096b40d
+commit d579802
Author: Michael Stapelberg <michael@stapelberg.de>
Date: Fri Nov 19 14:09:36 2010 +0100
@@ -78,92 +1240,120 @@ Date: Fri Nov 19 14:09:36 2010 +0100
This is helpful for SD cards or other removable media which have an enabled
write lock -- without the "Permission denied" message, the user has to strace
mkdosfs to find out what's going on.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit ff45bd967e5d8ff7edc496adbad57257d4d5432b
+commit bb6000f
Author: Jaroslav Skarvada <jskarvad@redhat.com>
Date: Fri Oct 8 13:38:16 2010 +0200
Unalign on s390x, see http://bugzilla.redhat.com/show_bug.cgi?id=624596 for
more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 22874327372f914d2919490326c95f4607f8de74
-Author: Daniel Baumann <daniel@debian.org>
+commit 5ef7f1f (tag: v3.0.10)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Sep 12 09:35:47 2010 +0200
- Releasing upstream version 3.0.10.
+ Releasing version 3.0.10.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 8b7c9d94a4571142a77a587138bc26b39f8e2863
+commit ea41797
Author: Alexander Korolkov <alexander.korolkov@gmail.com>
Date: Sun Sep 12 09:29:12 2010 +0200
Modify LFN direntries when file is renamed or deleted, see
Debian bug #596329.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 761b798f3bf2b4a87f2d454f555e18758791c864
+commit e56ff72
Author: Alexander Korolkov <alexander.korolkov@gmail.com>
Date: Sun Sep 12 09:27:07 2010 +0200
If the test of short filename fails, dosfsck could complain about
bad long filename, see Debian bug #596327.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 8fa3587a946614cd43d813052e0e31e595e6d63d
+commit f0a42d0
Author: Alexander Korolkov <alexander.korolkov@gmail.com>
Date: Sun Sep 12 09:24:47 2010 +0200
dosfsck: don't complain about bad filenames when short filename
contains 7 or more characters with codes 128-255, see Debian
bug #596327.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 3893857b841096de6a422ef5bed1b2618a7037d5
+commit 0113c5b
Author: Mitch Rybczynski <mrybczynski@miovision.com>
Date: Mon Jul 5 14:45:54 2010 +0200
Adding __arm__ define check for some crosscompile toolchains.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 7d03b3cc96b83b67638b463610a29abfd6f51f77
-Author: Daniel Baumann <daniel@debian.org>
+commit 88cb84f
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Mar 14 16:42:32 2010 +0100
Modernizing dosfslabel manpage.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 258049911c5df476fb434e0d87e0ece01b9ba137
-Author: Daniel Baumann <daniel@debian.org>
+commit 5aa7ec4
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Mar 14 16:33:47 2010 +0100
Modernizing dosfsck manpage.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 50d1d96b9666913a90e16904a63e29925675859c
-Author: Daniel Baumann <daniel@debian.org>
+commit 807ed80
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Mar 14 16:05:32 2010 +0100
Fixing spelling error in boot.c.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 0e87c7890b598d78c6aa3d2a06b2306980e75a3d
-Author: Daniel Baumann <daniel@debian.org>
+commit 5b6849d (tag: v3.0.9)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Jan 31 08:31:32 2010 +0100
- Releasing upstream version 3.0.9.
+ Releasing version 3.0.9.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 9415707c2c9ad22b48660593915667dd228722fa
+commit 33bca7d
Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>
Date: Sun Jan 31 00:11:41 2010 -0500
Be sure to store the updated reserved_sector count in the boot sector,
see Debian bug #567337.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 68b3f00471f60a692fe021d65289bbaf2dc990d5
-Author: Daniel Baumann <daniel@debian.org>
+commit 2a3bef8 (tag: v3.0.8)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sat Jan 23 10:16:18 2010 +0100
- Releasing upstream version 3.0.8.
+ Releasing version 3.0.8.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 69dbf2e002f0cb3f0781256dec7258b66ffae3b6
-Author: Daniel Baumann <daniel@debian.org>
+commit 726c02d
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sat Jan 23 10:15:01 2010 +0100
Removing some cruft in end-comments.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit eef306657f3152bbf913a8a45c514f11b2dc2494
+commit a5961d7
Author: Steven J. Magnani <steve@digidescorp.com>
Date: Thu Jan 21 16:58:11 2010 +0100
@@ -181,22 +1371,28 @@ Date: Thu Jan 21 16:58:11 2010 +0100
function.
Use lseek64 for positioning, and change some suspect uses of off_t to loff_t.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit e69f49dd1fe52780071cb3f024d1a8246125915a
+commit bbb25bf
Author: Steven J. Magnani <steve@digidescorp.com>
Date: Thu Jan 21 16:56:26 2010 +0100
If dosfsck is run in read-only mode (-n), exit with code 0
if the only issue found is an uninitialized free cluster summary.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit e52a16d488cf680117e4d476400bdd7915ef2f7a
+commit 1cae726
Author: Steven J. Magnani <steve@digidescorp.com>
Date: Thu Jan 21 16:55:30 2010 +0100
On x86_64, dosfsck incorrectly claims that a free_cluster summary of
0xFFFFFFFF, defined by Microsoft to be "uninitialized," is wrong.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 32db02998ed7882df355fa4077009e8d363df3ab
+commit 62f806a
Author: H. Peter Anvin <hpa@zytor.com>
Date: Fri Jan 8 09:16:38 2010 +0100
@@ -213,8 +1409,10 @@ Date: Fri Jan 8 09:16:38 2010 +0100
if (align_structures); this avoids rounding the number of root
directory entries up to a whole sector when used with -a
(i.e. preserves the previous behavior.)
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit e462ac31a1d5d235b8a31a9e392e44e2dbc3783c
+commit 8825bda
Author: H. Peter Anvin <hpa@zytor.com>
Date: Wed Jan 6 20:55:36 2010 +0100
@@ -222,14 +1420,18 @@ Date: Wed Jan 6 20:55:36 2010 +0100
Improve the English language used in the man page for the -a (no
align) option to mkdosfs.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 680d71d167f30a823f88dd66473fc664cd887ab0
-Author: Daniel Baumann <daniel@debian.org>
+commit 21d3f81
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Wed Jan 6 11:27:25 2010 +0100
Adding reference to dosfslable in mkdosfs manpage.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 60fc9f853c1045e615b34a193738f88021678d30
+commit 247ba06
Author: H. Peter Anvin <hpa@zytor.com>
Date: Wed Jan 6 11:18:55 2010 +0100
@@ -241,21 +1443,27 @@ Date: Wed Jan 6 11:18:55 2010 +0100
significant performance for anything where the physical sector size is
larger than the logical sector size, e.g. flash media or large-sector
hard disks.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 312b05fc47107f695483994375a1f6f429069708
-Author: Daniel Baumann <daniel@debian.org>
+commit 171bc07 (tag: v3.0.7)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Thu Dec 24 10:53:36 2009 +0100
- Releasing upstream version 3.0.7.
+ Releasing version 3.0.7.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 844307669208608a3464157ddb5e789bd9556f34
+commit 28708fc
Author: Ben Hutchings <ben@decadent.org.uk>
Date: Thu Dec 24 09:55:52 2009 +0100
Fixing dosfslabel to set volume label in the right place,
see Debian bug #559985.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 1bae0e2037717d65b3283db9da51ae7686a7a9be
+commit 2c405dd
Author: Lubomir Rintel <lkundrak@v3.sk>
Date: Thu Dec 24 09:39:39 2009 +0100
@@ -269,27 +1477,35 @@ Date: Thu Dec 24 09:39:39 2009 +0100
well are split into two, so that FORTIFY_SOURCE's bound checking does
not abort dosfsck. There also was an off-by-one error in auto_rename()'s
sprintf().
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit eb297071adfca1ed7af85ca111f20ab41db8ac59
+commit b8f3efe
Author: San Mehat <san@google.com>
Date: Thu Dec 24 09:31:41 2009 +0100
Adding custom exit code in dosfsck for the case where the FS is read only.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit b3864d0939c960d0e0f15e4e3b1d626639b64681
-Author: Daniel Baumann <daniel@debian.org>
+commit 0657e01 (tag: v3.0.6)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Oct 4 10:59:33 2009 +0200
- Releasing upstream version 3.0.6.
+ Releasing version 3.0.6.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 144f8fcfc3f7982e8f460f8379a753b7a5941783
+commit bc84254
Author: Steven J. Magnani <steve@digidescorp.com>
Date: Sun Oct 4 10:58:43 2009 +0200
Attempt to improve clarity of the orphan cluster reclaim code.
Minor optimization - remove some unnecessary checking.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 343fe6d5e7135efadc498fd91e19ba8da499d0c9
+commit 8054b4a
Author: Steven J. Magnani <steve@digidescorp.com>
Date: Sun Oct 4 08:37:19 2009 +0200
@@ -297,28 +1513,36 @@ Date: Sun Oct 4 08:37:19 2009 +0200
If an orphan chain that linked to cluster 1 was reclaimed to a file,
deletion of the file would result in a filesystem panic.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit db079a02059d7f7296fbe9f87624623a43816c5f
+commit e51af88
Author: Steven J. Magnani <steve@digidescorp.com>
Date: Sun Oct 4 08:32:30 2009 +0200
Fix erroneous report of huge number of clusters in use on big-endian
systems when the FSINFO free cluster count is reset.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 7d5320b8a374b8da1a16b09b3b9b0713828d6755
-Author: Daniel Baumann <daniel@debian.org>
+commit 16ba63f (tag: v3.0.5)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Mon Jul 27 14:26:11 2009 +0200
- Releasing upstream version 3.0.5.
+ Releasing version 3.0.5.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit e80ede4dd3c2058fe32e29ff82244ecb1c7c5514
+commit 28ff9d9
Author: Piotr Kaczuba <pepe@attika.ath.cx>
Date: Sun Jul 26 22:21:25 2009 +0200
Signed/unsigned char mismatch in check.c causes false positives
in bad_name() and can result in data loss, see Debian bug #538758.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 9e15ddf6d52dd166efcb59f91f16fb9d695c86c5
+commit d42a273
Author: Andrew Tridgell <tridge@samba.org>
Date: Sun Jul 26 22:12:06 2009 +0200
@@ -326,14 +1550,18 @@ Date: Sun Jul 26 22:12:06 2009 +0200
See http://lkml.org/lkml/2009/7/20/425 and
http://lkml.org/lkml/2009/7/20/424 for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 6c68b94008157c444954d2f90a7f9ec8ffc2ec87
-Author: Daniel Baumann <daniel@debian.org>
+commit dd0f0b5 (tag: v3.0.4)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Tue Jul 21 08:10:52 2009 +0200
- Releasing upstream version 3.0.4.
+ Releasing version 3.0.4.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 3ce6422e93f3de746be092e324253a8722917a86
+commit b9f37a6
Author: Andrew Tridgell <tridge@samba.org>
Date: Tue Jul 21 07:59:22 2009 +0200
@@ -342,26 +1570,34 @@ Date: Tue Jul 21 07:59:22 2009 +0200
See http://lkml.org/lkml/2009/6/26/313 and
http://lkml.org/lkml/2009/6/26/314 for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 94f8769aeddf0d0d3f0be54361514a464907a4a1
+commit ecd15e8
Author: Paul Rupe <prupe@nc.rr.com>
Date: Tue May 19 10:37:52 2009 +0200
Fixing "Too many files need repair" error during fsck.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 89566399e407e54eb14d275770106ad42b3ac87c
-Author: Daniel Baumann <daniel@debian.org>
+commit 7c16098 (tag: v3.0.3)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Mon May 18 15:12:04 2009 +0200
- Releasing upstream version 3.0.3.
+ Releasing version 3.0.3.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 8147c98a542b714ccab34b57c84ed842bb6b50f2
-Author: Daniel Baumann <daniel@debian.org>
+commit b396dcf
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Mon May 18 15:10:55 2009 +0200
Also declaring arm as an unaligned architecture, see Debian bug #502961.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 18e27fa5c0f811e7edc10bca771acc7c04b19146
+commit ff1b24e
Author: Steven J. Magnani <steve@digidescorp.com>
Date: Mon May 18 15:01:49 2009 +0200
@@ -370,58 +1606,76 @@ Date: Mon May 18 15:01:49 2009 +0200
This patch reorganizes heap memory usage by dosfsck and mkdosfs
to support limited-memory embedded systems - in particular, those
based on Xilinx's Microblaze processor. It also adds a few comments.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 180b68e652df7bfeb7f336e0247aee8873edea7f
+commit 89f0b72
Author: Mike Frysinger <vapier@gentoo.org>
Date: Thu Mar 5 07:03:36 2009 +0100
Declaring Blackfin as an unaligned architecture.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 71ac75353d9158aed663f0a3a9d1a1a67ee4ff4f
-Author: Daniel Baumann <daniel@debian.org>
+commit b54a8a4 (tag: v3.0.2)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sat Feb 28 09:48:04 2009 +0100
- Releasing upstream version 3.0.2.
+ Releasing version 3.0.2.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit a75924b8ff629fe7ca5ba9c58ac75f66290242ee
+commit 9500529
Author: Hiroaki Ishizawa <hiroaki.ishizawa@gmail.com>
Date: Fri Feb 13 10:00:46 2009 +0100
dosfsck corrupts root directory when fs->nfats is 1.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 161a5e1fdd019732e0a304beceaeeb606eb128d6
+commit 043f8a8
Author: Stepan Kasal <skasal@redhat.com>
Date: Fri Jan 30 14:56:33 2009 +0100
src/dosfslabel.c (main): After writing the label, exit code should be 0.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 26ffa1fb565c2b3284b846ca2733118808c85cb5
-Author: Daniel Baumann <daniel@debian.org>
+commit 017da27
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Jan 30 14:06:01 2009 +0100
Also installing ChangeLog in install-doc target of Makefile.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit abad38ee561b02ec47be7e861780bf5fa2a05d0b
+commit 1c76f0f
Author: Stepan Kasal <skasal@redhat.com>
Date: Fri Jan 30 14:05:12 2009 +0100
Makefile: Do not clobber time stamps of doc files.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 81882d20ec6bd4bf4914d39636cecc8c8e57dd67
-Author: Daniel Baumann <daniel@debian.org>
+commit df2d2f1 (tag: v3.0.1)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Nov 23 22:45:45 2008 +0100
- Releasing upstream version 3.0.1.
+ Releasing version 3.0.1.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 41574812a2586f0b6aa1d4f6e2276e557e9cbbcf
-Author: Daniel Baumann <daniel@debian.org>
+commit 17b269b
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Nov 23 18:41:01 2008 +0100
Applying Fedoras dosfstools-vfat-timingfix.diff from Bill Nottingham
<notting@redhat.com> to fix vfat timing issue. See
https://bugzilla.redhat.com/show_bug.cgi?id=448247 for more information.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit b80656109cc5cffdefd626c2ec9d45e3cf63a03e
+commit e597caf
Author: Ulrich Mueller <ulm@gentoo.org>
Date: Tue Oct 7 07:55:37 2008 +0200
@@ -437,125 +1691,163 @@ Date: Tue Oct 7 07:55:37 2008 +0200
Macro MSDOS_FAT12 is now replaced by FAT12_THRESHOLD to make it
consistent with the definition in mkdosfs and to remove the dependency
on the kernel version.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit b9c13d143c420a3ec6e1dcb652cafa407621e9c7
+commit 90102bc
Author: Dann Frazier <dannf@hp.com>
Date: Tue Sep 30 07:25:19 2008 +0200
Changing some wording to make the indended meaning of "full-disk device"
more obvious.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 4df18ad463f41ae368c3c51bfb5a033072605663
-Author: Daniel Baumann <daniel@debian.org>
+commit 21e9ba0 (tag: v3.0.0)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Sep 28 11:43:19 2008 +0200
- Releasing upstream version 3.0.0.
+ Releasing version 3.0.0.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 17fbf2a6dc9255a6bb832472ae7cda674b55e961
-Author: Daniel Baumann <daniel@debian.org>
+commit eaf145d
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Sep 28 11:29:01 2008 +0200
Adding GPL headers to all files.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit d2039e12c8d53472411c91eb8e7a7c0544e13d6d
-Author: Daniel Baumann <daniel@debian.org>
+commit 0826117
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sun Sep 28 10:51:55 2008 +0200
Adding new GPL license file.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit e4e457f4b57090ecf0539f48dc682ab9afd14ab8
-Author: Daniel Baumann <daniel@debian.org>
+commit f8d6127
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 23:31:12 2008 +0200
Redoing Makefile from scratch.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 216568ca3a01ed38962b22c7bf838d15d5a4d98d
-Author: Daniel Baumann <daniel@debian.org>
+commit b4feb73
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Sat Sep 27 00:17:38 2008 +0200
Removing whitespaces in all files at EOL and EOF.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit f59157e06561c525605279145057361afa721042
-Author: Daniel Baumann <daniel@debian.org>
+commit 1410138
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 23:48:56 2008 +0200
Adding Debians dosfslabel.8 manpage from Francois Wendling
<frwendling@free.fr>.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit c1bacab212d2b7f6ea93914976cb60056ff8276d
-Author: Daniel Baumann <daniel@debian.org>
+commit f62e7f2
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:36:04 2008 +0200
Updating version.h includes to new location of version.h file.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 1dae9f522062037d3539cadf344e0359c644171f
-Author: Daniel Baumann <daniel@debian.org>
+commit 32e5952
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:19:36 2008 +0200
Removing old lsm file.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit d843bec0b987f5582fe048f70e42df18c34d3ae4
-Author: Daniel Baumann <daniel@debian.org>
+commit 25a433b
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:07:47 2008 +0200
Removing old cvsignore files.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 77fddbc03016752286b26913c62b98f86ee63211
-Author: Daniel Baumann <daniel@debian.org>
+commit acac13f
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:18:39 2008 +0200
Removing old build file.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit f3e7168fc9eb6f32a6c85021186d84944cefeba8
-Author: Daniel Baumann <daniel@debian.org>
+commit 3ecdd21
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:19:16 2008 +0200
Removing old GPL license files.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 68089477036e97911791516ee2167286f26ff819
-Author: Daniel Baumann <daniel@debian.org>
+commit f183d0e
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:21:57 2008 +0200
Unifying dosfsck and mkdosfs Makefiles in common src/Makefile.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 9432a02d6e7c38872d7b1042f1b8be1b24a57427
-Author: Daniel Baumann <daniel@debian.org>
+commit 61e7466
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:04:02 2008 +0200
Unifying dosfsck and mkdosfs sources in common src directory.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 0c179b9ee47174d0f34d9fc796d540012740ac01
-Author: Daniel Baumann <daniel@debian.org>
+commit 7552d57
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:05:27 2008 +0200
Unifying dosfsck and mkdosfs manpages in common man directory.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 2d246c28ba6cfd43be2e44b11283891d922f352b
-Author: Daniel Baumann <daniel@debian.org>
+commit 124598b
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 18:12:29 2008 +0200
Unifying dosfsck and mkdosfs documents in common doc directory.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit e5b16990515d0214fd103dd8aa22ff6a3cda4b64
-Author: Daniel Baumann <daniel@debian.org>
+commit fb9c46b
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:39:51 2008 +0200
Applying Gentoos dosfstools-2.11-preen.patch from Roy Marples
<uberlord@gentoo.org> to alias dosfsck -p to -a:
* Map -p to -a for baselayout-2, #177514.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 6a1d974251a9f9a142775ace3a8048149abfa90c
-Author: Daniel Baumann <daniel@debian.org>
+commit aaa40a9
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:49:43 2008 +0200
Applying Gentoos dosfstools-2.11-build.patch from Mike Frysinger
<vapier@gentoo.org> to improve Makefile:
* Respect user settings #157785/#157786 by Diego Petteno.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 1ea49f00e61b554dc833d44e1a3617e923be667e
-Author: Daniel Baumann <daniel@debian.org>
+commit 251626d
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:37:34 2008 +0200
Applying Gentoos dosfstools-2.11-verify-double-count-fix.patch from
@@ -564,9 +1856,11 @@ Date: Fri Sep 26 15:37:34 2008 +0200
* Don't double-count n_files during a verification pass.
Bugzilla: http://bugs.gentoo.org/show_bug.cgi?id=99845
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 2d2f20b2c495fa620c7bb3ec5a0838b08f65ab05
-Author: Daniel Baumann <daniel@debian.org>
+commit e670ea8
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:33:36 2008 +0200
Applying Gentoos dosfstools-2.11-fat32size.patch from Mike Frysinger
@@ -575,9 +1869,11 @@ Date: Fri Sep 26 15:33:36 2008 +0200
* Fix generation of FAT filesystems on devices that are 256meg in size
Patch by Ulrich Mueller and accepted upstream
http://bugs.gentoo.org/112504
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit a86564a9317b2bf9f7734feacdce794f20af74a7
-Author: Daniel Baumann <daniel@debian.org>
+commit a6dc6a4
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:22:06 2008 +0200
Applying Suses dosfstools-2.11-unsupported-sector-size.patch from Petr
@@ -585,9 +1881,11 @@ Date: Fri Sep 26 15:22:06 2008 +0200
* added warning for creation msdos on filesystem with sector size
greater than 4096 [fate#303325]
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 8171e51f4e02bd9f92bb515ca7896d3cb1b564b5
-Author: Daniel Baumann <daniel@debian.org>
+commit f746956
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:18:35 2008 +0200
Applying Suses dosfstools-2.11-mkdosfs-geo0.diff from Ludwig Nussel
@@ -597,16 +1895,20 @@ Date: Fri Sep 26 15:18:35 2008 +0200
zero heads and sectors. Therefore let's a) assume dummy values in
that case in mkdosfs and b) don't consider such fat file systems as
invalid in dosfsck. The Linux kernel accepts them anyways.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit db887df619f4e995db0ab112334f31464a03fa0e
-Author: Daniel Baumann <daniel@debian.org>
+commit cf243e4
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:15:40 2008 +0200
Applying Suses dosfstools-2.11-linuxfs.patch from Ruediger Oertel
<ro@suse.de> to not include linux/fs.h.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 7fe3fa643494b26962d542fac38d988ac60f8c09
-Author: Daniel Baumann <daniel@debian.org>
+commit 2d4f184
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:11:50 2008 +0200
Applying Fedoras dosfstools-2.11-assumeKernel26.patch from Peter Vrabec
@@ -614,34 +1916,42 @@ Date: Fri Sep 26 15:11:50 2008 +0200
* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) does not work with
glibc-kernheaders-2.4-9.1.94
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 90c1c93c100722a03e48be51b1312fe65c1cb156
-Author: Daniel Baumann <daniel@debian.org>
+commit 739a6fb
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 15:05:00 2008 +0200
Applying Debians 99-conglomeration.dpatch (no other information
available).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit bb6541bf4735e3a7f1c71b4722c6d03bb4549eea
-Author: Daniel Baumann <daniel@debian.org>
+commit 3b5ed8a
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:26:41 2008 +0200
Applying Debians 15-manpage-files.dpatch from Daniel Baumann
<daniel@debian.org> to improve dosfsck manpage:
* Lists fsckNNNN.rec files in FILES section (Closes: #444596).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 49282165866be19d3bc54a3f4bdee2cf3a63ba6c
-Author: Daniel Baumann <daniel@debian.org>
+commit 3b6a863
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:34:42 2008 +0200
Applying Debians 13-getopt.dpatch from Adonikam Virgo
<adonikam@virgonet.org> to fix mkdosfs getopt:
* Fixes backup sector getopt (Closes: #232387, #479794).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit c32e44b85f4eac6f6a94bd620eea4abba257042a
-Author: Daniel Baumann <daniel@debian.org>
+commit 1b2c8ca
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:34:17 2008 +0200
Applying Debians 12-zero-slot.dpatch by Karl Tomlinson
@@ -649,30 +1959,36 @@ Date: Fri Sep 26 14:34:17 2008 +0200
* Fixes crashes due to zero slot numbers causing a negative offset in
the call to copy_lfn_part in lfn_add_slot. On amd64 this results in
- a SIGSEGV in copy_lfn_part. On x86 the result is heap corruption
- and thus sometimes a SIGSEGV or double free abort later. (Closes:
+ a SIGSEGV in copy_lfn_part. On x86 the result is heap corruption and
+ thus sometimes a SIGSEGV or double free abort later. (Closes:
#152550, #353198, #356377, #401798).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 370847af533e628aa9e38710e6d50af09f2b71ba
-Author: Daniel Baumann <daniel@debian.org>
+commit eec8585
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:33:54 2008 +0200
Applying Debians 11-memory-efficiency.dpatch from Eero Tamminen
<eero.tamminen@nokia.com> to improve dosfsck memory efficiency:
* Improves memory efficiency when checking filesystems.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 28da9f286a52acec7df7ad06cb0679e5f828e7f3
-Author: Daniel Baumann <daniel@debian.org>
+commit 06bd669
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:33:28 2008 +0200
Applying Debians 10-manpage-synopsis.dpatch from Daniel Baumann
<daniel@debian.org> to fix manpage synopsis:
* List alternative binary names in manpage synopsis (Closes: #284983).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit f253073021551c9b58d0f2ac262deb3c1b950b06
-Author: Daniel Baumann <daniel@debian.org>
+commit 42d340d
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:32:46 2008 +0200
Applying Debians 09-manpage-fat32.dpatch from Daniel Baumann
@@ -680,9 +1996,11 @@ Date: Fri Sep 26 14:32:46 2008 +0200
* Don't claim that FAT32 is not choosed automatically (Closes:
#414183).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit f37c07aec3972cfc0db374d544ee3b27c0b4b20b
-Author: Daniel Baumann <daniel@debian.org>
+commit 0f5ce0d
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:32:23 2008 +0200
Applying Debians 08-manpage-drop.dpatch from Daniel Baumann
@@ -690,16 +2008,20 @@ Date: Fri Sep 26 14:32:23 2008 +0200
* Don't use confusing word 'drop' when 'delete' is meant (Closes:
#134100).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 3f970c65586da2f44d2a49b639e89341bbaf1fba
-Author: Daniel Baumann <daniel@debian.org>
+commit 8ec54dd
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:31:50 2008 +0200
Applying Debians 07-manpage-spelling.dpatch from Justin Pryzby
<justinpryzby@users.sourceforge.net> to fix mkdosfs manpage typos.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 18678ba5f3a10c2a54ffee735651d7a265ae7d54
-Author: Daniel Baumann <daniel@debian.org>
+commit 4371588
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:30:31 2008 +0200
Applying Suses dosfstools-2.11_determine-sector-size.patch from Petr
@@ -707,36 +2029,44 @@ Date: Fri Sep 26 14:30:31 2008 +0200
* determine sector size of device automatically or if -S parameter
present, verify, that it's not under physical sector size
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 29753931b078856d78f473cfb6273e111a26891e
-Author: Daniel Baumann <daniel@debian.org>
+commit fc92e19
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:30:03 2008 +0200
Applying Suses dosfstools-2.11-o_excl.patch from Pavol Rusnak
<prusnak@suse.cz> to use O_EXCL in mkdosfs:
* mkdosfs now opens device with O_EXCL [#238687]
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 16bb7b09ad9eaf0fe37a732cabcdbdf975b77d3e
-Author: Daniel Baumann <daniel@debian.org>
+commit 3084697
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 14:29:36 2008 +0200
Applying Debians 04-unaligned-memory.dpatch from Khalid Aziz
<khalid_aziz@hp.com> to fix dosfsck unaligned memory accesses:
* Fix unaligned memory accesses which cause warnings to appear
- everytime the elilo bootloader script runs. This has led a number
- of users to believe their install has failed (Closes: #258839).
+ everytime the elilo bootloader script runs. This has led a number of
+ users to believe their install has failed (Closes: #258839).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 1298cc8f37eaa27ca542b8b7186ea5a47a63cd7e
-Author: Daniel Baumann <daniel@debian.org>
+commit 6d5c091
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 13:47:40 2008 +0200
Applying Fedoras dosfstools-2.11-label.patch from Jeremy Katz
<katzj@redhat.com> to add dosfslabel (originally by Peter Jones).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit d23890e1d89770d6d2ba58362c2fc4ebafbde15c
-Author: Daniel Baumann <daniel@debian.org>
+commit 07ef487
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 13:41:14 2008 +0200
Applying Fedoras dosfstools-2.11-fortify.patch from Jakub Jelinek
@@ -745,16 +2075,22 @@ Date: Fri Sep 26 13:41:14 2008 +0200
* This violates -D_FORTIFY_SOURCE=2 (which is stricter than C
standard), but isn't actually any buffer overflow. But using memcpy
is more efficient anyway.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 7dbd82000e59246c1c2f8c280c4491259e10a767
-Author: Daniel Baumann <daniel@debian.org>
+commit 78f9dca
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Fri Sep 26 13:40:47 2008 +0200
Applying Fedoras dosfstools-2.7-argfix.patch (no other information
available).
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
-commit 88f3b3139c72ac11cb3dd3f5afa8dbb2198a8de5
-Author: Daniel Baumann <daniel@debian.org>
+commit ba6774a (tag: v2.11)
+Author: Daniel Baumann <mail@daniel-baumann.ch>
Date: Thu Jun 26 12:45:36 2008 +0200
- Adding upstream version 2.11.
+ Adding version 2.11.
+
+ Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>
diff --git a/dosfstools/Makefile b/dosfstools/Makefile
index 050b750a5..fa993559c 100644
--- a/dosfstools/Makefile
+++ b/dosfstools/Makefile
@@ -1,6 +1,6 @@
# Makefile
#
-# Copyright (C) 2008 Daniel Baumann <daniel@debian.org>
+# Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
#
# 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
@@ -15,9 +15,12 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
-# On Debian systems, the complete text of the GNU General Public License
+# The complete text of the GNU General Public License
# can be found in /usr/share/common-licenses/GPL-3 file.
+SHELL := sh -e
+LANGUAGES = $(shell cd manpages/po && ls)
+
DESTDIR =
PREFIX = /usr/local
SBINDIR = $(PREFIX)/sbin
@@ -25,9 +28,9 @@ DOCDIR = $(PREFIX)/share/doc
MANDIR = $(PREFIX)/share/man
#OPTFLAGS = -O2 -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
-OPTFLAGS = -O2 -fomit-frame-pointer $(shell getconf LFS_CFLAGS)
+OPTFLAGS = -O2 -fomit-frame-pointer -D_GNU_SOURCE $(shell getconf LFS_CFLAGS)
#WARNFLAGS = -Wall -pedantic -std=c99
-WARNFLAGS = -Wall
+WARNFLAGS = -Wall -Wextra -Wno-sign-compare -Wno-missing-field-initializers -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings
DEBUGFLAGS = -g
CFLAGS += $(OPTFLAGS) $(WARNFLAGS) $(DEBUGFLAGS)
@@ -35,51 +38,85 @@ VPATH = src
all: build
-build: dosfsck dosfslabel mkdosfs
+build: fatlabel fsck.fat mkfs.fat
-dosfsck: boot.o check.o common.o fat.o file.o io.o lfn.o dosfsck.o
+fatlabel: boot.o check.o common.o fat.o file.o io.o lfn.o fatlabel.o
-dosfslabel: boot.o check.o common.o fat.o file.o io.o lfn.o dosfslabel.o
+fsck.fat: boot.o check.o common.o fat.o file.o io.o lfn.o fsck.fat.o
-mkdosfs: mkdosfs.o
+mkfs.fat: mkfs.fat.o
rebuild: distclean build
-install: install-bin install-doc install-man
+install: install-bin install-doc install-man install-symlinks
install-bin: build
install -d -m 0755 $(DESTDIR)/$(SBINDIR)
- install -m 0755 dosfsck dosfslabel mkdosfs $(DESTDIR)/$(SBINDIR)
-
- ln -sf dosfsck $(DESTDIR)/$(SBINDIR)/fsck.msdos
- ln -sf dosfsck $(DESTDIR)/$(SBINDIR)/fsck.vfat
- ln -sf mkdosfs $(DESTDIR)/$(SBINDIR)/mkfs.msdos
- ln -sf mkdosfs $(DESTDIR)/$(SBINDIR)/mkfs.vfat
+ install -m 0755 fatlabel fsck.fat mkfs.fat $(DESTDIR)/$(SBINDIR)
install-doc:
install -d -m 0755 $(DESTDIR)/$(DOCDIR)/dosfstools
install -p -m 0644 ChangeLog doc/* $(DESTDIR)/$(DOCDIR)/dosfstools
install-man:
- install -d -m 0755 $(DESTDIR)/$(MANDIR)/man8
- install -p -m 0644 man/*.8 $(DESTDIR)/$(MANDIR)/man8
-
- ln -sf dosfsck.8 $(DESTDIR)/$(MANDIR)/man8/fsck.msdos.8
- ln -sf dosfsck.8 $(DESTDIR)/$(MANDIR)/man8/fsck.vfat.8
- ln -sf mkdosfs.8 $(DESTDIR)/$(MANDIR)/man8/mkfs.msdos.8
- ln -sf mkdosfs.8 $(DESTDIR)/$(MANDIR)/man8/mkfs.vfat.8
-
-uninstall: uninstall-bin uninstall-doc uninstall-man
+ for MANPAGE in manpages/en/*; \
+ do \
+ SECTION="8"; \
+ mkdir -p $(DESTDIR)/$(MANDIR)/man$${SECTION}/; \
+ install -m 0644 $${MANPAGE} $(DESTDIR)/$(MANDIR)/man$${SECTION}/$$(basename $${MANPAGE}); \
+ done
+
+ for LANGUAGE in $(LANGUAGES); \
+ do \
+ for MANPAGE in manpages/$${LANGUAGE}/*; \
+ do \
+ SECTION="8"; \
+ mkdir -p $(DESTDIR)/$(MANDIR)/$${LANGUAGE}/man$${SECTION}/; \
+ install -m 0644 $${MANPAGE} $(DESTDIR)/$(MANDIR)/$${LANGUAGE}/man$${SECTION}/$$(basename $${MANPAGE} .$${LANGUAGE}.$${SECTION}).$${SECTION}; \
+ done; \
+ done
+install-symlinks: install-bin install-man
+ if [ -e $(DESTDIR)/$(SBINDIR)/fatlabel ]; \
+ then \
+ ln -sf fatlabel $(DESTDIR)/$(SBINDIR)/dosfslabel; \
+ if [ -e $(DESTDIR)/$(MANDIR)/man8/fatlabel.8 ]; \
+ then \
+ ln -sf fatlabel.8 $(DESTDIR)/$(MANDIR)/man8/dosfslabel.8; \
+ fi; \
+ fi
+
+ if [ -e $(DESTDIR)/$(SBINDIR)/fsck.fat ]; \
+ then \
+ ln -sf fsck.fat $(DESTDIR)/$(SBINDIR)/dosfsck; \
+ ln -sf fsck.fat $(DESTDIR)/$(SBINDIR)/fsck.msdos; \
+ ln -sf fsck.fat $(DESTDIR)/$(SBINDIR)/fsck.vfat; \
+ if [ -e $(DESTDIR)/$(MANDIR)/man8/fsck.fat.8 ]; \
+ then \
+ ln -sf fsck.fat.8 $(DESTDIR)/$(MANDIR)/man8/dosfsck.8; \
+ ln -sf fsck.fat.8 $(DESTDIR)/$(MANDIR)/man8/fsck.msdos.8; \
+ ln -sf fsck.fat.8 $(DESTDIR)/$(MANDIR)/man8/fsck.vfat.8; \
+ fi; \
+ fi
+
+ if [ -e $(DESTDIR)/$(SBINDIR)/mkfs.fat ]; \
+ then \
+ ln -sf mkfs.fat $(DESTDIR)/$(SBINDIR)/mkdosfs; \
+ ln -sf mkfs.fat $(DESTDIR)/$(SBINDIR)/mkfs.msdos; \
+ ln -sf mkfs.fat $(DESTDIR)/$(SBINDIR)/mkfs.vfat; \
+ if [ -e $(DESTDIR)/$(MANDIR)/man8/mkfs.fat.8 ]; \
+ then \
+ ln -sf mkfs.fat.8 $(DESTDIR)/$(MANDIR)/man8/mkdosfs.8; \
+ ln -sf mkfs.fat.8 $(DESTDIR)/$(MANDIR)/man8/mkfs.msdos.8; \
+ ln -sf mkfs.fat.8 $(DESTDIR)/$(MANDIR)/man8/mkfs.vfat.8; \
+ fi; \
+ fi
+
+uninstall: uninstall-symlinks uninstall-man uninstall-doc uninstall-bin
uninstall-bin:
- rm -f $(DESTDIR)/$(SBINDIR)/dosfsck
- rm -f $(DESTDIR)/$(SBINDIR)/dosfslabel
- rm -f $(DESTDIR)/$(SBINDIR)/mkdosfs
-
- rm -f $(DESTDIR)/$(SBINDIR)/fsck.msdos
- rm -f $(DESTDIR)/$(SBINDIR)/fsck.vfat
- rm -f $(DESTDIR)/$(SBINDIR)/mkfs.msdos
- rm -f $(DESTDIR)/$(SBINDIR)/mkfs.vfat
+ rm -f $(DESTDIR)/$(SBINDIR)/fatlabel
+ rm -f $(DESTDIR)/$(SBINDIR)/fsck.fat
+ rm -f $(DESTDIR)/$(SBINDIR)/mkfs.fat
rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(SBINDIR)
@@ -89,24 +126,45 @@ uninstall-doc:
rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(DOCDIR)
uninstall-man:
- rm -f $(DESTDIR)/$(MANDIR)/man8/dosfsck.8
+ for MANPAGE in manpages/en/*; \
+ do \
+ SECTION="8"; \
+ rm -f $(DESTDIR)/$(MANDIR)/man$${SECTION}/$$(basename $${MANPAGE} .en.$${SECTION}).$${SECTION}; \
+ done
+
+ for LANGUAGE in $(LANGUAGES); \
+ do \
+ for MANPAGE in manpages/$${LANGUAGE}/*; \
+ do \
+ SECTION="8"; \
+ rm -f $(DESTDIR)/$(MANDIR)/$${LANGUAGE}/man$${SECTION}/$$(basename $${MANPAGE} .$${LANGUAGE}.$${SECTION}).$${SECTION}; \
+ done; \
+ done
+
+uninstall-symlinks:
+ rm -f $(DESTDIR)/$(SBINDIR)/dosfslabel
rm -f $(DESTDIR)/$(MANDIR)/man8/dosfslabel.8
- rm -f $(DESTDIR)/$(MANDIR)/man8/mkdosfs.8
+ rm -f $(DESTDIR)/$(SBINDIR)/dosfsck
+ rm -f $(DESTDIR)/$(MANDIR)/man8/dosfsck.8
+ rm -f $(DESTDIR)/$(SBINDIR)/fsck.msdos
rm -f $(DESTDIR)/$(MANDIR)/man8/fsck.msdos.8
+ rm -f $(DESTDIR)/$(SBINDIR)/fsck.vfat
rm -f $(DESTDIR)/$(MANDIR)/man8/fsck.vfat.8
+
+ rm -f $(DESTDIR)/$(SBINDIR)/mkdosfs
+ rm -f $(DESTDIR)/$(MANDIR)/man8/mkdosfs.8
+ rm -f $(DESTDIR)/$(SBINDIR)/mkfs.msdos
rm -f $(DESTDIR)/$(MANDIR)/man8/mkfs.msdos.8
+ rm -f $(DESTDIR)/$(SBINDIR)/mkfs.vfat
rm -f $(DESTDIR)/$(MANDIR)/man8/mkfs.vfat.8
- rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(MANDIR)/man8
- rmdir --ignore-fail-on-non-empty $(DESTDIR)/$(MANDIR)
-
reinstall: distclean install
clean:
rm -f *.o
distclean: clean
- rm -f dosfsck dosfslabel mkdosfs
+ rm -f fatlabel fsck.fat mkfs.fat
-.PHONY: build rebuild install install-bin install-doc install-man uninstall uninstall-bin uninstall-doc uninstall-man reinstall clean distclean
+.PHONY: build rebuild install install-bin install-doc install-man install-symlinks uninstall uninstall-bin uninstall-doc uninstall-man uninstall-symlinks reinstall clean distclean
diff --git a/dosfstools/VERSION b/dosfstools/VERSION
new file mode 100644
index 000000000..0baec4d10
--- /dev/null
+++ b/dosfstools/VERSION
@@ -0,0 +1 @@
+3.0.28
diff --git a/dosfstools/doc/ANNOUNCE.mkdosfs b/dosfstools/doc/ANNOUNCE.mkdosfs
index 1f02ea281..2e01716b4 100644
--- a/dosfstools/doc/ANNOUNCE.mkdosfs
+++ b/dosfstools/doc/ANNOUNCE.mkdosfs
@@ -27,7 +27,7 @@ Announcing the release of mkdosfs version 0.2
I've just uploaded mkdosfs to sunsite.unc.edu. It works in a similar way
-to Remy Card's mke2fs, but creates an MS-DOS file system.
+to Remy Card's mke2fs, but creates an MS-DOS filesystem.
The filename is mkdosfs-0.2.tar.gz.
diff --git a/dosfstools/doc/README.dosfsck b/dosfstools/doc/README.dosfsck
index 7b351aa62..3038f363b 100644
--- a/dosfstools/doc/README.dosfsck
+++ b/dosfstools/doc/README.dosfsck
@@ -4,12 +4,12 @@ dosfsck, version 1
WARNING: This is ALPHA test software. Use at your own risk.
dosfsck is the Linux equivalent of PC/MS-DOS' CHKDSK. It checks the
-consistency of PC/MS-DOS file systems and optionally tries to repair
+consistency of PC/MS-DOS filesystems and optionally tries to repair
them. The tests dosfsck performs are described in the man page.
dosfsck needs header files from dosfs.9 (or later) to compile.
-Before using dosfsck to repair a file system that contains data of any
+Before using dosfsck to repair a filesystem that contains data of any
value, you should verify that dosfsck is able to correct all reported
errors. (Except fatal errors and those reported as unfixable, of
course.) In order to do this, run it with the -V option, e.g.
diff --git a/dosfstools/doc/README.mkdosfs b/dosfstools/doc/README.mkdosfs
index ae93ada4e..5bd9b21b3 100644
--- a/dosfstools/doc/README.mkdosfs
+++ b/dosfstools/doc/README.mkdosfs
@@ -1,4 +1,4 @@
-mkdosfs - Make DOS file system utilty.
+mkdosfs - Make DOS filesystem utilty.
I wrote this, partially to complement the dosfsck utility written by Werner
@@ -7,7 +7,7 @@ advice about writing this code), and also to avoid me having to boot DOS
just to create data partitions (I use Linux to back up DOS :-) ).
The code is really derived from Remy Card's mke2fs utility - I used this as a
-framework, although all of the file system specific stuff was removed and the
+framework, although all of the filesystem specific stuff was removed and the
DOS stuff inserted. I believe originally mke2fs was based on Linus' mkfs
code, hence the acknowledgements in the source code.
diff --git a/dosfstools/man/dosfsck.8 b/dosfstools/man/dosfsck.8
deleted file mode 100644
index d363c68ce..000000000
--- a/dosfstools/man/dosfsck.8
+++ /dev/null
@@ -1,112 +0,0 @@
-.TH DOSFSCK 8 "2010\-01\-31" "3.0.9" "check and repair MS\-DOS filesystems"
-
-.SH NAME
-\fBdosfsck\fR \- check and repair MS\-DOS filesystems
-
-.SH SYNOPSIS
-\fBdosfsck\fR|\fBfsck.msdos\fR|\fBfsck.vfat\fR [\-aAflnrtvVwy] [\-d \fIPATH\fR \-d\ \fI...\fR] [\-u\ \fIPATH\fR \-u \fI...\fR] \fIDEVICE\fR
-
-.SH DESCRIPTION
-\fBdosfsck\fR verifies the consistency of MS\-DOS filesystems and optionally tries to repair them.
-.PP
-The following filesystem problems can be corrected (in this order):
-.IP "*" 4
-FAT contains invalid cluster numbers. Cluster is changed to EOF.
-.IP "*" 4
-File's cluster chain contains a loop. The loop is broken.
-.IP "*" 4
-Bad clusters (read errors). The clusters are marked bad and they are removed from files owning them. This check is optional.
-.IP "*" 4
-Directories with a large number of bad entries (probably corrupt). The directory can be deleted.
-.IP "*" 4
-Files . and .. are non\-directories. They can be deleted or renamed.
-.IP "*" 4
-Directories . and .. in root directory. They are deleted.
-.IP "*" 4
-Bad filenames. They can be renamed.
-.IP "*" 4
-Duplicate directory entries. They can be deleted or renamed.
-.IP "*" 4
-Directories with non\-zero size field. Size is set to zero.
-.IP "*" 4
-Directory . does not point to parent directory. The start pointer is adjusted.
-.IP "*" 4
-Directory .. does not point to parent of parent directory. The start pointer is adjusted.
-.IP "*" 4
-Start cluster number of a file is invalid. The file is truncated.
-.IP "*" 4
-File contains bad or free clusters. The file is truncated.
-.IP "*" 4
-File's cluster chain is longer than indicated by the size fields. The file is truncated.
-.IP "*" 4
-Two or more files share the same cluster(s). All but one of the files are truncated. If the file being truncated is a directory file that has already been read, the filesystem check is restarted after truncation.
-.IP "*" 4
-File's cluster chain is shorter than indicated by the size fields. The file is truncated.
-.IP "*" 4
-Clusters are marked as used but are not owned by a file. They are marked as free.
-.PP
-Additionally, the following problems are detected, but not repaired:
-.IP "*" 4
-Invalid parameters in boot sector.
-.IP "*" 4
-Absence of . and .. entries in non\-root directories
-.PP
-When \fBdosfsck\fR checks a filesystem, it accumulates all changes in memory and performs them only after all checks are complete. This can be disabled with the \fB\-w\fR option.
-
-.SH OPTIONS
-.IP "\fB\-a\fR" 4
-Automatically repair the filesystem. No user intervention is necessary. Whenever there is more than one method to solve a problem, the least destructive approach is used.
-.IP "\fB\-A\fR" 4
-Use Atari variation of the MS\-DOS filesystem. This is default if \fBdosfsck\fR is run on an Atari, then this option turns off Atari format. There are some minor differences in Atari format: Some boot sector fields are interpreted slightly different, and the special FAT entries for end\-of\-file and bad cluster can be different. Under MS\-DOS 0xfff8 is used for EOF and Atari employs 0xffff by default, but both systems recognize all values from 0xfff8...0xffff as end\-of\-file. MS\-DOS uses only 0xfff7 for bad clusters, where on Atari values 0xfff0...0xfff7 are for this purpose (but the standard value is still 0xfff7).
-.IP "\fB\-d\fR" 4
-Delete the specified file. If more that one file with that name exists, the first one is deleted.
-.IP "\fB\-f\fR" 4
-Salvage unused cluster chains to files. By default, unused clusters are added to the free disk space except in auto mode (\fB\-a\fR).
-.IP "\fB\-l\fR" 4
-List path names of files being processed.
-.IP "\fB\-n\fR" 4
-No\-operation mode: non\-interactively check for errors, but don't write
-anything to the filesystem.
-.IP "\fB\-r\fR" 4
-Interactively repair the filesystem. The user is asked for advice whenever
-there is more than one approach to fix an inconsistency.
-.IP "\fB\-t\fR" 4
-Mark unreadable clusters as bad.
-.IP "\fB\-u\fR" 4
-Try to undelete the specified file. \fBdosfsck\fR tries to allocate a chain of contiguous unallocated clusters beginning with the start cluster of the undeleted file.
-.IP "\fB\-v\fR" 4
-Verbose mode. Generates slightly more output.
-.IP "\fB\-V\fR" 4
-Perform a verification pass. The filesystem check is repeated after the first run. The second pass should never report any fixable errors. It may take considerably longer than the first pass, because the first pass may have generated long list of modifications that have to be scanned for each disk read.
-.IP "\fB\-w\fR" 4
-Write changes to disk immediately.
-.IP "\fB\-y\fR" 4
-Same as \fB\-a\fR (automatically repair filesystem) for compatibility with other fsck tools.
-.PP
-\fBNote:\fR If \fB\-a\fR and \fB\-r\fR are absent, the filesystem is only checked, but not repaired.
-
-.SH "EXIT STATUS"
-.IP "0" 4
-No recoverable errors have been detected.
-.IP "1" 4
-Recoverable errors have been detected or \fBdosfsck\fR has discovered an internal inconsistency.
-.IP "2" 4
-Usage error. \fBdosfsck\fR did not access the filesystem.
-
-.SH FILES
-.IP "fsck0000.rec, fsck0001.rec, ..." 4
-When recovering from a corrupted filesystem, \fBdosfsck\fR dumps recovered data into files named 'fsckNNNN.rec' in the top level directory of the filesystem.
-
-.SH BUGS
-Does not create . and .. files where necessary. Does not remove entirely empty directories. Should give more diagnostic messages. Undeleting files should use a more sophisticated algorithm.
-
-.SH SEE ALSO
-\fBdosfslabel\fR(8)
-.br
-\fBmkdosfs\fR(8)
-
-.SH HOMEPAGE
-More information about \fBdosfsck\fR and \fBdosfstools\fR can be found at <\fIhttp://www.daniel\-baumann.ch/software/dosfstools/\fR>.
-
-.SH AUTHORS
-\fBdosfstools\fR were written by Werner Almesberger <\fIwerner.almesberger@lrc.di.epfl.ch\fR>, Roman Hodek <\fIRoman.Hodek@informatik.uni-erlangen.de\fR>, and others. The current maintainer is Daniel Baumann <\fIdaniel@debian.org\fR>.
diff --git a/dosfstools/man/dosfslabel.8 b/dosfstools/man/dosfslabel.8
deleted file mode 100644
index 293ff5de9..000000000
--- a/dosfstools/man/dosfslabel.8
+++ /dev/null
@@ -1,29 +0,0 @@
-.TH DOSFSLABEL 8 "2010\-01\-31" "3.0.9" "set or get MS\-DOS filesystem label"
-
-.SH NAME
-\fBdosfslabel\fR \- set or get MS\-DOS filesystem label
-
-.SH SYNOPSIS
-\fBdosfslabel\fR \fIDEVICE\fR [\fILABEL\fR]
-
-.SH DESCRIPTION
-\fBdosfslabel\fR set or gets a MS\-DOS filesystem label from a given device.
-.PP
-If the label is omitted, then the label name of the specified device is written on the standard output. A label can't be longer than 11 characters.
-
-.SH OPTIONS
-.IP "\fB\-h\fR, \fB\-\-help\fR" 4
-Displays a help message.
-.IP "\fB\-V\fR, \fB\-\-version\fR" 4
-Shows version.
-
-.SH SEE ALSO
-\fBdosfsck\fR(8)
-.br
-\fBmkdosfs\fR(8)
-
-.SH HOMEPAGE
-More information about \fBdosfsck\fR and \fBdosfstools\fR can be found at <\fIhttp://www.daniel\-baumann.ch/software/dosfstools/\fR>.
-
-.SH AUTHORS
-\fBdosfstools\fR were written by Werner Almesberger <\fIwerner.almesberger@lrc.di.epfl.ch\fR>, Roman Hodek <\fIRoman.Hodek@informatik.uni-erlangen.de\fR>, and others. The current maintainer is Daniel Baumann <\fIdaniel@debian.org\fR>.
diff --git a/dosfstools/man/mkdosfs.8 b/dosfstools/man/mkdosfs.8
deleted file mode 100644
index 9100c39b4..000000000
--- a/dosfstools/man/mkdosfs.8
+++ /dev/null
@@ -1,224 +0,0 @@
-.\" -*- nroff -*-
-.TH MKDOSFS 8 "5 May 1995" "Version 2.x"
-.SH NAME
-.B mkdosfs
-\- create an MS-DOS file system under Linux
-.SH SYNOPSIS
-.B mkdosfs|mkfs.msdos|mkfs.vfat
-[
-.B \-a
-]
-[
-.B \-A
-]
-[
-.B \-b
-.I sector-of-backup
-]
-[
-.B \-c
-]
-[
-.B \-l
-.I filename
-]
-[
-.B \-C
-]
-[
-.B \-f
-.I number-of-FATs
-]
-[
-.B \-F
-.I FAT-size
-]
-[
-.B \-h
-.I number-of-hidden-sectors
-]
-[
-.B \-i
-.I volume-id
-]
-.RB [ " \-I " ]
-[
-.B \-m
-.I message-file
-]
-[
-.B \-n
-.I volume-name
-]
-[
-.B \-r
-.I root-dir-entries
-]
-[
-.B \-R
-.I number-of-reserved-sectors
-]
-[
-.B \-s
-.I sectors-per-cluster
-]
-[
-.B \-S
-.I logical-sector-size
-]
-[
-.B \-v
-]
-.I device
-[
-.I block-count
-]
-.SH DESCRIPTION
-.B mkdosfs
-is used to create an MS-DOS file system under Linux on a device (usually
-a disk partition).
-.I device
-is the special file corresponding to the device (e.g /dev/hdXX).
-.I block-count
-is the number of blocks on the device. If omitted,
-.B mkdosfs
-automatically determines the file system size.
-.SH OPTIONS
-.TP
-.B \-a
-Normally, for any filesystem except very small ones, \fBmkdosfs\fP
-will align all the data structures to cluster size, to make sure that
-as long as the partition is properly aligned, so will all the data
-structures in the filesystem. This option disables alignment; this
-may provide a handful of additional clusters of storage at the expense
-of a significant performance degradation on RAIDs, flash media or
-large-sector hard disks.
-.TP
-.B \-A
-Use Atari variation of the MS-DOS file system. This is default if
-\fBmkdosfs\fP is run on an Atari, then this option turns off Atari
-format. There are some differences when using Atari format: If not
-directed otherwise by the user, \fBmkdosfs\fP will always use 2
-sectors per cluster, since GEMDOS doesn't like other values very much.
-It will also obey the maximum number of sectors GEMDOS can handle.
-Larger file systems are managed by raising the logical sector size.
-Under Atari format, an Atari-compatible serial number for the
-file system is generated, and a 12 bit FAT is used only for file systems
-that have one of the usual floppy sizes (720k, 1.2M, 1.44M, 2.88M), a
-16 bit FAT otherwise. This can be overridden with the \fB\-F\fP
-option. Some PC-specific boot sector fields aren't written, and a boot
-message (option \fB\-m\fP) is ignored.
-.TP
-.BI \-b " sector-of-backup "
-Selects the location of the backup boot sector for FAT32. Default
-depends on number of reserved sectors, but usually is sector 6. The
-backup must be within the range of reserved sectors.
-.TP
-.B \-c
-Check the device for bad blocks before creating the file system.
-.TP
-.B \-C
-Create the file given as \fIdevice\fP on the command line, and write
-the to-be-created file system to it. This can be used to create the
-new file system in a file instead of on a real device, and to avoid
-using \fBdd\fP in advance to create a file of appropriate size. With
-this option, the \fIblock-count\fP must be given, because otherwise
-the intended size of the file system wouldn't be known. The file
-created is a sparse file, which actually only contains the meta-data
-areas (boot sector, FATs, and root directory). The data portions won't
-be stored on the disk, but the file nevertheless will have the
-correct size. The resulting file can be copied later to a floppy disk
-or other device, or mounted through a loop device.
-.TP
-.BI \-f " number-of-FATs"
-Specify the number of file allocation tables in the file system. The
-default is 2. Currently the Linux MS-DOS file system does not support
-more than 2 FATs.
-.TP
-.BI \-F " FAT-size"
-Specifies the type of file allocation tables used (12, 16 or 32 bit).
-If nothing is specified, \fBmkdosfs\fR will automatically select
-between 12, 16 and 32 bit, whatever fits better for the file system size.
-.TP
-.BI \-h " number-of-hidden-sectors "
-Select the number of hidden sectors in the volume. Apparently some
-digital cameras get indigestion if you feed them a CF card without
-such hidden sectors, this option allows you to satisfy them. Assumes
-\'0\' if no value is given on the command line.
-.TP
-.I \-i " volume-id"
-Sets the volume ID of the newly created file system;
-.I volume-id
-is a 32-bit hexadecimal number (for example, 2e24ec82). The default
-is a number which depends on the file system creation time.
-.TP
-.B \-I
-It is typical for fixed disk devices to be partitioned so, by default, you are
-not permitted to create a filesystem across the entire device.
-.B mkdosfs
-will complain and tell you that it refuses to work. This is different
-when using MO disks. One doesn't always need partitions on MO disks.
-The file system can go directly to the whole disk. Under other OSes
-this is known as the 'superfloppy' format.
-
-This switch will force
-.B mkdosfs
-to work properly.
-.TP
-.BI \-l " filename"
-Read the bad blocks list from
-.IR filename .
-.TP
-.BI \-m " message-file"
-Sets the message the user receives on attempts to boot this file system
-without having properly installed an operating system. The message
-file must not exceed 418 bytes once line feeds have been converted to
-carriage return-line feed combinations, and tabs have been expanded.
-If the filename is a hyphen (-), the text is taken from standard input.
-.TP
-.BI \-n " volume-name"
-Sets the volume name (label) of the file system. The volume name can
-be up to 11 characters long. The default is no label.
-.TP
-.BI \-r " root-dir-entries"
-Select the number of entries available in the root directory. The
-default is 112 or 224 for floppies and 512 for hard disks.
-.TP
-.BI \-R " number-of-reserved-sectors "
-Select the number of reserved sectors. With FAT32 format at least 2
-reserved sectors are needed, the default is 32. Otherwise the default
-is 1 (only the boot sector).
-.TP
-.BI \-s " sectors-per-cluster"
-Specify the number of disk sectors per cluster. Must be a power of 2,
-i.e. 1, 2, 4, 8, ... 128.
-.TP
-.BI \-S " logical-sector-size"
-Specify the number of bytes per logical sector. Must be a power of 2
-and greater than or equal to 512, i.e. 512, 1024, 2048, 4096, 8192,
-16384, or 32768.
-.TP
-.B \-v
-Verbose execution.
-.SH BUGS
-.B mkdosfs
-can not create boot-able file systems. This isn't as easy as you might
-think at first glance for various reasons and has been discussed a lot
-already.
-.B mkdosfs
-simply will not support it ;)
-.SH AUTHOR
-Dave Hudson - <dave@humbug.demon.co.uk>; modified by Peter Anvin
-<hpa@yggdrasil.com>. Fixes and additions by Roman Hodek
-<roman@hodek.net> for Debian/GNU Linux.
-.SH ACKNOWLEDGMENTS
-.B mkdosfs
-is based on code from
-.BR mke2fs
-(written by Remy Card - <card@masi.ibp.fr>) which is itself based on
-.BR mkfs
-(written by Linus Torvalds - <torvalds@cs.helsinki.fi>).
-.SH SEE ALSO
-.BR dosfsck (8),
-.BR dosfslabel (8),
-.BR mkfs (8)
diff --git a/dosfstools/manpages/Makefile b/dosfstools/manpages/Makefile
new file mode 100644
index 000000000..ee8a47829
--- /dev/null
+++ b/dosfstools/manpages/Makefile
@@ -0,0 +1,50 @@
+# Makefile
+
+## dosfstools(7)
+## Copyright (C) 2006-2014 Daniel Baumann <mail@daniel-baumann.ch>
+##
+## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
+## This is free software, and you are welcome to redistribute it
+## under certain conditions; see COPYING for details.
+
+
+SHELL := sh -e
+
+LANGUAGES = $(shell cd po && ls)
+
+all: build
+
+po4a.cfg:
+ echo "[po4a_langs] $(LANGUAGES)" > po4a.cfg
+ echo "[po4a_paths] pot/\$$master.pot \$$lang:po/\$$lang/\$$master.po" >> po4a.cfg
+
+ for MANPAGE in en/*; \
+ do \
+ SECTION="$$(basename $${MANPAGE} | sed -e 's|\.|\n|g' | tail -n1)"; \
+ echo "[type: man] $${MANPAGE} \$$lang:\$$lang/$$(basename $${MANPAGE} .$${SECTION}).\$$lang.$${SECTION}" >> po4a.cfg; \
+ done
+
+update:
+ ./bin/update-version.sh
+
+build: po4a.cfg
+ @if [ ! -x "$$(which po4a 2>/dev/null)" ]; \
+ then \
+ echo "E: po4a - command not found"; \
+ echo "I: po4a can be obtained from:"; \
+ echo "I: http://po4a.alioth.debian.org/"; \
+ echo "I: On Debian based systems, po4a can be installed with:"; \
+ echo "I: apt-get install po4a"; \
+ exit 1; \
+ fi
+
+ po4a --keep 0 --no-backups -o untranslated=MT,ME \
+ --package-name dosfstools po4a.cfg
+
+clean:
+ rm -rf $(LANGUAGES)
+
+distclean: clean
+ rm -f po4a.cfg
+
+rebuild: distclean update build
diff --git a/dosfstools/manpages/bin/update-version.sh b/dosfstools/manpages/bin/update-version.sh
new file mode 100755
index 000000000..48e9c08c0
--- /dev/null
+++ b/dosfstools/manpages/bin/update-version.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+
+## dosfstools(7)
+## Copyright (C) 2006-2014 Daniel Baumann <mail@daniel-baumann.ch>
+##
+## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
+## This is free software, and you are welcome to redistribute it
+## under certain conditions; see COPYING for details.
+
+
+set -e
+
+PROJECT="dosfstools"
+VERSION="$(cat ../VERSION)"
+
+DATE="$(LC_ALL=C date +%Y\\\\-%m\\\\-%d)"
+
+DAY="$(LC_ALL=C date +%d)"
+MONTH="$(LC_ALL=C date +%m)"
+YEAR="$(LC_ALL=C date +%Y)"
+
+echo "Updating version headers..."
+
+for MANPAGE in en/*
+do
+ PROGRAM="$(basename ${MANPAGE} | sed -e 's|\(.*\).[0-9]$|\1|' | tr [a-z] [A-Z])"
+ SECTION="$(basename ${MANPAGE} | sed -e 's|.*.\([0-9]\)$|\1|')"
+
+ sed -i -e "s|^.TH.*$|.TH ${PROGRAM} ${SECTION} ${DATE} ${VERSION} \"${PROJECT}\"|" ${MANPAGE}
+done
+
+# European date format
+for _LANGUAGE in de es fr it
+do
+ if ls po/${_LANGUAGE}/*.po > /dev/null 2>&1
+ then
+ for _FILE in po/${_LANGUAGE}/*.po
+ do
+ sed -i -e "s|^msgstr .*.2014-.*$|msgstr \"${DAY}.${MONTH}.${YEAR}\"|g" \
+ -e "s|^msgstr .*.2014\"$|msgstr \"${DAY}.${MONTH}.${YEAR}\"|g" \
+ "${_FILE}"
+ done
+ fi
+done
+
+# Brazilian date format
+if ls po/pt_BR/*.po > /dev/null 2>&1
+then
+ for _FILE in po/pt_BR/*.po
+ do
+ sed -i -e "s|^msgstr .*.2014-.*$|msgstr \"${DAY}-${MONTH}-${YEAR}\"|g" \
+ -e "s|^msgstr .*-2014\"$|msgstr \"${DAY}-${MONTH}-${YEAR}\"|g" \
+ "${_FILE}"
+ done
+fi
diff --git a/dosfstools/manpages/de/fatlabel.de.8 b/dosfstools/manpages/de/fatlabel.de.8
new file mode 100644
index 000000000..53f5515ed
--- /dev/null
+++ b/dosfstools/manpages/de/fatlabel.de.8
@@ -0,0 +1,68 @@
+.\" fatlabel.8 - manpage for fatlabel
+.\"
+.\" Copyright (C) 2006-2014 Daniel Baumann <daniel@debian.org>
+.\"
+.\" 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 3 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, see <http://www.gnu.org/licenses/>.
+.\"
+.\" The complete text of the GNU General Public License
+.\" can be found in /usr/share/common-licenses/GPL-3 file.
+.\"
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH FATLABEL 8 2015\-05\-16 3.0.28 dosfstools
+.SH NAME
+.\" ----------------------------------------------------------------------------
+\fBfatlabel\fP \- set or get MS\-DOS filesystem label
+.SH SYNOPSIS
+.\" ----------------------------------------------------------------------------
+\fBfatlabel\fP \fIDEVICE\fP [\fILABEL\fP]
+.SH DESCRIPTION
+\fBfatlabel\fP set or gets a MS\-DOS filesystem label from a given device.
+.PP
+.\" ----------------------------------------------------------------------------
+If \fILABEL\fP is omitted, then the label name of the specified device is
+written on the standard output. A label can't be longer than 11 bytes.
+.SH OPTIONS
+.IP "\fB\-h\fP, \fB\-\-help\fP" 4
+Displays a help message.
+.IP "\fB\-V\fP, \fB\-\-version\fP" 4
+.\" ----------------------------------------------------------------------------
+Shows version.
+.SH "SEE ALSO"
+\fBfsck.fat\fP(8)
+.br
+.\" ----------------------------------------------------------------------------
+\fBmkfs.fat\fP(8)
+.SH HOMEPAGE
+.\" ----------------------------------------------------------------------------
+The home for the \fBdosfstools\fP project is its
+.UR https://github.com/dosfstools/dosfstools
+GitHub project page
+.UE .
+.SH AUTHORS
+\fBdosfstools\fP were written by
+.MT werner.almesberger@\:lrc.di.epfl.ch
+Werner Almesberger
+.ME ,
+.MT Roman.Hodek@\:informatik.\:uni-erlangen.de
+Roman Hodek
+.ME ,
+and others. The current maintainer is
+.MT aeb@\:debian.org
+Andreas Bombe
+.ME .
diff --git a/dosfstools/manpages/de/fsck.fat.de.8 b/dosfstools/manpages/de/fsck.fat.de.8
new file mode 100644
index 000000000..869b806a8
--- /dev/null
+++ b/dosfstools/manpages/de/fsck.fat.de.8
@@ -0,0 +1,189 @@
+.\" fsck.fat.8 - manpage for fsck.fat
+.\"
+.\" Copyright (C) 2006-2014 Daniel Baumann <daniel@debian.org>
+.\"
+.\" 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 3 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, see <http://www.gnu.org/licenses/>.
+.\"
+.\" The complete text of the GNU General Public License
+.\" can be found in /usr/share/common-licenses/GPL-3 file.
+.\"
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH FSCK.FAT 8 2015\-05\-16 3.0.28 dosfstools
+.SH NAME
+.\" ----------------------------------------------------------------------------
+\fBfsck.fat\fP \- check and repair MS\-DOS filesystems
+.SH SYNOPSIS
+.\" ----------------------------------------------------------------------------
+\fBfsck.fat\fP [\fIOPTIONS\fP] \fIDEVICE\fP
+.SH DESCRIPTION
+\fBfsck.fat\fP verifies the consistency of MS\-DOS filesystems and optionally
+tries to repair them.
+.PP
+The following filesystem problems can be corrected (in this order):
+.IP * 4
+FAT contains invalid cluster numbers. Cluster is changed to EOF.
+.IP * 4
+File's cluster chain contains a loop. The loop is broken.
+.IP * 4
+Bad clusters (read errors). The clusters are marked bad and they are
+removed from files owning them. This check is optional.
+.IP * 4
+Directories with a large number of bad entries (probably corrupt). The
+directory can be deleted.
+.IP * 4
+Files . and .. are non\-directories. They can be deleted or renamed.
+.IP * 4
+Directories . and .. in root directory. They are deleted.
+.IP * 4
+Bad filenames. They can be renamed.
+.IP * 4
+Duplicate directory entries. They can be deleted or renamed.
+.IP * 4
+Directories with non\-zero size field. Size is set to zero.
+.IP * 4
+Directory . does not point to parent directory. The start pointer is
+adjusted.
+.IP * 4
+Directory .. does not point to parent of parent directory. The start
+pointer is adjusted.
+.IP * 4
+Start cluster number of a file is invalid. The file is truncated.
+.IP * 4
+File contains bad or free clusters. The file is truncated.
+.IP * 4
+File's cluster chain is longer than indicated by the size fields. The file
+is truncated.
+.IP * 4
+Two or more files share the same cluster(s). All but one of the files are
+truncated. If the file being truncated is a directory file that has already
+been read, the filesystem check is restarted after truncation.
+.IP * 4
+File's cluster chain is shorter than indicated by the size fields. The file
+is truncated.
+.IP * 4
+Clusters are marked as used but are not owned by a file. They are marked as
+free.
+.PP
+Additionally, the following problems are detected, but not repaired:
+.IP * 4
+Invalid parameters in boot sector
+.IP * 4
+Absence of . and .. entries in non\-root directories
+.PP
+.\" ----------------------------------------------------------------------------
+When \fBfsck.fat\fP checks a filesystem, it accumulates all changes in memory
+and performs them only after all checks are complete. This can be disabled
+with the \fB\-w\fP option.
+.SH OPTIONS
+.IP \fB\-a\fP 4
+Automatically repair the filesystem. No user intervention is necessary.
+Whenever there is more than one method to solve a problem, the least
+destructive approach is used.
+.IP \fB\-A\fP 4
+Use Atari variation of the MS\-DOS filesystem. This is default if
+\fBfsck.fat\fP is run on an Atari, then this option turns off Atari format.
+There are some minor differences in Atari format: Some boot sector fields
+are interpreted slightly different, and the special FAT entries for
+end\-of\-file and bad cluster can be different. Under MS\-DOS 0xfff8 is used
+for EOF and Atari employs 0xffff by default, but both systems recognize all
+values from 0xfff8...0xffff as end\-of\-file. MS\-DOS uses only 0xfff7 for bad
+clusters, where on Atari values 0xfff0...0xfff7 are for this purpose (but
+the standard value is still 0xfff7).
+.IP \fB\-b\fP 4
+Make read\-only boot sector check.
+.IP "\fB\-d\fP \fIPATH\fP" 4
+Delete the specified file. If more than one file with that name exist, the
+first one is deleted. This option can be given more than once.
+.IP \fB\-f\fP 4
+Salvage unused cluster chains to files. By default, unused clusters are
+added to the free disk space except in auto mode (\fB\-a\fP).
+.IP \fB\-l\fP 4
+List path names of files being processed.
+.IP \fB\-n\fP 4
+No\-operation mode: non\-interactively check for errors, but don't write
+anything to the filesystem.
+.IP \fB\-p\fP 4
+Same as \fB\-a\fP, for compatibility with other *fsck.
+.IP \fB\-r\fP 4
+Interactively repair the filesystem. The user is asked for advice whenever
+there is more than one approach to fix an inconsistency. This is the
+default mode and the option is only retained for backwards compatibility.
+.IP \fB\-t\fP 4
+Mark unreadable clusters as bad.
+.IP "\fB\-u\fP \fIPATH\fP" 4
+Try to undelete the specified file. \fBfsck.fat\fP tries to allocate a chain
+of contiguous unallocated clusters beginning with the start cluster of the
+undeleted file. This option can be given more than once.
+.IP \fB\-v\fP 4
+Verbose mode. Generates slightly more output.
+.IP \fB\-V\fP 4
+Perform a verification pass. The filesystem check is repeated after the
+first run. The second pass should never report any fixable errors. It may
+take considerably longer than the first pass, because the first pass may
+have generated long list of modifications that have to be scanned for each
+disk read.
+.IP \fB\-w\fP 4
+Write changes to disk immediately.
+.IP \fB\-y\fP 4
+.\" ----------------------------------------------------------------------------
+Same as \fB\-a\fP (automatically repair filesystem) for compatibility with other
+fsck tools.
+.SH "EXIT STATUS"
+.IP 0 4
+No recoverable errors have been detected.
+.IP 1 4
+Recoverable errors have been detected or \fBfsck.fat\fP has discovered an
+internal inconsistency.
+.IP 2 4
+.\" ----------------------------------------------------------------------------
+Usage error. \fBfsck.fat\fP did not access the filesystem.
+.SH FILES
+.IP "fsck0000.rec, fsck0001.rec, ..." 4
+.\" ----------------------------------------------------------------------------
+When recovering from a corrupted filesystem, \fBfsck.fat\fP dumps recovered
+data into files named 'fsckNNNN.rec' in the top level directory of the
+filesystem.
+.SH BUGS
+.\" ----------------------------------------------------------------------------
+Does not create . and .. files where necessary. Does not remove entirely
+empty directories. Should give more diagnostic messages. Undeleting files
+should use a more sophisticated algorithm.
+.SH "SEE ALSO"
+\fBfatlabel\fP(8)
+.br
+.\" ----------------------------------------------------------------------------
+\fBmkfs.fat\fP(8)
+.SH HOMEPAGE
+.\" ----------------------------------------------------------------------------
+The home for the \fBdosfstools\fP project is its
+.UR https://github.com/dosfstools/dosfstools
+GitHub project page
+.UE .
+.SH AUTHORS
+\fBdosfstools\fP were written by
+.MT werner.almesberger@\:lrc.di.epfl.ch
+Werner Almesberger
+.ME ,
+.MT Roman.Hodek@\:informatik.\:uni-erlangen.de
+Roman Hodek
+.ME ,
+and others. The current maintainer is
+.MT aeb@\:debian.org
+Andreas Bombe
+.ME .
diff --git a/dosfstools/manpages/de/mkfs.fat.de.8 b/dosfstools/manpages/de/mkfs.fat.de.8
new file mode 100644
index 000000000..a1b51d45b
--- /dev/null
+++ b/dosfstools/manpages/de/mkfs.fat.de.8
@@ -0,0 +1,172 @@
+.\" mkfs.fat.8 - manpage for fs.fatck
+.\"
+.\" Copyright (C) 2006-2014 Daniel Baumann <daniel@debian.org>
+.\"
+.\" 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 3 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, see <http://www.gnu.org/licenses/>.
+.\"
+.\" The complete text of the GNU General Public License
+.\" can be found in /usr/share/common-licenses/GPL-3 file.
+.\"
+.\"
+.\"*******************************************************************
+.\"
+.\" This file was generated with po4a. Translate the source file.
+.\"
+.\"*******************************************************************
+.TH MKFS.FAT 8 2015\-05\-16 3.0.28 dosfstools
+.SH NAME
+.\" ----------------------------------------------------------------------------
+\fBmkfs.fat\fP \- create an MS\-DOS filesystem under Linux
+.SH SYNOPSIS
+.\" ----------------------------------------------------------------------------
+\fBmkfs.fat\fP [\fIOPTIONS\fP] \fIDEVICE\fP [\fIBLOCK\-COUNT\fP]
+.SH DESCRIPTION
+.\" ----------------------------------------------------------------------------
+\fBmkfs.fat\fP is used to create an MS\-DOS filesystem under Linux on a device
+(usually a disk partition). \fIDEVICE\fP is the special file corresponding to
+the device (e.g. /dev/sdXX). \fIBLOCK\-COUNT\fP is the number of blocks on the
+device. If omitted, \fBmkfs.fat\fP automatically determines the filesystem
+size.
+.SH OPTIONS
+.IP \fB\-a\fP 4
+Normally, for any filesystem except very small ones, \fBmkfs.fat\fP will align
+all the data structures to cluster size, to make sure that as long as the
+partition is properly aligned, so will all the data structures in the
+filesystem. This option disables alignment; this may provide a handful of
+additional clusters of storage at the expense of a significant performance
+degradation on RAIDs, flash media or large\-sector hard disks.
+.IP "\fB \-A\fP" 4
+Use Atari variation of the MS\-DOS filesystem. This is default if
+\fBmkfs.fat\fP is run on an Atari, then this option turns off Atari format.
+There are some differences when using Atari format: If not directed
+otherwise by the user, \fBmkfs.fat\fP will always use 2 sectors per cluster,
+since GEMDOS doesn't like other values very much. It will also obey the
+maximum number of sectors GEMDOS can handle. Larger filesystems are managed
+by raising the logical sector size. Under Atari format, an Atari\-compatible
+serial number for the filesystem is generated, and a 12 bit FAT is used only
+for filesystems that have one of the usual floppy sizes (720k, 1.2M, 1.44M,
+2.88M), a 16 bit FAT otherwise. This can be overridden with the \fB\-F\fP
+option. Some PC\-specific boot sector fields aren't written, and a boot
+message (option \fB\-m\fP) is ignored.
+.IP "\fB\-b\fP \fISECTOR\-OF\-BACKUP\fP" 4
+Selects the location of the backup boot sector for FAT32. Default depends
+on number of reserved sectors, but usually is sector 6. The backup must be
+within the range of reserved sectors.
+.IP \fB\-c\fP 4
+Check the device for bad blocks before creating the filesystem.
+.IP \fB\-C\fP 4
+Create the file given as \fIDEVICE\fP on the command line, and write the
+to\-be\-created filesystem to it. This can be used to create the new
+filesystem in a file instead of on a real device, and to avoid using \fBdd\fP
+in advance to create a file of appropriate size. With this option, the
+\fIBLOCK\-COUNT\fP must be given, because otherwise the intended size of the
+filesystem wouldn't be known. The file created is a sparse file, which
+actually only contains the meta\-data areas (boot sector, FATs, and root
+directory). The data portions won't be stored on the disk, but the file
+nevertheless will have the correct size. The resulting file can be copied
+later to a floppy disk or other device, or mounted through a loop device.
+.IP "\fB\-D\fP \fIDRIVE\-NUMBER\fP" 4
+Specify the BIOS drive number to be stored in the FAT boot sector. This
+value is usually 0x80 for hard disks and 0x00 for floppy devices or
+partitions to be used for floppy emulation.
+.IP "\fB\-f\fP \fINUMBER\-OF\-FATS\fP" 4
+Specify the number of file allocation tables in the filesystem. The default
+is 2.
+.IP "\fB\-F\fP \fIFAT\-SIZE\fP" 4
+Specifies the type of file allocation tables used (12, 16 or 32 bit). If
+nothing is specified, \fBmkfs.fat\fP will automatically select between 12, 16
+and 32 bit, whatever fits better for the filesystem size.
+.IP "\fB\-h\fP \fINUMBER\-OF\-HIDDEN\-SECTORS\fP" 4
+Select the number of hidden sectors in the volume. Apparently some digital
+cameras get indigestion if you feed them a CF card without such hidden
+sectors, this option allows you to satisfy them.
+.IP "\fB\-i\fP \fIVOLUME\-ID\fP" 4
+Sets the volume ID of the newly created filesystem; \fIVOLUME\-ID\fP is a 32\-bit
+hexadecimal number (for example, 2e24ec82). The default is a number which
+depends on the filesystem creation time.
+.IP \fB\-I\fP 4
+It is typical for fixed disk devices to be partitioned so, by default, you
+are not permitted to create a filesystem across the entire device.
+\fBmkfs.fat\fP will complain and tell you that it refuses to work. This is
+different when using MO disks. One doesn't always need partitions on MO
+disks. The filesystem can go directly to the whole disk. Under other OSes
+this is known as the 'superfloppy' format. This switch will force
+\fBmkfs.fat\fP to work properly.
+.IP "\fB\-l\fP \fIFILENAME\fP" 4
+Read the bad blocks list from \fIFILENAME\fP.
+.IP "\fB\-m\fP \fIMESSAGE\-FILE\fP" 4
+Sets the message the user receives on attempts to boot this filesystem
+without having properly installed an operating system. The message file
+must not exceed 418 bytes once line feeds have been converted to carriage
+return\-line feed combinations, and tabs have been expanded. If the filename
+is a hyphen (\-), the text is taken from standard input.
+.IP "\fB\-M\fP \fIFAT\-MEDIA\-TYPE\fP" 4
+Specify the media type to be stored in the FAT boot sector. This value is
+usually 0xF8 for hard disks and is 0xF0 or a value from 0xF9 to 0xFF for
+floppies or partitions to be used for floppy emulation.
+.IP "\fB\-n\fP \fIVOLUME\-NAME\fP" 4
+Sets the volume name (label) of the filesystem. The volume name can be up
+to 11 characters long. The default is no label.
+.IP "\fB\-r\fP \fIROOT\-DIR\-ENTRIES\fP" 4
+Select the number of entries available in the root directory. The default
+is 112 or 224 for floppies and 512 for hard disks.
+.IP "\fB\-R\fP \fINUMBER\-OF\-RESERVED\-SECTORS\fP" 4
+Select the number of reserved sectors. With FAT32 format at least 2
+reserved sectors are needed, the default is 32. Otherwise the default is 1
+(only the boot sector).
+.IP "\fB\-s\fP \fISECTORS\-PER\-CLUSTER\fP" 4
+Specify the number of disk sectors per cluster. Must be a power of 2,
+i.e. 1, 2, 4, 8, ... 128.
+.IP "\fB\-S\fP \fILOGICAL\-SECTOR\-SIZE\fP" 4
+Specify the number of bytes per logical sector. Must be a power of 2 and
+greater than or equal to 512, i.e. 512, 1024, 2048, 4096, 8192, 16384, or
+32768.
+.IP \fB\-v\fP 4
+Verbose execution.
+.IP \fB\-\-invariant\fP 4
+Use constants for normally randomly generated or time based data such as
+volume ID and creation time. Multiple runs of \fBmkfs.fat\fP on the same
+device create identical results with this option. Its main purpose is
+testing \fBmkfs.fat\fP.
+.IP \fB\-\-help\fP 4
+.\" ----------------------------------------------------------------------------
+Display option summary and exit.
+.SH BUGS
+.\" ----------------------------------------------------------------------------
+\fBmkfs.fat\fP can not create boot\-able filesystems. This isn't as easy as you
+might think at first glance for various reasons and has been discussed a lot
+already. \fBmkfs.fat\fP simply will not support it ;)
+.SH "SEE ALSO"
+\fBfatlabel\fP(8)
+.br
+.\" ----------------------------------------------------------------------------
+\fBfsck.fat\fP(8)
+.SH HOMEPAGE
+.\" ----------------------------------------------------------------------------
+The home for the \fBdosfstools\fP project is its
+.UR https://github.com/dosfstools/dosfstools
+GitHub project page
+.UE .
+.SH AUTHORS
+\fBdosfstools\fP were written by
+.MT werner.almesberger@\:lrc.di.epfl.ch
+Werner Almesberger
+.ME ,
+.MT Roman.Hodek@\:informatik.\:uni-erlangen.de
+Roman Hodek
+.ME ,
+and others. The current maintainer is
+.MT aeb@\:debian.org
+Andreas Bombe
+.ME .
diff --git a/dosfstools/manpages/en/fatlabel.8 b/dosfstools/manpages/en/fatlabel.8
new file mode 100644
index 000000000..c00a79517
--- /dev/null
+++ b/dosfstools/manpages/en/fatlabel.8
@@ -0,0 +1,65 @@
+.\" fatlabel.8 - manpage for fatlabel
+.\"
+.\" Copyright (C) 2006-2014 Daniel Baumann <daniel@debian.org>
+.\"
+.\" 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 3 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, see <http://www.gnu.org/licenses/>.
+.\"
+.\" The complete text of the GNU General Public License
+.\" can be found in /usr/share/common-licenses/GPL-3 file.
+.\"
+.\"
+.TH FATLABEL 8 2015\-05\-16 3.0.28 "dosfstools"
+.SH NAME
+\fBfatlabel\fR \- set or get MS\-DOS filesystem label
+.\" ----------------------------------------------------------------------------
+.SH SYNOPSIS
+\fBfatlabel\fR \fIDEVICE\fR [\fILABEL\fR]
+.\" ----------------------------------------------------------------------------
+.SH DESCRIPTION
+\fBfatlabel\fR set or gets a MS\-DOS filesystem label from a given device.
+.PP
+If \fILABEL\fR is omitted, then the label name of the specified device is
+written on the standard output.
+A label can't be longer than 11 bytes.
+.\" ----------------------------------------------------------------------------
+.SH OPTIONS
+.IP "\fB\-h\fR, \fB\-\-help\fR" 4
+Displays a help message.
+.IP "\fB\-V\fR, \fB\-\-version\fR" 4
+Shows version.
+.\" ----------------------------------------------------------------------------
+.SH SEE ALSO
+\fBfsck.fat\fR(8)
+.br
+\fBmkfs.fat\fR(8)
+.\" ----------------------------------------------------------------------------
+.SH HOMEPAGE
+The home for the \fBdosfstools\fR project is its
+.UR https://github.com/dosfstools/dosfstools
+GitHub project page
+.UE .
+.\" ----------------------------------------------------------------------------
+.SH AUTHORS
+\fBdosfstools\fR were written by
+.MT werner.almesberger@\:lrc.di.epfl.ch
+Werner Almesberger
+.ME ,
+.MT Roman.Hodek@\:informatik.\:uni-erlangen.de
+Roman Hodek
+.ME ,
+and others.
+The current maintainer is
+.MT aeb@\:debian.org
+Andreas Bombe
+.ME .
diff --git a/dosfstools/manpages/en/fsck.fat.8 b/dosfstools/manpages/en/fsck.fat.8
new file mode 100644
index 000000000..f2d44d080
--- /dev/null
+++ b/dosfstools/manpages/en/fsck.fat.8
@@ -0,0 +1,206 @@
+.\" fsck.fat.8 - manpage for fsck.fat
+.\"
+.\" Copyright (C) 2006-2014 Daniel Baumann <daniel@debian.org>
+.\"
+.\" 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 3 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, see <http://www.gnu.org/licenses/>.
+.\"
+.\" The complete text of the GNU General Public License
+.\" can be found in /usr/share/common-licenses/GPL-3 file.
+.\"
+.\"
+.TH FSCK.FAT 8 2015\-05\-16 3.0.28 "dosfstools"
+.SH NAME
+\fBfsck.fat\fR \- check and repair MS\-DOS filesystems
+.\" ----------------------------------------------------------------------------
+.SH SYNOPSIS
+\fBfsck.fat\fR [\fIOPTIONS\fR] \fIDEVICE\fR
+.\" ----------------------------------------------------------------------------
+.SH DESCRIPTION
+\fBfsck.fat\fR verifies the consistency of MS\-DOS filesystems and optionally
+tries to repair them.
+.PP
+The following filesystem problems can be corrected (in this order):
+.IP "*" 4
+FAT contains invalid cluster numbers.
+Cluster is changed to EOF.
+.IP "*" 4
+File's cluster chain contains a loop.
+The loop is broken.
+.IP "*" 4
+Bad clusters (read errors).
+The clusters are marked bad and they are removed from files owning them.
+This check is optional.
+.IP "*" 4
+Directories with a large number of bad entries (probably corrupt).
+The directory can be deleted.
+.IP "*" 4
+Files . and .. are non\-directories.
+They can be deleted or renamed.
+.IP "*" 4
+Directories . and .. in root directory.
+They are deleted.
+.IP "*" 4
+Bad filenames.
+They can be renamed.
+.IP "*" 4
+Duplicate directory entries.
+They can be deleted or renamed.
+.IP "*" 4
+Directories with non\-zero size field.
+Size is set to zero.
+.IP "*" 4
+Directory . does not point to parent directory.
+The start pointer is adjusted.
+.IP "*" 4
+Directory .. does not point to parent of parent directory.
+The start pointer is adjusted.
+.IP "*" 4
+Start cluster number of a file is invalid.
+The file is truncated.
+.IP "*" 4
+File contains bad or free clusters.
+The file is truncated.
+.IP "*" 4
+File's cluster chain is longer than indicated by the size fields.
+The file is truncated.
+.IP "*" 4
+Two or more files share the same cluster(s).
+All but one of the files are truncated.
+If the file being truncated is a directory file that has already been read, the
+filesystem check is restarted after truncation.
+.IP "*" 4
+File's cluster chain is shorter than indicated by the size fields.
+The file is truncated.
+.IP "*" 4
+Clusters are marked as used but are not owned by a file.
+They are marked as free.
+.PP
+Additionally, the following problems are detected, but not repaired:
+.IP "*" 4
+Invalid parameters in boot sector
+.IP "*" 4
+Absence of . and .. entries in non\-root directories
+.PP
+When \fBfsck.fat\fR checks a filesystem, it accumulates all changes in memory
+and performs them only after all checks are complete.
+This can be disabled with the \fB\-w\fR option.
+.\" ----------------------------------------------------------------------------
+.SH OPTIONS
+.IP "\fB\-a\fR" 4
+Automatically repair the filesystem.
+No user intervention is necessary.
+Whenever there is more than one method to solve a problem, the least
+destructive approach is used.
+.IP "\fB\-A\fR" 4
+Use Atari variation of the MS\-DOS filesystem.
+This is default if \fBfsck.fat\fR is run on an Atari, then this option turns
+off Atari format.
+There are some minor differences in Atari format:
+Some boot sector fields are interpreted slightly different, and the special FAT
+entries for end\-of\-file and bad cluster can be different.
+Under MS\-DOS 0xfff8 is used for EOF and Atari employs 0xffff by default, but
+both systems recognize all values from 0xfff8...0xffff as end\-of\-file.
+MS\-DOS uses only 0xfff7 for bad clusters, where on Atari values 0xfff0...0xfff7
+are for this purpose (but the standard value is still 0xfff7).
+.IP "\fB-b\fR" 4
+Make read-only boot sector check.
+.IP "\fB\-d\fR \fIPATH\fR" 4
+Delete the specified file.
+If more than one file with that name exist, the first one is deleted.
+This option can be given more than once.
+.IP "\fB\-f\fR" 4
+Salvage unused cluster chains to files.
+By default, unused clusters are added to the free disk space except in auto mode
+(\fB\-a\fR).
+.IP "\fB\-l\fR" 4
+List path names of files being processed.
+.IP "\fB\-n\fR" 4
+No\-operation mode: non\-interactively check for errors, but don't write
+anything to the filesystem.
+.IP "\fB\-p\fR" 4
+Same as \fB\-a\fR, for compatibility with other *fsck.
+.IP "\fB\-r\fR" 4
+Interactively repair the filesystem.
+The user is asked for advice whenever there is more than one approach to fix an
+inconsistency.
+This is the default mode and the option is only retained for backwards
+compatibility.
+.IP "\fB\-t\fR" 4
+Mark unreadable clusters as bad.
+.IP "\fB\-u\fR \fIPATH\fR" 4
+Try to undelete the specified file.
+\fBfsck.fat\fR tries to allocate a chain of contiguous unallocated clusters
+beginning with the start cluster of the undeleted file.
+This option can be given more than once.
+.IP "\fB\-v\fR" 4
+Verbose mode.
+Generates slightly more output.
+.IP "\fB\-V\fR" 4
+Perform a verification pass.
+The filesystem check is repeated after the first run.
+The second pass should never report any fixable errors.
+It may take considerably longer than the first pass, because the first pass may
+have generated long list of modifications that have to be scanned for each disk
+read.
+.IP "\fB\-w\fR" 4
+Write changes to disk immediately.
+.IP "\fB\-y\fR" 4
+Same as \fB\-a\fR (automatically repair filesystem) for compatibility with other
+fsck tools.
+.\" ----------------------------------------------------------------------------
+.SH "EXIT STATUS"
+.IP "0" 4
+No recoverable errors have been detected.
+.IP "1" 4
+Recoverable errors have been detected or \fBfsck.fat\fR has discovered an
+internal inconsistency.
+.IP "2" 4
+Usage error.
+\fBfsck.fat\fR did not access the filesystem.
+.\" ----------------------------------------------------------------------------
+.SH FILES
+.IP "fsck0000.rec, fsck0001.rec, ..." 4
+When recovering from a corrupted filesystem, \fBfsck.fat\fR dumps recovered data
+into files named 'fsckNNNN.rec' in the top level directory of the filesystem.
+.\" ----------------------------------------------------------------------------
+.SH BUGS
+Does not create . and .. files where necessary.
+Does not remove entirely empty directories.
+Should give more diagnostic messages.
+Undeleting files should use a more sophisticated algorithm.
+.\" ----------------------------------------------------------------------------
+.SH SEE ALSO
+\fBfatlabel\fR(8)
+.br
+\fBmkfs.fat\fR(8)
+.\" ----------------------------------------------------------------------------
+.SH HOMEPAGE
+The home for the \fBdosfstools\fR project is its
+.UR https://github.com/dosfstools/dosfstools
+GitHub project page
+.UE .
+.\" ----------------------------------------------------------------------------
+.SH AUTHORS
+\fBdosfstools\fR were written by
+.MT werner.almesberger@\:lrc.di.epfl.ch
+Werner Almesberger
+.ME ,
+.MT Roman.Hodek@\:informatik.\:uni-erlangen.de
+Roman Hodek
+.ME ,
+and others.
+The current maintainer is
+.MT aeb@\:debian.org
+Andreas Bombe
+.ME .
diff --git a/dosfstools/manpages/en/mkfs.fat.8 b/dosfstools/manpages/en/mkfs.fat.8
new file mode 100644
index 000000000..5a5086efc
--- /dev/null
+++ b/dosfstools/manpages/en/mkfs.fat.8
@@ -0,0 +1,178 @@
+.\" mkfs.fat.8 - manpage for fs.fatck
+.\"
+.\" Copyright (C) 2006-2014 Daniel Baumann <daniel@debian.org>
+.\"
+.\" 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 3 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, see <http://www.gnu.org/licenses/>.
+.\"
+.\" The complete text of the GNU General Public License
+.\" can be found in /usr/share/common-licenses/GPL-3 file.
+.\"
+.\"
+.TH MKFS.FAT 8 2015\-05\-16 3.0.28 "dosfstools"
+.SH NAME
+\fBmkfs.fat\fR \- create an MS-DOS filesystem under Linux
+.\" ----------------------------------------------------------------------------
+.SH SYNOPSIS
+\fBmkfs.fat\fR [\fIOPTIONS\fR] \fIDEVICE\fR [\fIBLOCK-COUNT\fR]
+.\" ----------------------------------------------------------------------------
+.SH DESCRIPTION
+\fBmkfs.fat\fR is used to create an MS-DOS filesystem under Linux on a device
+(usually a disk partition).
+\fIDEVICE\fR is the special file corresponding to the device (e.g. /dev/sdXX).
+\fIBLOCK-COUNT\fR is the number of blocks on the device.
+If omitted, \fBmkfs.fat\fR automatically determines the filesystem size.
+.\" ----------------------------------------------------------------------------
+.SH OPTIONS
+.IP "\fB\-a\fR" 4
+Normally, for any filesystem except very small ones, \fBmkfs.fat\fR will align
+all the data structures to cluster size, to make sure that as long as the
+partition is properly aligned, so will all the data structures in the
+filesystem.
+This option disables alignment; this may provide a handful of additional
+clusters of storage at the expense of a significant performance degradation on
+RAIDs, flash media or large-sector hard disks.
+.IP "\fB \-A\fR" 4
+Use Atari variation of the MS-DOS filesystem.
+This is default if \fBmkfs.fat\fR is run on an Atari, then this option turns off
+Atari format.
+There are some differences when using Atari format:
+If not directed otherwise by the user, \fBmkfs.fat\fR will always use 2 sectors
+per cluster, since GEMDOS doesn't like other values very much.
+It will also obey the maximum number of sectors GEMDOS can handle.
+Larger filesystems are managed by raising the logical sector size.
+Under Atari format, an Atari-compatible serial number for the filesystem is
+generated, and a 12 bit FAT is used only for filesystems that have one of the
+usual floppy sizes (720k, 1.2M, 1.44M, 2.88M), a 16 bit FAT otherwise.
+This can be overridden with the \fB\-F\fR option.
+Some PC-specific boot sector fields aren't written, and a boot message (option
+\fB\-m\fR) is ignored.
+.IP "\fB\-b\fR \fISECTOR-OF-BACKUP\fR" 4
+Selects the location of the backup boot sector for FAT32.
+Default depends on number of reserved sectors, but usually is sector 6.
+The backup must be within the range of reserved sectors.
+.IP "\fB\-c" 4
+Check the device for bad blocks before creating the filesystem.
+.IP "\fB\-C\fR" 4
+Create the file given as \fIDEVICE\fR on the command line, and write the
+to-be-created filesystem to it.
+This can be used to create the new filesystem in a file instead of on a real
+device, and to avoid using \fBdd\fR in advance to create a file of appropriate
+size.
+With this option, the \fIBLOCK-COUNT\fR must be given, because otherwise the
+intended size of the filesystem wouldn't be known.
+The file created is a sparse file, which actually only contains the meta-data
+areas (boot sector, FATs, and root directory).
+The data portions won't be stored on the disk, but the file nevertheless will
+have the correct size.
+The resulting file can be copied later to a floppy disk or other device, or
+mounted through a loop device.
+.IP "\fB\-D\fR \fIDRIVE-NUMBER\fR" 4
+Specify the BIOS drive number to be stored in the FAT boot sector.
+This value is usually 0x80 for hard disks and 0x00 for floppy devices or
+partitions to be used for floppy emulation.
+.IP "\fB\-f\fR \fINUMBER-OF-FATS\fR" 4
+Specify the number of file allocation tables in the filesystem.
+The default is 2.
+.IP "\fB\-F\fR \fIFAT-SIZE\fR" 4
+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\-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
+without such hidden sectors, this option allows you to satisfy them.
+.IP "\fB\-i\fR \fIVOLUME-ID\fR" 4
+Sets the volume ID of the newly created filesystem; \fIVOLUME-ID\fR is a 32-bit
+hexadecimal number (for example, 2e24ec82).
+The default is a number which depends on the filesystem creation time.
+.IP "\fB\-I\fR" 4
+It is typical for fixed disk devices to be partitioned so, by default, you are
+not permitted to create a filesystem across the entire device.
+\fBmkfs.fat\fR will complain and tell you that it refuses to work.
+This is different when using MO disks.
+One doesn't always need partitions on MO disks.
+The filesystem can go directly to the whole disk.
+Under other OSes this is known as the 'superfloppy' format.
+This switch will force \fBmkfs.fat\fR to work properly.
+.IP "\fB\-l\fR \fIFILENAME\fR" 4
+Read the bad blocks list from \fIFILENAME\fR.
+.IP "\fB\-m\fR \fIMESSAGE-FILE\fR" 4
+Sets the message the user receives on attempts to boot this filesystem without
+having properly installed an operating system.
+The message file must not exceed 418 bytes once line feeds have been converted
+to carriage return-line feed combinations, and tabs have been expanded.
+If the filename is a hyphen (-), the text is taken from standard input.
+.IP "\fB\-M\fR \fIFAT-MEDIA-TYPE\fR" 4
+Specify the media type to be stored in the FAT boot sector.
+This value is usually 0xF8 for hard disks and is 0xF0 or a value from 0xF9 to
+0xFF for floppies or partitions to be used for floppy emulation.
+.IP "\fB\-n\fR \fIVOLUME-NAME\fR" 4
+Sets the volume name (label) of the filesystem.
+The volume name can be up to 11 characters long.
+The default is no label.
+.IP "\fB\-r\fR \fIROOT-DIR-ENTRIES\fR" 4
+Select the number of entries available in the root directory.
+The default is 112 or 224 for floppies and 512 for hard disks.
+.IP "\fB\-R\fR \fINUMBER-OF-RESERVED-SECTORS\fR" 4
+Select the number of reserved sectors.
+With FAT32 format at least 2 reserved sectors are needed, the default is 32.
+Otherwise the default is 1 (only the boot sector).
+.IP "\fB\-s\fR \fISECTORS-PER-CLUSTER\fR" 4
+Specify the number of disk sectors per cluster.
+Must be a power of 2, i.e. 1, 2, 4, 8, ... 128.
+.IP "\fB\-S\fR \fILOGICAL-SECTOR-SIZE\fR" 4
+Specify the number of bytes per logical sector.
+Must be a power of 2 and greater than or equal to 512, i.e. 512, 1024, 2048,
+4096, 8192, 16384, or 32768.
+.IP "\fB\-v\fR" 4
+Verbose execution.
+.IP "\fB\-\-invariant\fR" 4
+Use constants for normally randomly generated or time based data such as
+volume ID and creation time.
+Multiple runs of \fBmkfs.fat\fR on the same device create identical results
+with this option.
+Its main purpose is testing \fBmkfs.fat\fR.
+.IP "\fB\-\-help\fR" 4
+Display option summary and exit.
+.\" ----------------------------------------------------------------------------
+.SH BUGS
+\fBmkfs.fat\fR can not create boot-able filesystems.
+This isn't as easy as you might think at first glance for various reasons and
+has been discussed a lot already.
+\fBmkfs.fat\fR simply will not support it ;)
+.\" ----------------------------------------------------------------------------
+.SH SEE ALSO
+\fBfatlabel\fR(8)
+.br
+\fBfsck.fat\fR(8)
+.\" ----------------------------------------------------------------------------
+.SH HOMEPAGE
+The home for the \fBdosfstools\fR project is its
+.UR https://github.com/dosfstools/dosfstools
+GitHub project page
+.UE .
+.\" ----------------------------------------------------------------------------
+.SH AUTHORS
+\fBdosfstools\fR were written by
+.MT werner.almesberger@\:lrc.di.epfl.ch
+Werner Almesberger
+.ME ,
+.MT Roman.Hodek@\:informatik.\:uni-erlangen.de
+Roman Hodek
+.ME ,
+and others.
+The current maintainer is
+.MT aeb@\:debian.org
+Andreas Bombe
+.ME .
diff --git a/dosfstools/manpages/po/de/fatlabel.8.po b/dosfstools/manpages/po/de/fatlabel.8.po
new file mode 100644
index 000000000..a2b6da2e8
--- /dev/null
+++ b/dosfstools/manpages/po/de/fatlabel.8.po
@@ -0,0 +1,173 @@
+# German translations for dosfstools package
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: dosfstools VERSION\n"
+"POT-Creation-Date: 2015-05-16 00:40+0200\n"
+"PO-Revision-Date: 2013-06-06 09:34+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: TH
+#: en/fatlabel.8:22
+#, no-wrap
+msgid "FATLABEL"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "2015-05-16"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "3.0.28"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "dosfstools"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:23 en/fsck.fat.8:23 en/mkfs.fat.8:23
+#, no-wrap
+msgid "NAME"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:26
+msgid "B<fatlabel> - set or get MS-DOS filesystem label"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:26 en/fsck.fat.8:26 en/mkfs.fat.8:26
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:29
+msgid "B<fatlabel> I<DEVICE> [I<LABEL>]"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:29 en/fsck.fat.8:29 en/mkfs.fat.8:29
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:31
+msgid "B<fatlabel> set or gets a MS-DOS filesystem label from a given device."
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:36
+msgid ""
+"If I<LABEL> is omitted, then the label name of the specified device is "
+"written on the standard output. A label can't be longer than 11 bytes."
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:36 en/fsck.fat.8:99 en/mkfs.fat.8:36
+#, no-wrap
+msgid "OPTIONS"
+msgstr ""
+
+#. type: IP
+#: en/fatlabel.8:37
+#, no-wrap
+msgid "B<-h>, B<--help>"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:39
+msgid "Displays a help message."
+msgstr ""
+
+#. type: IP
+#: en/fatlabel.8:39
+#, no-wrap
+msgid "B<-V>, B<--version>"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:42
+msgid "Shows version."
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:42 en/fsck.fat.8:183 en/mkfs.fat.8:155
+#, no-wrap
+msgid "SEE ALSO"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:44 en/mkfs.fat.8:160
+msgid "B<fsck.fat>(8)"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:47 en/fsck.fat.8:188
+msgid "B<mkfs.fat>(8)"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:47 en/fsck.fat.8:188 en/mkfs.fat.8:160
+#, no-wrap
+msgid "HOMEPAGE"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+msgid ""
+"The home for the B<dosfstools> project is its E<.UR https://github.com/"
+"dosfstools/dosfstools> GitHub project page E<.UE .>"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+#, no-wrap
+msgid "AUTHORS"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:55 en/fsck.fat.8:196 en/mkfs.fat.8:168
+msgid "B<dosfstools> were written by"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:57 en/fsck.fat.8:198 en/mkfs.fat.8:170
+msgid "Werner Almesberger"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:60 en/fsck.fat.8:201 en/mkfs.fat.8:173
+msgid "Roman Hodek"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:63 en/fsck.fat.8:204 en/mkfs.fat.8:176
+msgid "and others. The current maintainer is"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:65 en/fsck.fat.8:206 en/mkfs.fat.8:178
+msgid "Andreas Bombe"
+msgstr ""
diff --git a/dosfstools/manpages/po/de/fsck.fat.8.po b/dosfstools/manpages/po/de/fsck.fat.8.po
new file mode 100644
index 000000000..1487e9ff2
--- /dev/null
+++ b/dosfstools/manpages/po/de/fsck.fat.8.po
@@ -0,0 +1,559 @@
+# German translations for dosfstools package
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: dosfstools VERSION\n"
+"POT-Creation-Date: 2015-05-16 00:40+0200\n"
+"PO-Revision-Date: 2013-06-06 09:34+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "2015-05-16"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "3.0.28"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "dosfstools"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:23 en/fsck.fat.8:23 en/mkfs.fat.8:23
+#, no-wrap
+msgid "NAME"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:26 en/fsck.fat.8:26 en/mkfs.fat.8:26
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:29 en/fsck.fat.8:29 en/mkfs.fat.8:29
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:36 en/fsck.fat.8:99 en/mkfs.fat.8:36
+#, no-wrap
+msgid "OPTIONS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:42 en/fsck.fat.8:183 en/mkfs.fat.8:155
+#, no-wrap
+msgid "SEE ALSO"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:47 en/fsck.fat.8:188
+msgid "B<mkfs.fat>(8)"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:47 en/fsck.fat.8:188 en/mkfs.fat.8:160
+#, no-wrap
+msgid "HOMEPAGE"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+msgid ""
+"The home for the B<dosfstools> project is its E<.UR https://github.com/"
+"dosfstools/dosfstools> GitHub project page E<.UE .>"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+#, no-wrap
+msgid "AUTHORS"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:55 en/fsck.fat.8:196 en/mkfs.fat.8:168
+msgid "B<dosfstools> were written by"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:57 en/fsck.fat.8:198 en/mkfs.fat.8:170
+msgid "Werner Almesberger"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:60 en/fsck.fat.8:201 en/mkfs.fat.8:173
+msgid "Roman Hodek"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:63 en/fsck.fat.8:204 en/mkfs.fat.8:176
+msgid "and others. The current maintainer is"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:65 en/fsck.fat.8:206 en/mkfs.fat.8:178
+msgid "Andreas Bombe"
+msgstr ""
+
+#. type: TH
+#: en/fsck.fat.8:22
+#, no-wrap
+msgid "FSCK.FAT"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:26
+msgid "B<fsck.fat> - check and repair MS-DOS filesystems"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:29
+msgid "B<fsck.fat> [I<OPTIONS>] I<DEVICE>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:32
+msgid ""
+"B<fsck.fat> verifies the consistency of MS-DOS filesystems and optionally "
+"tries to repair them."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:34
+msgid "The following filesystem problems can be corrected (in this order):"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:34 en/fsck.fat.8:37 en/fsck.fat.8:40 en/fsck.fat.8:44
+#: en/fsck.fat.8:47 en/fsck.fat.8:50 en/fsck.fat.8:53 en/fsck.fat.8:56
+#: en/fsck.fat.8:59 en/fsck.fat.8:62 en/fsck.fat.8:65 en/fsck.fat.8:68
+#: en/fsck.fat.8:71 en/fsck.fat.8:74 en/fsck.fat.8:77 en/fsck.fat.8:82
+#: en/fsck.fat.8:85 en/fsck.fat.8:90 en/fsck.fat.8:92
+#, no-wrap
+msgid "*"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:37
+msgid "FAT contains invalid cluster numbers. Cluster is changed to EOF."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:40
+msgid "File's cluster chain contains a loop. The loop is broken."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:44
+msgid ""
+"Bad clusters (read errors). The clusters are marked bad and they are "
+"removed from files owning them. This check is optional."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:47
+msgid ""
+"Directories with a large number of bad entries (probably corrupt). The "
+"directory can be deleted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:50
+msgid "Files . and .. are non-directories. They can be deleted or renamed."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:53
+msgid "Directories . and .. in root directory. They are deleted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:56
+msgid "Bad filenames. They can be renamed."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:59
+msgid "Duplicate directory entries. They can be deleted or renamed."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:62
+msgid "Directories with non-zero size field. Size is set to zero."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:65
+msgid ""
+"Directory . does not point to parent directory. The start pointer is "
+"adjusted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:68
+msgid ""
+"Directory .. does not point to parent of parent directory. The start "
+"pointer is adjusted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:71
+msgid "Start cluster number of a file is invalid. The file is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:74
+msgid "File contains bad or free clusters. The file is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:77
+msgid ""
+"File's cluster chain is longer than indicated by the size fields. The file "
+"is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:82
+msgid ""
+"Two or more files share the same cluster(s). All but one of the files are "
+"truncated. If the file being truncated is a directory file that has already "
+"been read, the filesystem check is restarted after truncation."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:85
+msgid ""
+"File's cluster chain is shorter than indicated by the size fields. The file "
+"is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:88
+msgid ""
+"Clusters are marked as used but are not owned by a file. They are marked as "
+"free."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:90
+msgid "Additionally, the following problems are detected, but not repaired:"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:92
+msgid "Invalid parameters in boot sector"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:94
+msgid "Absence of . and .. entries in non-root directories"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:99
+msgid ""
+"When B<fsck.fat> checks a filesystem, it accumulates all changes in memory "
+"and performs them only after all checks are complete. This can be disabled "
+"with the B<-w> option."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:100 en/mkfs.fat.8:37
+#, no-wrap
+msgid "B<-a>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:105
+msgid ""
+"Automatically repair the filesystem. No user intervention is necessary. "
+"Whenever there is more than one method to solve a problem, the least "
+"destructive approach is used."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:105
+#, no-wrap
+msgid "B<-A>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:116
+msgid ""
+"Use Atari variation of the MS-DOS filesystem. This is default if B<fsck."
+"fat> is run on an Atari, then this option turns off Atari format. There are "
+"some minor differences in Atari format: Some boot sector fields are "
+"interpreted slightly different, and the special FAT entries for end-of-file "
+"and bad cluster can be different. Under MS-DOS 0xfff8 is used for EOF and "
+"Atari employs 0xffff by default, but both systems recognize all values from "
+"0xfff8...0xffff as end-of-file. MS-DOS uses only 0xfff7 for bad clusters, "
+"where on Atari values 0xfff0...0xfff7 are for this purpose (but the standard "
+"value is still 0xfff7)."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:116
+#, no-wrap
+msgid "B<-b>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:118
+msgid "Make read-only boot sector check."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:118
+#, no-wrap
+msgid "B<-d> I<PATH>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:122
+msgid ""
+"Delete the specified file. If more than one file with that name exist, the "
+"first one is deleted. This option can be given more than once."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:122
+#, no-wrap
+msgid "B<-f>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:126
+msgid ""
+"Salvage unused cluster chains to files. By default, unused clusters are "
+"added to the free disk space except in auto mode (B<-a>)."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:126
+#, no-wrap
+msgid "B<-l>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:128
+msgid "List path names of files being processed."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:128
+#, no-wrap
+msgid "B<-n>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:131
+msgid ""
+"No-operation mode: non-interactively check for errors, but don't write "
+"anything to the filesystem."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:131
+#, no-wrap
+msgid "B<-p>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:133
+msgid "Same as B<-a>, for compatibility with other *fsck."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:133
+#, no-wrap
+msgid "B<-r>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:139
+msgid ""
+"Interactively repair the filesystem. The user is asked for advice whenever "
+"there is more than one approach to fix an inconsistency. This is the "
+"default mode and the option is only retained for backwards compatibility."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:139
+#, no-wrap
+msgid "B<-t>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:141
+msgid "Mark unreadable clusters as bad."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:141
+#, no-wrap
+msgid "B<-u> I<PATH>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:146
+msgid ""
+"Try to undelete the specified file. B<fsck.fat> tries to allocate a chain "
+"of contiguous unallocated clusters beginning with the start cluster of the "
+"undeleted file. This option can be given more than once."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:146 en/mkfs.fat.8:138
+#, no-wrap
+msgid "B<-v>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:149
+msgid "Verbose mode. Generates slightly more output."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:149
+#, no-wrap
+msgid "B<-V>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:156
+msgid ""
+"Perform a verification pass. The filesystem check is repeated after the "
+"first run. The second pass should never report any fixable errors. It may "
+"take considerably longer than the first pass, because the first pass may "
+"have generated long list of modifications that have to be scanned for each "
+"disk read."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:156
+#, no-wrap
+msgid "B<-w>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:158
+msgid "Write changes to disk immediately."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:158
+#, no-wrap
+msgid "B<-y>"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:162
+msgid ""
+"Same as B<-a> (automatically repair filesystem) for compatibility with other "
+"fsck tools."
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:162
+#, no-wrap
+msgid "EXIT STATUS"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:163
+#, no-wrap
+msgid "0"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:165
+msgid "No recoverable errors have been detected."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:165
+#, no-wrap
+msgid "1"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:168
+msgid ""
+"Recoverable errors have been detected or B<fsck.fat> has discovered an "
+"internal inconsistency."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:168
+#, no-wrap
+msgid "2"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:172
+msgid "Usage error. B<fsck.fat> did not access the filesystem."
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:172
+#, no-wrap
+msgid "FILES"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:173
+#, no-wrap
+msgid "fsck0000.rec, fsck0001.rec, ..."
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:177
+msgid ""
+"When recovering from a corrupted filesystem, B<fsck.fat> dumps recovered "
+"data into files named 'fsckNNNN.rec' in the top level directory of the "
+"filesystem."
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:177 en/mkfs.fat.8:149
+#, no-wrap
+msgid "BUGS"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:183
+msgid ""
+"Does not create . and .. files where necessary. Does not remove entirely "
+"empty directories. Should give more diagnostic messages. Undeleting files "
+"should use a more sophisticated algorithm."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:185 en/mkfs.fat.8:157
+msgid "B<fatlabel>(8)"
+msgstr ""
diff --git a/dosfstools/manpages/po/de/mkfs.fat.8.po b/dosfstools/manpages/po/de/mkfs.fat.8.po
new file mode 100644
index 000000000..3344f71a1
--- /dev/null
+++ b/dosfstools/manpages/po/de/mkfs.fat.8.po
@@ -0,0 +1,481 @@
+# German translations for dosfstools package
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: dosfstools VERSION\n"
+"POT-Creation-Date: 2015-05-16 00:40+0200\n"
+"PO-Revision-Date: 2013-06-06 09:34+0300\n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "2015-05-16"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "3.0.28"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "dosfstools"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:23 en/fsck.fat.8:23 en/mkfs.fat.8:23
+#, no-wrap
+msgid "NAME"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:26 en/fsck.fat.8:26 en/mkfs.fat.8:26
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:29 en/fsck.fat.8:29 en/mkfs.fat.8:29
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:36 en/fsck.fat.8:99 en/mkfs.fat.8:36
+#, no-wrap
+msgid "OPTIONS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:42 en/fsck.fat.8:183 en/mkfs.fat.8:155
+#, no-wrap
+msgid "SEE ALSO"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:44 en/mkfs.fat.8:160
+msgid "B<fsck.fat>(8)"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:47 en/fsck.fat.8:188 en/mkfs.fat.8:160
+#, no-wrap
+msgid "HOMEPAGE"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+msgid ""
+"The home for the B<dosfstools> project is its E<.UR https://github.com/"
+"dosfstools/dosfstools> GitHub project page E<.UE .>"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+#, no-wrap
+msgid "AUTHORS"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:55 en/fsck.fat.8:196 en/mkfs.fat.8:168
+msgid "B<dosfstools> were written by"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:57 en/fsck.fat.8:198 en/mkfs.fat.8:170
+msgid "Werner Almesberger"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:60 en/fsck.fat.8:201 en/mkfs.fat.8:173
+msgid "Roman Hodek"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:63 en/fsck.fat.8:204 en/mkfs.fat.8:176
+msgid "and others. The current maintainer is"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:65 en/fsck.fat.8:206 en/mkfs.fat.8:178
+msgid "Andreas Bombe"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:100 en/mkfs.fat.8:37
+#, no-wrap
+msgid "B<-a>"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:146 en/mkfs.fat.8:138
+#, no-wrap
+msgid "B<-v>"
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:177 en/mkfs.fat.8:149
+#, no-wrap
+msgid "BUGS"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:185 en/mkfs.fat.8:157
+msgid "B<fatlabel>(8)"
+msgstr ""
+
+#. type: TH
+#: en/mkfs.fat.8:22
+#, no-wrap
+msgid "MKFS.FAT"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:26
+msgid "B<mkfs.fat> - create an MS-DOS filesystem under Linux"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:29
+msgid "B<mkfs.fat> [I<OPTIONS>] I<DEVICE> [I<BLOCK-COUNT>]"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:36
+msgid ""
+"B<mkfs.fat> is used to create an MS-DOS filesystem under Linux on a device "
+"(usually a disk partition). I<DEVICE> is the special file corresponding to "
+"the device (e.g. /dev/sdXX). I<BLOCK-COUNT> is the number of blocks on the "
+"device. If omitted, B<mkfs.fat> automatically determines the filesystem "
+"size."
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:45
+msgid ""
+"Normally, for any filesystem except very small ones, B<mkfs.fat> will align "
+"all the data structures to cluster size, to make sure that as long as the "
+"partition is properly aligned, so will all the data structures in the "
+"filesystem. This option disables alignment; this may provide a handful of "
+"additional clusters of storage at the expense of a significant performance "
+"degradation on RAIDs, flash media or large-sector hard disks."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:45
+#, no-wrap
+msgid "B< -A>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:60
+msgid ""
+"Use Atari variation of the MS-DOS filesystem. This is default if B<mkfs."
+"fat> is run on an Atari, then this option turns off Atari format. There are "
+"some differences when using Atari format: If not directed otherwise by the "
+"user, B<mkfs.fat> will always use 2 sectors per cluster, since GEMDOS "
+"doesn't like other values very much. It will also obey the maximum number "
+"of sectors GEMDOS can handle. Larger filesystems are managed by raising the "
+"logical sector size. Under Atari format, an Atari-compatible serial number "
+"for the filesystem is generated, and a 12 bit FAT is used only for "
+"filesystems that have one of the usual floppy sizes (720k, 1.2M, 1.44M, "
+"2.88M), a 16 bit FAT otherwise. This can be overridden with the B<-F> "
+"option. Some PC-specific boot sector fields aren't written, and a boot "
+"message (option B<-m>) is ignored."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:60
+#, no-wrap
+msgid "B<-b> I<SECTOR-OF-BACKUP>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:64
+msgid ""
+"Selects the location of the backup boot sector for FAT32. Default depends "
+"on number of reserved sectors, but usually is sector 6. The backup must be "
+"within the range of reserved sectors."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:64
+#, no-wrap
+msgid "B<-c>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:66
+msgid "Check the device for bad blocks before creating the filesystem."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:66
+#, no-wrap
+msgid "B<-C>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:80
+msgid ""
+"Create the file given as I<DEVICE> on the command line, and write the to-be-"
+"created filesystem to it. This can be used to create the new filesystem in "
+"a file instead of on a real device, and to avoid using B<dd> in advance to "
+"create a file of appropriate size. With this option, the I<BLOCK-COUNT> "
+"must be given, because otherwise the intended size of the filesystem "
+"wouldn't be known. The file created is a sparse file, which actually only "
+"contains the meta-data areas (boot sector, FATs, and root directory). The "
+"data portions won't be stored on the disk, but the file nevertheless will "
+"have the correct size. The resulting file can be copied later to a floppy "
+"disk or other device, or mounted through a loop device."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:80
+#, no-wrap
+msgid "B<-D> I<DRIVE-NUMBER>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:84
+msgid ""
+"Specify the BIOS drive number to be stored in the FAT boot sector. This "
+"value is usually 0x80 for hard disks and 0x00 for floppy devices or "
+"partitions to be used for floppy emulation."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:84
+#, no-wrap
+msgid "B<-f> I<NUMBER-OF-FATS>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:87
+msgid ""
+"Specify the number of file allocation tables in the filesystem. The default "
+"is 2."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:87
+#, no-wrap
+msgid "B<-F> I<FAT-SIZE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:91
+msgid ""
+"Specifies the type of file allocation tables used (12, 16 or 32 bit). If "
+"nothing is specified, B<mkfs.fat> will automatically select between 12, 16 "
+"and 32 bit, whatever fits better for the filesystem size."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:91
+#, no-wrap
+msgid "B<-h> I<NUMBER-OF-HIDDEN-SECTORS>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:95
+msgid ""
+"Select the number of hidden sectors in the volume. Apparently some digital "
+"cameras get indigestion if you feed them a CF card without such hidden "
+"sectors, this option allows you to satisfy them."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:95
+#, no-wrap
+msgid "B<-i> I<VOLUME-ID>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:99
+msgid ""
+"Sets the volume ID of the newly created filesystem; I<VOLUME-ID> is a 32-bit "
+"hexadecimal number (for example, 2e24ec82). The default is a number which "
+"depends on the filesystem creation time."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:99
+#, no-wrap
+msgid "B<-I>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:108
+msgid ""
+"It is typical for fixed disk devices to be partitioned so, by default, you "
+"are not permitted to create a filesystem across the entire device. B<mkfs."
+"fat> will complain and tell you that it refuses to work. This is different "
+"when using MO disks. One doesn't always need partitions on MO disks. The "
+"filesystem can go directly to the whole disk. Under other OSes this is "
+"known as the 'superfloppy' format. This switch will force B<mkfs.fat> to "
+"work properly."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:108
+#, no-wrap
+msgid "B<-l> I<FILENAME>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:110
+msgid "Read the bad blocks list from I<FILENAME>."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:110
+#, no-wrap
+msgid "B<-m> I<MESSAGE-FILE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:116
+msgid ""
+"Sets the message the user receives on attempts to boot this filesystem "
+"without having properly installed an operating system. The message file "
+"must not exceed 418 bytes once line feeds have been converted to carriage "
+"return-line feed combinations, and tabs have been expanded. If the filename "
+"is a hyphen (-), the text is taken from standard input."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:116
+#, no-wrap
+msgid "B<-M> I<FAT-MEDIA-TYPE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:120
+msgid ""
+"Specify the media type to be stored in the FAT boot sector. This value is "
+"usually 0xF8 for hard disks and is 0xF0 or a value from 0xF9 to 0xFF for "
+"floppies or partitions to be used for floppy emulation."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:120
+#, no-wrap
+msgid "B<-n> I<VOLUME-NAME>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:124
+msgid ""
+"Sets the volume name (label) of the filesystem. The volume name can be up "
+"to 11 characters long. The default is no label."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:124
+#, no-wrap
+msgid "B<-r> I<ROOT-DIR-ENTRIES>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:127
+msgid ""
+"Select the number of entries available in the root directory. The default "
+"is 112 or 224 for floppies and 512 for hard disks."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:127
+#, no-wrap
+msgid "B<-R> I<NUMBER-OF-RESERVED-SECTORS>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:131
+msgid ""
+"Select the number of reserved sectors. With FAT32 format at least 2 "
+"reserved sectors are needed, the default is 32. Otherwise the default is 1 "
+"(only the boot sector)."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:131
+#, no-wrap
+msgid "B<-s> I<SECTORS-PER-CLUSTER>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:134
+msgid ""
+"Specify the number of disk sectors per cluster. Must be a power of 2, i.e. "
+"1, 2, 4, 8, ... 128."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:134
+#, no-wrap
+msgid "B<-S> I<LOGICAL-SECTOR-SIZE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:138
+msgid ""
+"Specify the number of bytes per logical sector. Must be a power of 2 and "
+"greater than or equal to 512, i.e. 512, 1024, 2048, 4096, 8192, 16384, or "
+"32768."
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:140
+msgid "Verbose execution."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:140
+#, no-wrap
+msgid "B<--invariant>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:146
+msgid ""
+"Use constants for normally randomly generated or time based data such as "
+"volume ID and creation time. Multiple runs of B<mkfs.fat> on the same "
+"device create identical results with this option. Its main purpose is "
+"testing B<mkfs.fat>."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:146
+#, no-wrap
+msgid "B<--help>"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:149
+msgid "Display option summary and exit."
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:155
+msgid ""
+"B<mkfs.fat> can not create boot-able filesystems. This isn't as easy as you "
+"might think at first glance for various reasons and has been discussed a lot "
+"already. B<mkfs.fat> simply will not support it ;)"
+msgstr ""
diff --git a/dosfstools/manpages/po4a.cfg b/dosfstools/manpages/po4a.cfg
new file mode 100644
index 000000000..5d16f636c
--- /dev/null
+++ b/dosfstools/manpages/po4a.cfg
@@ -0,0 +1,5 @@
+[po4a_langs] de
+[po4a_paths] pot/$master.pot $lang:po/$lang/$master.po
+[type: man] en/fatlabel.8 $lang:$lang/fatlabel.$lang.8
+[type: man] en/fsck.fat.8 $lang:$lang/fsck.fat.$lang.8
+[type: man] en/mkfs.fat.8 $lang:$lang/mkfs.fat.$lang.8
diff --git a/dosfstools/manpages/pot/fatlabel.8.pot b/dosfstools/manpages/pot/fatlabel.8.pot
new file mode 100644
index 000000000..2eafa05eb
--- /dev/null
+++ b/dosfstools/manpages/pot/fatlabel.8.pot
@@ -0,0 +1,176 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the dosfstools package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: dosfstools VERSION\n"
+"POT-Creation-Date: 2015-05-16 00:40+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: TH
+#: en/fatlabel.8:22
+#, no-wrap
+msgid "FATLABEL"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "2015-05-16"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "3.0.28"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "dosfstools"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:23 en/fsck.fat.8:23 en/mkfs.fat.8:23
+#, no-wrap
+msgid "NAME"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:26
+msgid "B<fatlabel> - set or get MS-DOS filesystem label"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:26 en/fsck.fat.8:26 en/mkfs.fat.8:26
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:29
+msgid "B<fatlabel> I<DEVICE> [I<LABEL>]"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:29 en/fsck.fat.8:29 en/mkfs.fat.8:29
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:31
+msgid "B<fatlabel> set or gets a MS-DOS filesystem label from a given device."
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:36
+msgid ""
+"If I<LABEL> is omitted, then the label name of the specified device is "
+"written on the standard output. A label can't be longer than 11 bytes."
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:36 en/fsck.fat.8:99 en/mkfs.fat.8:36
+#, no-wrap
+msgid "OPTIONS"
+msgstr ""
+
+#. type: IP
+#: en/fatlabel.8:37
+#, no-wrap
+msgid "B<-h>, B<--help>"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:39
+msgid "Displays a help message."
+msgstr ""
+
+#. type: IP
+#: en/fatlabel.8:39
+#, no-wrap
+msgid "B<-V>, B<--version>"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:42
+msgid "Shows version."
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:42 en/fsck.fat.8:183 en/mkfs.fat.8:155
+#, no-wrap
+msgid "SEE ALSO"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:44 en/mkfs.fat.8:160
+msgid "B<fsck.fat>(8)"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:47 en/fsck.fat.8:188
+msgid "B<mkfs.fat>(8)"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:47 en/fsck.fat.8:188 en/mkfs.fat.8:160
+#, no-wrap
+msgid "HOMEPAGE"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+msgid ""
+"The home for the B<dosfstools> project is its E<.UR https://github.com/"
+"dosfstools/dosfstools> GitHub project page E<.UE .>"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+#, no-wrap
+msgid "AUTHORS"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:55 en/fsck.fat.8:196 en/mkfs.fat.8:168
+msgid "B<dosfstools> were written by"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:57 en/fsck.fat.8:198 en/mkfs.fat.8:170
+msgid "Werner Almesberger"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:60 en/fsck.fat.8:201 en/mkfs.fat.8:173
+msgid "Roman Hodek"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:63 en/fsck.fat.8:204 en/mkfs.fat.8:176
+msgid "and others. The current maintainer is"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:65 en/fsck.fat.8:206 en/mkfs.fat.8:178
+msgid "Andreas Bombe"
+msgstr ""
diff --git a/dosfstools/manpages/pot/fsck.fat.8.pot b/dosfstools/manpages/pot/fsck.fat.8.pot
new file mode 100644
index 000000000..65ef52a66
--- /dev/null
+++ b/dosfstools/manpages/pot/fsck.fat.8.pot
@@ -0,0 +1,562 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the dosfstools package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: dosfstools VERSION\n"
+"POT-Creation-Date: 2015-05-16 00:40+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "2015-05-16"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "3.0.28"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "dosfstools"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:23 en/fsck.fat.8:23 en/mkfs.fat.8:23
+#, no-wrap
+msgid "NAME"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:26 en/fsck.fat.8:26 en/mkfs.fat.8:26
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:29 en/fsck.fat.8:29 en/mkfs.fat.8:29
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:36 en/fsck.fat.8:99 en/mkfs.fat.8:36
+#, no-wrap
+msgid "OPTIONS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:42 en/fsck.fat.8:183 en/mkfs.fat.8:155
+#, no-wrap
+msgid "SEE ALSO"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:47 en/fsck.fat.8:188
+msgid "B<mkfs.fat>(8)"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:47 en/fsck.fat.8:188 en/mkfs.fat.8:160
+#, no-wrap
+msgid "HOMEPAGE"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+msgid ""
+"The home for the B<dosfstools> project is its E<.UR https://github.com/"
+"dosfstools/dosfstools> GitHub project page E<.UE .>"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+#, no-wrap
+msgid "AUTHORS"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:55 en/fsck.fat.8:196 en/mkfs.fat.8:168
+msgid "B<dosfstools> were written by"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:57 en/fsck.fat.8:198 en/mkfs.fat.8:170
+msgid "Werner Almesberger"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:60 en/fsck.fat.8:201 en/mkfs.fat.8:173
+msgid "Roman Hodek"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:63 en/fsck.fat.8:204 en/mkfs.fat.8:176
+msgid "and others. The current maintainer is"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:65 en/fsck.fat.8:206 en/mkfs.fat.8:178
+msgid "Andreas Bombe"
+msgstr ""
+
+#. type: TH
+#: en/fsck.fat.8:22
+#, no-wrap
+msgid "FSCK.FAT"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:26
+msgid "B<fsck.fat> - check and repair MS-DOS filesystems"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:29
+msgid "B<fsck.fat> [I<OPTIONS>] I<DEVICE>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:32
+msgid ""
+"B<fsck.fat> verifies the consistency of MS-DOS filesystems and optionally "
+"tries to repair them."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:34
+msgid "The following filesystem problems can be corrected (in this order):"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:34 en/fsck.fat.8:37 en/fsck.fat.8:40 en/fsck.fat.8:44
+#: en/fsck.fat.8:47 en/fsck.fat.8:50 en/fsck.fat.8:53 en/fsck.fat.8:56
+#: en/fsck.fat.8:59 en/fsck.fat.8:62 en/fsck.fat.8:65 en/fsck.fat.8:68
+#: en/fsck.fat.8:71 en/fsck.fat.8:74 en/fsck.fat.8:77 en/fsck.fat.8:82
+#: en/fsck.fat.8:85 en/fsck.fat.8:90 en/fsck.fat.8:92
+#, no-wrap
+msgid "*"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:37
+msgid "FAT contains invalid cluster numbers. Cluster is changed to EOF."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:40
+msgid "File's cluster chain contains a loop. The loop is broken."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:44
+msgid ""
+"Bad clusters (read errors). The clusters are marked bad and they are "
+"removed from files owning them. This check is optional."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:47
+msgid ""
+"Directories with a large number of bad entries (probably corrupt). The "
+"directory can be deleted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:50
+msgid "Files . and .. are non-directories. They can be deleted or renamed."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:53
+msgid "Directories . and .. in root directory. They are deleted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:56
+msgid "Bad filenames. They can be renamed."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:59
+msgid "Duplicate directory entries. They can be deleted or renamed."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:62
+msgid "Directories with non-zero size field. Size is set to zero."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:65
+msgid ""
+"Directory . does not point to parent directory. The start pointer is "
+"adjusted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:68
+msgid ""
+"Directory .. does not point to parent of parent directory. The start "
+"pointer is adjusted."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:71
+msgid "Start cluster number of a file is invalid. The file is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:74
+msgid "File contains bad or free clusters. The file is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:77
+msgid ""
+"File's cluster chain is longer than indicated by the size fields. The file "
+"is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:82
+msgid ""
+"Two or more files share the same cluster(s). All but one of the files are "
+"truncated. If the file being truncated is a directory file that has already "
+"been read, the filesystem check is restarted after truncation."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:85
+msgid ""
+"File's cluster chain is shorter than indicated by the size fields. The file "
+"is truncated."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:88
+msgid ""
+"Clusters are marked as used but are not owned by a file. They are marked as "
+"free."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:90
+msgid "Additionally, the following problems are detected, but not repaired:"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:92
+msgid "Invalid parameters in boot sector"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:94
+msgid "Absence of . and .. entries in non-root directories"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:99
+msgid ""
+"When B<fsck.fat> checks a filesystem, it accumulates all changes in memory "
+"and performs them only after all checks are complete. This can be disabled "
+"with the B<-w> option."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:100 en/mkfs.fat.8:37
+#, no-wrap
+msgid "B<-a>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:105
+msgid ""
+"Automatically repair the filesystem. No user intervention is necessary. "
+"Whenever there is more than one method to solve a problem, the least "
+"destructive approach is used."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:105
+#, no-wrap
+msgid "B<-A>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:116
+msgid ""
+"Use Atari variation of the MS-DOS filesystem. This is default if B<fsck."
+"fat> is run on an Atari, then this option turns off Atari format. There are "
+"some minor differences in Atari format: Some boot sector fields are "
+"interpreted slightly different, and the special FAT entries for end-of-file "
+"and bad cluster can be different. Under MS-DOS 0xfff8 is used for EOF and "
+"Atari employs 0xffff by default, but both systems recognize all values from "
+"0xfff8...0xffff as end-of-file. MS-DOS uses only 0xfff7 for bad clusters, "
+"where on Atari values 0xfff0...0xfff7 are for this purpose (but the standard "
+"value is still 0xfff7)."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:116
+#, no-wrap
+msgid "B<-b>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:118
+msgid "Make read-only boot sector check."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:118
+#, no-wrap
+msgid "B<-d> I<PATH>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:122
+msgid ""
+"Delete the specified file. If more than one file with that name exist, the "
+"first one is deleted. This option can be given more than once."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:122
+#, no-wrap
+msgid "B<-f>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:126
+msgid ""
+"Salvage unused cluster chains to files. By default, unused clusters are "
+"added to the free disk space except in auto mode (B<-a>)."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:126
+#, no-wrap
+msgid "B<-l>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:128
+msgid "List path names of files being processed."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:128
+#, no-wrap
+msgid "B<-n>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:131
+msgid ""
+"No-operation mode: non-interactively check for errors, but don't write "
+"anything to the filesystem."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:131
+#, no-wrap
+msgid "B<-p>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:133
+msgid "Same as B<-a>, for compatibility with other *fsck."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:133
+#, no-wrap
+msgid "B<-r>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:139
+msgid ""
+"Interactively repair the filesystem. The user is asked for advice whenever "
+"there is more than one approach to fix an inconsistency. This is the "
+"default mode and the option is only retained for backwards compatibility."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:139
+#, no-wrap
+msgid "B<-t>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:141
+msgid "Mark unreadable clusters as bad."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:141
+#, no-wrap
+msgid "B<-u> I<PATH>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:146
+msgid ""
+"Try to undelete the specified file. B<fsck.fat> tries to allocate a chain "
+"of contiguous unallocated clusters beginning with the start cluster of the "
+"undeleted file. This option can be given more than once."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:146 en/mkfs.fat.8:138
+#, no-wrap
+msgid "B<-v>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:149
+msgid "Verbose mode. Generates slightly more output."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:149
+#, no-wrap
+msgid "B<-V>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:156
+msgid ""
+"Perform a verification pass. The filesystem check is repeated after the "
+"first run. The second pass should never report any fixable errors. It may "
+"take considerably longer than the first pass, because the first pass may "
+"have generated long list of modifications that have to be scanned for each "
+"disk read."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:156
+#, no-wrap
+msgid "B<-w>"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:158
+msgid "Write changes to disk immediately."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:158
+#, no-wrap
+msgid "B<-y>"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:162
+msgid ""
+"Same as B<-a> (automatically repair filesystem) for compatibility with other "
+"fsck tools."
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:162
+#, no-wrap
+msgid "EXIT STATUS"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:163
+#, no-wrap
+msgid "0"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:165
+msgid "No recoverable errors have been detected."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:165
+#, no-wrap
+msgid "1"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:168
+msgid ""
+"Recoverable errors have been detected or B<fsck.fat> has discovered an "
+"internal inconsistency."
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:168
+#, no-wrap
+msgid "2"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:172
+msgid "Usage error. B<fsck.fat> did not access the filesystem."
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:172
+#, no-wrap
+msgid "FILES"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:173
+#, no-wrap
+msgid "fsck0000.rec, fsck0001.rec, ..."
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:177
+msgid ""
+"When recovering from a corrupted filesystem, B<fsck.fat> dumps recovered "
+"data into files named 'fsckNNNN.rec' in the top level directory of the "
+"filesystem."
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:177 en/mkfs.fat.8:149
+#, no-wrap
+msgid "BUGS"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fsck.fat.8:183
+msgid ""
+"Does not create . and .. files where necessary. Does not remove entirely "
+"empty directories. Should give more diagnostic messages. Undeleting files "
+"should use a more sophisticated algorithm."
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:185 en/mkfs.fat.8:157
+msgid "B<fatlabel>(8)"
+msgstr ""
diff --git a/dosfstools/manpages/pot/mkfs.fat.8.pot b/dosfstools/manpages/pot/mkfs.fat.8.pot
new file mode 100644
index 000000000..c9d5bba96
--- /dev/null
+++ b/dosfstools/manpages/pot/mkfs.fat.8.pot
@@ -0,0 +1,484 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# This file is distributed under the same license as the dosfstools package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: dosfstools VERSION\n"
+"POT-Creation-Date: 2015-05-16 00:40+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "2015-05-16"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "3.0.28"
+msgstr ""
+
+#. type: TH
+#: en/fatlabel.8:22 en/fsck.fat.8:22 en/mkfs.fat.8:22
+#, no-wrap
+msgid "dosfstools"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:23 en/fsck.fat.8:23 en/mkfs.fat.8:23
+#, no-wrap
+msgid "NAME"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:26 en/fsck.fat.8:26 en/mkfs.fat.8:26
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:29 en/fsck.fat.8:29 en/mkfs.fat.8:29
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:36 en/fsck.fat.8:99 en/mkfs.fat.8:36
+#, no-wrap
+msgid "OPTIONS"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:42 en/fsck.fat.8:183 en/mkfs.fat.8:155
+#, no-wrap
+msgid "SEE ALSO"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:44 en/mkfs.fat.8:160
+msgid "B<fsck.fat>(8)"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:47 en/fsck.fat.8:188 en/mkfs.fat.8:160
+#, no-wrap
+msgid "HOMEPAGE"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+msgid ""
+"The home for the B<dosfstools> project is its E<.UR https://github.com/"
+"dosfstools/dosfstools> GitHub project page E<.UE .>"
+msgstr ""
+
+#. type: SH
+#: en/fatlabel.8:53 en/fsck.fat.8:194 en/mkfs.fat.8:166
+#, no-wrap
+msgid "AUTHORS"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:55 en/fsck.fat.8:196 en/mkfs.fat.8:168
+msgid "B<dosfstools> were written by"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:57 en/fsck.fat.8:198 en/mkfs.fat.8:170
+msgid "Werner Almesberger"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:60 en/fsck.fat.8:201 en/mkfs.fat.8:173
+msgid "Roman Hodek"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:63 en/fsck.fat.8:204 en/mkfs.fat.8:176
+msgid "and others. The current maintainer is"
+msgstr ""
+
+#. type: Plain text
+#: en/fatlabel.8:65 en/fsck.fat.8:206 en/mkfs.fat.8:178
+msgid "Andreas Bombe"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:100 en/mkfs.fat.8:37
+#, no-wrap
+msgid "B<-a>"
+msgstr ""
+
+#. type: IP
+#: en/fsck.fat.8:146 en/mkfs.fat.8:138
+#, no-wrap
+msgid "B<-v>"
+msgstr ""
+
+#. type: SH
+#: en/fsck.fat.8:177 en/mkfs.fat.8:149
+#, no-wrap
+msgid "BUGS"
+msgstr ""
+
+#. type: Plain text
+#: en/fsck.fat.8:185 en/mkfs.fat.8:157
+msgid "B<fatlabel>(8)"
+msgstr ""
+
+#. type: TH
+#: en/mkfs.fat.8:22
+#, no-wrap
+msgid "MKFS.FAT"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:26
+msgid "B<mkfs.fat> - create an MS-DOS filesystem under Linux"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:29
+msgid "B<mkfs.fat> [I<OPTIONS>] I<DEVICE> [I<BLOCK-COUNT>]"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:36
+msgid ""
+"B<mkfs.fat> is used to create an MS-DOS filesystem under Linux on a device "
+"(usually a disk partition). I<DEVICE> is the special file corresponding to "
+"the device (e.g. /dev/sdXX). I<BLOCK-COUNT> is the number of blocks on the "
+"device. If omitted, B<mkfs.fat> automatically determines the filesystem "
+"size."
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:45
+msgid ""
+"Normally, for any filesystem except very small ones, B<mkfs.fat> will align "
+"all the data structures to cluster size, to make sure that as long as the "
+"partition is properly aligned, so will all the data structures in the "
+"filesystem. This option disables alignment; this may provide a handful of "
+"additional clusters of storage at the expense of a significant performance "
+"degradation on RAIDs, flash media or large-sector hard disks."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:45
+#, no-wrap
+msgid "B< -A>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:60
+msgid ""
+"Use Atari variation of the MS-DOS filesystem. This is default if B<mkfs."
+"fat> is run on an Atari, then this option turns off Atari format. There are "
+"some differences when using Atari format: If not directed otherwise by the "
+"user, B<mkfs.fat> will always use 2 sectors per cluster, since GEMDOS "
+"doesn't like other values very much. It will also obey the maximum number "
+"of sectors GEMDOS can handle. Larger filesystems are managed by raising the "
+"logical sector size. Under Atari format, an Atari-compatible serial number "
+"for the filesystem is generated, and a 12 bit FAT is used only for "
+"filesystems that have one of the usual floppy sizes (720k, 1.2M, 1.44M, "
+"2.88M), a 16 bit FAT otherwise. This can be overridden with the B<-F> "
+"option. Some PC-specific boot sector fields aren't written, and a boot "
+"message (option B<-m>) is ignored."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:60
+#, no-wrap
+msgid "B<-b> I<SECTOR-OF-BACKUP>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:64
+msgid ""
+"Selects the location of the backup boot sector for FAT32. Default depends "
+"on number of reserved sectors, but usually is sector 6. The backup must be "
+"within the range of reserved sectors."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:64
+#, no-wrap
+msgid "B<-c>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:66
+msgid "Check the device for bad blocks before creating the filesystem."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:66
+#, no-wrap
+msgid "B<-C>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:80
+msgid ""
+"Create the file given as I<DEVICE> on the command line, and write the to-be-"
+"created filesystem to it. This can be used to create the new filesystem in "
+"a file instead of on a real device, and to avoid using B<dd> in advance to "
+"create a file of appropriate size. With this option, the I<BLOCK-COUNT> "
+"must be given, because otherwise the intended size of the filesystem "
+"wouldn't be known. The file created is a sparse file, which actually only "
+"contains the meta-data areas (boot sector, FATs, and root directory). The "
+"data portions won't be stored on the disk, but the file nevertheless will "
+"have the correct size. The resulting file can be copied later to a floppy "
+"disk or other device, or mounted through a loop device."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:80
+#, no-wrap
+msgid "B<-D> I<DRIVE-NUMBER>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:84
+msgid ""
+"Specify the BIOS drive number to be stored in the FAT boot sector. This "
+"value is usually 0x80 for hard disks and 0x00 for floppy devices or "
+"partitions to be used for floppy emulation."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:84
+#, no-wrap
+msgid "B<-f> I<NUMBER-OF-FATS>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:87
+msgid ""
+"Specify the number of file allocation tables in the filesystem. The default "
+"is 2."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:87
+#, no-wrap
+msgid "B<-F> I<FAT-SIZE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:91
+msgid ""
+"Specifies the type of file allocation tables used (12, 16 or 32 bit). If "
+"nothing is specified, B<mkfs.fat> will automatically select between 12, 16 "
+"and 32 bit, whatever fits better for the filesystem size."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:91
+#, no-wrap
+msgid "B<-h> I<NUMBER-OF-HIDDEN-SECTORS>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:95
+msgid ""
+"Select the number of hidden sectors in the volume. Apparently some digital "
+"cameras get indigestion if you feed them a CF card without such hidden "
+"sectors, this option allows you to satisfy them."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:95
+#, no-wrap
+msgid "B<-i> I<VOLUME-ID>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:99
+msgid ""
+"Sets the volume ID of the newly created filesystem; I<VOLUME-ID> is a 32-bit "
+"hexadecimal number (for example, 2e24ec82). The default is a number which "
+"depends on the filesystem creation time."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:99
+#, no-wrap
+msgid "B<-I>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:108
+msgid ""
+"It is typical for fixed disk devices to be partitioned so, by default, you "
+"are not permitted to create a filesystem across the entire device. B<mkfs."
+"fat> will complain and tell you that it refuses to work. This is different "
+"when using MO disks. One doesn't always need partitions on MO disks. The "
+"filesystem can go directly to the whole disk. Under other OSes this is "
+"known as the 'superfloppy' format. This switch will force B<mkfs.fat> to "
+"work properly."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:108
+#, no-wrap
+msgid "B<-l> I<FILENAME>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:110
+msgid "Read the bad blocks list from I<FILENAME>."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:110
+#, no-wrap
+msgid "B<-m> I<MESSAGE-FILE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:116
+msgid ""
+"Sets the message the user receives on attempts to boot this filesystem "
+"without having properly installed an operating system. The message file "
+"must not exceed 418 bytes once line feeds have been converted to carriage "
+"return-line feed combinations, and tabs have been expanded. If the filename "
+"is a hyphen (-), the text is taken from standard input."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:116
+#, no-wrap
+msgid "B<-M> I<FAT-MEDIA-TYPE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:120
+msgid ""
+"Specify the media type to be stored in the FAT boot sector. This value is "
+"usually 0xF8 for hard disks and is 0xF0 or a value from 0xF9 to 0xFF for "
+"floppies or partitions to be used for floppy emulation."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:120
+#, no-wrap
+msgid "B<-n> I<VOLUME-NAME>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:124
+msgid ""
+"Sets the volume name (label) of the filesystem. The volume name can be up "
+"to 11 characters long. The default is no label."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:124
+#, no-wrap
+msgid "B<-r> I<ROOT-DIR-ENTRIES>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:127
+msgid ""
+"Select the number of entries available in the root directory. The default "
+"is 112 or 224 for floppies and 512 for hard disks."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:127
+#, no-wrap
+msgid "B<-R> I<NUMBER-OF-RESERVED-SECTORS>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:131
+msgid ""
+"Select the number of reserved sectors. With FAT32 format at least 2 "
+"reserved sectors are needed, the default is 32. Otherwise the default is 1 "
+"(only the boot sector)."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:131
+#, no-wrap
+msgid "B<-s> I<SECTORS-PER-CLUSTER>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:134
+msgid ""
+"Specify the number of disk sectors per cluster. Must be a power of 2, i.e. "
+"1, 2, 4, 8, ... 128."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:134
+#, no-wrap
+msgid "B<-S> I<LOGICAL-SECTOR-SIZE>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:138
+msgid ""
+"Specify the number of bytes per logical sector. Must be a power of 2 and "
+"greater than or equal to 512, i.e. 512, 1024, 2048, 4096, 8192, 16384, or "
+"32768."
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:140
+msgid "Verbose execution."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:140
+#, no-wrap
+msgid "B<--invariant>"
+msgstr ""
+
+#. type: Plain text
+#: en/mkfs.fat.8:146
+msgid ""
+"Use constants for normally randomly generated or time based data such as "
+"volume ID and creation time. Multiple runs of B<mkfs.fat> on the same "
+"device create identical results with this option. Its main purpose is "
+"testing B<mkfs.fat>."
+msgstr ""
+
+#. type: IP
+#: en/mkfs.fat.8:146
+#, no-wrap
+msgid "B<--help>"
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:149
+msgid "Display option summary and exit."
+msgstr ""
+
+#. ----------------------------------------------------------------------------
+#. type: Plain text
+#: en/mkfs.fat.8:155
+msgid ""
+"B<mkfs.fat> can not create boot-able filesystems. This isn't as easy as you "
+"might think at first glance for various reasons and has been discussed a lot "
+"already. B<mkfs.fat> simply will not support it ;)"
+msgstr ""
diff --git a/dosfstools/src/boot.c b/dosfstools/src/boot.c
index bbaee0471..0c0918f8b 100644
--- a/dosfstools/src/boot.c
+++ b/dosfstools/src/boot.c
@@ -2,6 +2,7 @@
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -24,16 +25,17 @@
* by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
#include <stdio.h>
+#include <stdint.h>
#include <string.h>
-#include <sys/types.h>
#include <stdlib.h>
#include <time.h>
#include "common.h"
-#include "dosfsck.h"
+#include "fsck.fat.h"
#include "fat.h"
#include "io.h"
#include "boot.h"
+#include "check.h"
#define ROUND_TO_MULTIPLE(n,m) ((n) && (m) ? (n)+(m)-1-((n)-1)%(m) : 0)
/* don't divide by zero */
@@ -43,8 +45,8 @@
#define FAT16_THRESHOLD 65525
static struct {
- __u8 media;
- char *descr;
+ uint8_t media;
+ const char *descr;
} mediabytes[] = {
{
0xf0, "5.25\" or 3.5\" HD floppy"}, {
@@ -58,20 +60,11 @@ static struct {
0xfe, "5.25\" 160k floppy 1s/40tr/8sec"}, {
0xff, "5.25\" 320k floppy 2s/40tr/8sec"},};
-#if defined __alpha || defined __arm || defined __arm__ || defined __ia64__ || defined __x86_64__ \
- || defined __ppc64__ || defined __bfin__ || defined __MICROBLAZE__
-/* Unaligned fields must first be copied byte-wise */
+/* Unaligned fields must first be accessed byte-wise */
#define GET_UNALIGNED_W(f) \
- ({ \
- unsigned short __v; \
- memcpy( &__v, &f, sizeof(__v) ); \
- CF_LE_W( *(unsigned short *)&__v ); \
- })
-#else
-#define GET_UNALIGNED_W(f) CF_LE_W( *(unsigned short *)&f )
-#endif
+ ( (uint16_t)f[0] | ((uint16_t)f[1]<<8) )
-static char *get_media_descr(unsigned char media)
+static const char *get_media_descr(unsigned char media)
{
int i;
@@ -96,14 +89,14 @@ static void dump_boot(DOS_FS * fs, struct boot_sector *b, unsigned lss)
/* On Atari, a 24 bit serial number is stored at offset 8 of the boot
* sector */
printf("Serial number 0x%x\n",
- b->system_id[5] | (b->
- system_id[6] << 8) | (b->system_id[7] << 16));
+ b->system_id[5] | (b->system_id[6] << 8) | (b->
+ system_id[7] << 16));
}
printf("Media byte 0x%02x (%s)\n", b->media, get_media_descr(b->media));
printf("%10d bytes per logical sector\n", GET_UNALIGNED_W(b->sector_size));
printf("%10d bytes per cluster\n", fs->cluster_size);
- printf("%10d reserved sector%s\n", CF_LE_W(b->reserved),
- CF_LE_W(b->reserved) == 1 ? "" : "s");
+ printf("%10d reserved sector%s\n", le16toh(b->reserved),
+ le16toh(b->reserved) == 1 ? "" : "s");
printf("First FAT starts at byte %llu (sector %llu)\n",
(unsigned long long)fs->fat_start,
(unsigned long long)fs->fat_start / lss);
@@ -117,21 +110,21 @@ static void dump_boot(DOS_FS * fs, struct boot_sector *b, unsigned lss)
printf("%10d root directory entries\n", fs->root_entries);
} else {
printf("Root directory start at cluster %lu (arbitrary size)\n",
- fs->root_cluster);
+ (unsigned long)fs->root_cluster);
}
printf("Data area starts at byte %llu (sector %llu)\n",
(unsigned long long)fs->data_start,
(unsigned long long)fs->data_start / lss);
- printf("%10lu data clusters (%llu bytes)\n", fs->clusters,
+ printf("%10lu data clusters (%llu bytes)\n", (unsigned long)fs->clusters,
(unsigned long long)fs->clusters * fs->cluster_size);
- printf("%u sectors/track, %u heads\n", CF_LE_W(b->secs_track),
- CF_LE_W(b->heads));
+ printf("%u sectors/track, %u heads\n", le16toh(b->secs_track),
+ le16toh(b->heads));
printf("%10u hidden sectors\n", atari_format ?
/* On Atari, the hidden field is only 16 bit wide and unused */
(((unsigned char *)&b->hidden)[0] |
- ((unsigned char *)&b->hidden)[1] << 8) : CF_LE_L(b->hidden));
+ ((unsigned char *)&b->hidden)[1] << 8) : le32toh(b->hidden));
sectors = GET_UNALIGNED_W(b->sectors);
- printf("%10u sectors total\n", sectors ? sectors : CF_LE_L(b->total_sect));
+ printf("%10u sectors total\n", sectors ? sectors : le32toh(b->total_sect));
}
static void check_backup_boot(DOS_FS * fs, struct boot_sector *b, int lss)
@@ -140,7 +133,7 @@ static void check_backup_boot(DOS_FS * fs, struct boot_sector *b, int lss)
if (!fs->backupboot_start) {
printf("There is no backup boot sector.\n");
- if (CF_LE_W(b->reserved) < 3) {
+ if (le16toh(b->reserved) < 3) {
printf("And there is no space for creating one!\n");
return;
}
@@ -152,15 +145,15 @@ static void check_backup_boot(DOS_FS * fs, struct boot_sector *b, int lss)
int bbs;
/* The usual place for the backup boot sector is sector 6. Choose
* that or the last reserved sector. */
- if (CF_LE_W(b->reserved) >= 7 && CF_LE_W(b->info_sector) != 6)
+ if (le16toh(b->reserved) >= 7 && le16toh(b->info_sector) != 6)
bbs = 6;
else {
- bbs = CF_LE_W(b->reserved) - 1;
- if (bbs == CF_LE_W(b->info_sector))
+ bbs = le16toh(b->reserved) - 1;
+ if (bbs == le16toh(b->info_sector))
--bbs; /* this is never 0, as we checked reserved >= 3! */
}
fs->backupboot_start = bbs * lss;
- b->backup_boot = CT_LE_W(bbs);
+ b->backup_boot = htole16(bbs);
fs_write(fs->backupboot_start, sizeof(*b), b);
fs_write((loff_t) offsetof(struct boot_sector, backup_boot),
sizeof(b->backup_boot), &b->backup_boot);
@@ -173,18 +166,18 @@ static void check_backup_boot(DOS_FS * fs, struct boot_sector *b, int lss)
fs_read(fs->backupboot_start, sizeof(b2), &b2);
if (memcmp(b, &b2, sizeof(b2)) != 0) {
/* there are any differences */
- __u8 *p, *q;
+ uint8_t *p, *q;
int i, pos, first = 1;
char buf[20];
printf("There are differences between boot sector and its backup.\n");
- printf("Differences: (offset:original/backup)\n ");
+ printf("This is mostly harmless. Differences: (offset:original/backup)\n ");
pos = 2;
- for (p = (__u8 *) b, q = (__u8 *) & b2, i = 0; i < sizeof(b2);
+ for (p = (uint8_t *) b, q = (uint8_t *) & b2, i = 0; i < sizeof(b2);
++p, ++q, ++i) {
if (*p != *q) {
sprintf(buf, "%s%u:%02x/%02x", first ? "" : ", ",
- (unsigned)(p - (__u8 *) b), *p, *q);
+ (unsigned)(p - (uint8_t *) b), *p, *q);
if (pos + strlen(buf) > 78)
printf("\n "), pos = 2;
printf("%s", buf);
@@ -214,11 +207,11 @@ static void check_backup_boot(DOS_FS * fs, struct boot_sector *b, int lss)
static void init_fsinfo(struct info_sector *i)
{
- i->magic = CT_LE_L(0x41615252);
- i->signature = CT_LE_L(0x61417272);
- i->free_clusters = CT_LE_L(-1);
- i->next_cluster = CT_LE_L(2);
- i->boot_sign = CT_LE_W(0xaa55);
+ i->magic = htole32(0x41615252);
+ i->signature = htole32(0x61417272);
+ i->free_clusters = htole32(-1);
+ i->next_cluster = htole32(2);
+ i->boot_sign = htole16(0xaa55);
}
static void read_fsinfo(DOS_FS * fs, struct boot_sector *b, int lss)
@@ -234,14 +227,14 @@ static void read_fsinfo(DOS_FS * fs, struct boot_sector *b, int lss)
if (interactive && get_key("12", "?") == '1') {
/* search for a free reserved sector (not boot sector and not
* backup boot sector) */
- __u32 s;
- for (s = 1; s < CF_LE_W(b->reserved); ++s)
- if (s != CF_LE_W(b->backup_boot))
+ uint32_t s;
+ for (s = 1; s < le16toh(b->reserved); ++s)
+ if (s != le16toh(b->backup_boot))
break;
- if (s > 0 && s < CF_LE_W(b->reserved)) {
+ if (s > 0 && s < le16toh(b->reserved)) {
init_fsinfo(&i);
fs_write((loff_t) s * lss, sizeof(i), &i);
- b->info_sector = CT_LE_W(s);
+ b->info_sector = htole16(s);
fs_write((loff_t) offsetof(struct boot_sector, info_sector),
sizeof(b->info_sector), &b->info_sector);
if (fs->backupboot_start)
@@ -257,24 +250,24 @@ static void read_fsinfo(DOS_FS * fs, struct boot_sector *b, int lss)
return;
}
- fs->fsinfo_start = CF_LE_W(b->info_sector) * lss;
+ fs->fsinfo_start = le16toh(b->info_sector) * lss;
fs_read(fs->fsinfo_start, sizeof(i), &i);
- if (i.magic != CT_LE_L(0x41615252) ||
- i.signature != CT_LE_L(0x61417272) || i.boot_sign != CT_LE_W(0xaa55)) {
+ if (i.magic != htole32(0x41615252) ||
+ i.signature != htole32(0x61417272) || i.boot_sign != htole16(0xaa55)) {
printf("FSINFO sector has bad magic number(s):\n");
- if (i.magic != CT_LE_L(0x41615252))
+ if (i.magic != htole32(0x41615252))
printf(" Offset %llu: 0x%08x != expected 0x%08x\n",
(unsigned long long)offsetof(struct info_sector, magic),
- CF_LE_L(i.magic), 0x41615252);
- if (i.signature != CT_LE_L(0x61417272))
+ le32toh(i.magic), 0x41615252);
+ if (i.signature != htole32(0x61417272))
printf(" Offset %llu: 0x%08x != expected 0x%08x\n",
(unsigned long long)offsetof(struct info_sector, signature),
- CF_LE_L(i.signature), 0x61417272);
- if (i.boot_sign != CT_LE_W(0xaa55))
+ le32toh(i.signature), 0x61417272);
+ if (i.boot_sign != htole16(0xaa55))
printf(" Offset %llu: 0x%04x != expected 0x%04x\n",
(unsigned long long)offsetof(struct info_sector, boot_sign),
- CF_LE_W(i.boot_sign), 0xaa55);
+ le16toh(i.boot_sign), 0xaa55);
if (interactive)
printf("1) Correct\n2) Don't correct (FSINFO invalid then)\n");
else
@@ -287,7 +280,45 @@ static void read_fsinfo(DOS_FS * fs, struct boot_sector *b, int lss)
}
if (fs->fsinfo_start)
- fs->free_clusters = CF_LE_L(i.free_clusters);
+ fs->free_clusters = le32toh(i.free_clusters);
+}
+
+static char print_fat_dirty_state(void)
+{
+ printf("Dirty bit is set. Fs was not properly unmounted and"
+ " some data may be corrupt.\n");
+
+ if (interactive) {
+ printf("1) Remove dirty bit\n" "2) No action\n");
+ return get_key("12", "?");
+ } else
+ printf(" Automatically removing dirty bit.\n");
+ return '1';
+}
+
+static void check_fat_state_bit(DOS_FS * fs, void *b)
+{
+ if (fs->fat_bits == 32) {
+ struct boot_sector *b32 = b;
+
+ if (b32->reserved3 & FAT_STATE_DIRTY) {
+ printf("0x41: ");
+ if (print_fat_dirty_state() == '1') {
+ b32->reserved3 &= ~FAT_STATE_DIRTY;
+ fs_write(0, sizeof(*b32), b32);
+ }
+ }
+ } else {
+ struct boot_sector_16 *b16 = b;
+
+ if (b16->reserved2 & FAT_STATE_DIRTY) {
+ printf("0x25: ");
+ if (print_fat_dirty_state() == '1') {
+ b16->reserved2 &= ~FAT_STATE_DIRTY;
+ fs_write(0, sizeof(*b16), b16);
+ }
+ }
+ }
}
void read_boot(DOS_FS * fs)
@@ -317,16 +348,16 @@ void read_boot(DOS_FS * fs)
die("Currently, only 1 or 2 FATs are supported, not %d.\n", b.fats);
fs->nfats = b.fats;
sectors = GET_UNALIGNED_W(b.sectors);
- total_sectors = sectors ? sectors : CF_LE_L(b.total_sect);
+ total_sectors = sectors ? sectors : le32toh(b.total_sect);
if (verbose)
printf("Checking we can access the last sector of the filesystem\n");
/* Can't access last odd sector anyway, so round down */
fs_test((loff_t) ((total_sectors & ~1) - 1) * (loff_t) logical_sector_size,
logical_sector_size);
- fat_length = CF_LE_W(b.fat_length) ?
- CF_LE_W(b.fat_length) : CF_LE_L(b.fat32_length);
- fs->fat_start = (loff_t) CF_LE_W(b.reserved) * logical_sector_size;
- fs->root_start = ((loff_t) CF_LE_W(b.reserved) + b.fats * fat_length) *
+ fat_length = le16toh(b.fat_length) ?
+ le16toh(b.fat_length) : le32toh(b.fat32_length);
+ fs->fat_start = (loff_t) le16toh(b.reserved) * logical_sector_size;
+ fs->root_start = ((loff_t) le16toh(b.reserved) + b.fats * fat_length) *
logical_sector_size;
fs->root_entries = GET_UNALIGNED_W(b.dir_entries);
fs->data_start = fs->root_start + ROUND_TO_MULTIPLE(fs->root_entries <<
@@ -339,7 +370,7 @@ void read_boot(DOS_FS * fs)
fs->free_clusters = -1; /* unknown */
if (!b.fat_length && b.fat32_length) {
fs->fat_bits = 32;
- fs->root_cluster = CF_LE_L(b.root_cluster);
+ fs->root_cluster = le32toh(b.root_cluster);
if (!fs->root_cluster && fs->root_entries)
/* M$ hasn't specified this, but it looks reasonable: If
* root_cluster is 0 but there is a separate root dir
@@ -360,9 +391,10 @@ void read_boot(DOS_FS * fs)
" but has only %lu clusters, less than the required "
"minimum of %d.\n"
" This may lead to problems on some systems.\n",
- fs->clusters, FAT16_THRESHOLD);
+ (unsigned long)fs->clusters, FAT16_THRESHOLD);
- fs->backupboot_start = CF_LE_W(b.backup_boot) * logical_sector_size;
+ check_fat_state_bit(fs, &b);
+ fs->backupboot_start = le16toh(b.backup_boot) * logical_sector_size;
check_backup_boot(fs, &b, logical_sector_size);
read_fsinfo(fs, &b, logical_sector_size);
@@ -372,6 +404,7 @@ void read_boot(DOS_FS * fs)
fs->fat_bits = (fs->clusters >= FAT12_THRESHOLD) ? 16 : 12;
if (fs->clusters >= FAT16_THRESHOLD)
die("Too many clusters (%lu) for FAT16 filesystem.", fs->clusters);
+ check_fat_state_bit(fs, &b);
} else {
/* On Atari, things are more difficult: GEMDOS always uses 12bit FATs
* on floppies, and always 16 bit on harddisks. */
@@ -392,7 +425,7 @@ void read_boot(DOS_FS * fs)
fs->eff_fat_bits = (fs->fat_bits == 32) ? 28 : fs->fat_bits;
fs->fat_size = fat_length * logical_sector_size;
- fs->label = calloc(12, sizeof(__u8));
+ fs->label = calloc(12, sizeof(uint8_t));
if (fs->fat_bits == 12 || fs->fat_bits == 16) {
struct boot_sector_16 *b16 = (struct boot_sector_16 *)&b;
if (b16->extended_sig == 0x29)
@@ -407,8 +440,8 @@ void read_boot(DOS_FS * fs)
}
if (fs->clusters >
- ((unsigned long long)fs->fat_size * 8 / fs->fat_bits) - 2)
- die("File system has %d clusters but only space for %d FAT entries.",
+ ((uint64_t)fs->fat_size * 8 / fs->fat_bits) - 2)
+ die("Filesystem has %d clusters but only space for %d FAT entries.",
fs->clusters,
((unsigned long long)fs->fat_size * 8 / fs->fat_bits) - 2);
if (!fs->root_entries && !fs->root_cluster)
@@ -430,34 +463,37 @@ void read_boot(DOS_FS * fs)
static void write_boot_label(DOS_FS * fs, char *label)
{
- struct boot_sector b;
- struct boot_sector_16 *b16 = (struct boot_sector_16 *)&b;
-
- fs_read(0, sizeof(b), &b);
if (fs->fat_bits == 12 || fs->fat_bits == 16) {
- if (b16->extended_sig != 0x29) {
- b16->extended_sig = 0x29;
- b16->serial = 0;
- memmove(b16->fs_type, fs->fat_bits == 12 ? "FAT12 " : "FAT16 ",
+ struct boot_sector_16 b16;
+
+ fs_read(0, sizeof(b16), &b16);
+ if (b16.extended_sig != 0x29) {
+ b16.extended_sig = 0x29;
+ b16.serial = 0;
+ memmove(b16.fs_type, fs->fat_bits == 12 ? "FAT12 " : "FAT16 ",
8);
}
- memmove(b16->label, label, 11);
+ memmove(b16.label, label, 11);
+ fs_write(0, sizeof(b16), &b16);
} else if (fs->fat_bits == 32) {
+ struct boot_sector b;
+
+ fs_read(0, sizeof(b), &b);
if (b.extended_sig != 0x29) {
b.extended_sig = 0x29;
b.serial = 0;
memmove(b.fs_type, "FAT32 ", 8);
}
memmove(b.label, label, 11);
+ fs_write(0, sizeof(b), &b);
+ if (fs->backupboot_start)
+ fs_write(fs->backupboot_start, sizeof(b), &b);
}
- fs_write(0, sizeof(b), &b);
- if (fs->fat_bits == 32 && fs->backupboot_start)
- fs_write(fs->backupboot_start, sizeof(b), &b);
}
-static loff_t find_volume_de(DOS_FS * fs, DIR_ENT * de)
+loff_t find_volume_de(DOS_FS * fs, DIR_ENT * de)
{
- unsigned long cluster;
+ uint32_t cluster;
loff_t offset;
int i;
@@ -468,7 +504,7 @@ static loff_t find_volume_de(DOS_FS * fs, DIR_ENT * de)
offset = cluster_start(fs, cluster);
for (i = 0; i * sizeof(DIR_ENT) < fs->cluster_size; i++) {
fs_read(offset, sizeof(DIR_ENT), de);
- if (de->attr & ATTR_VOLUME)
+ if (de->attr != VFAT_LN_ATTR && de->attr & ATTR_VOLUME)
return offset;
offset += sizeof(DIR_ENT);
}
@@ -477,7 +513,7 @@ static loff_t find_volume_de(DOS_FS * fs, DIR_ENT * de)
for (i = 0; i < fs->root_entries; i++) {
offset = fs->root_start + i * sizeof(DIR_ENT);
fs_read(offset, sizeof(DIR_ENT), de);
- if (de->attr & ATTR_VOLUME)
+ if (de->attr != VFAT_LN_ATTR && de->attr & ATTR_VOLUME)
return offset;
}
}
@@ -490,19 +526,33 @@ static void write_volume_label(DOS_FS * fs, char *label)
time_t now = time(NULL);
struct tm *mtime = localtime(&now);
loff_t offset;
+ int created;
DIR_ENT de;
+ created = 0;
offset = find_volume_de(fs, &de);
- if (offset == 0)
- return;
-
+ if (offset == 0) {
+ created = 1;
+ offset = alloc_rootdir_entry(fs, &de, label);
+ }
memcpy(de.name, label, 11);
- de.time = CT_LE_W((unsigned short)((mtime->tm_sec >> 1) +
+ de.time = htole16((unsigned short)((mtime->tm_sec >> 1) +
(mtime->tm_min << 5) +
(mtime->tm_hour << 11)));
- de.date = CT_LE_W((unsigned short)(mtime->tm_mday +
+ de.date = htole16((unsigned short)(mtime->tm_mday +
((mtime->tm_mon + 1) << 5) +
((mtime->tm_year - 80) << 9)));
+ if (created) {
+ de.attr = ATTR_VOLUME;
+ de.ctime_ms = 0;
+ de.ctime = de.time;
+ de.cdate = de.date;
+ de.adate = de.date;
+ de.starthi = 0;
+ de.start = 0;
+ de.size = 0;
+ }
+
fs_write(offset, sizeof(DIR_ENT), &de);
}
diff --git a/dosfstools/src/boot.h b/dosfstools/src/boot.h
index c9edfa337..d52e62476 100644
--- a/dosfstools/src/boot.h
+++ b/dosfstools/src/boot.h
@@ -1,6 +1,7 @@
/* boot.h - Read and analyze ia PC/MS-DOS boot sector
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -24,6 +25,7 @@
void read_boot(DOS_FS * fs);
void write_label(DOS_FS * fs, char *label);
+loff_t find_volume_de(DOS_FS * fs, DIR_ENT * de);
/* Reads the boot sector from the currently open device and initializes *FS */
diff --git a/dosfstools/src/check.c b/dosfstools/src/check.c
index 3f175b019..bbb97e4f3 100644
--- a/dosfstools/src/check.c
+++ b/dosfstools/src/check.c
@@ -1,7 +1,8 @@
-/* check.c - Check and repair a PC/MS-DOS file system
+/* check.c - Check and repair a PC/MS-DOS filesystem
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -30,7 +31,7 @@
#include <time.h>
#include "common.h"
-#include "dosfsck.h"
+#include "fsck.fat.h"
#include "io.h"
#include "fat.h"
#include "file.h"
@@ -41,8 +42,8 @@ static DOS_FILE *root;
/* get start field of a dir entry */
#define FSTART(p,fs) \
- ((unsigned long)CF_LE_W(p->dir_ent.start) | \
- (fs->fat_bits == 32 ? CF_LE_W(p->dir_ent.starthi) << 16 : 0))
+ ((uint32_t)le16toh(p->dir_ent.start) | \
+ (fs->fat_bits == 32 ? le16toh(p->dir_ent.starthi) << 16 : 0))
#define MODIFY(p,i,v) \
do { \
@@ -55,22 +56,22 @@ static DOS_FILE *root;
#define MODIFY_START(p,v,fs) \
do { \
- unsigned long __v = (v); \
+ uint32_t __v = (v); \
if (!p->offset) { \
/* writing to fake entry for FAT32 root dir */ \
if (!__v) die("Oops, deleting FAT32 root dir!"); \
fs->root_cluster = __v; \
- p->dir_ent.start = CT_LE_W(__v&0xffff); \
- p->dir_ent.starthi = CT_LE_W(__v>>16); \
- __v = CT_LE_L(__v); \
+ p->dir_ent.start = htole16(__v&0xffff); \
+ p->dir_ent.starthi = htole16(__v>>16); \
+ __v = htole32(__v); \
fs_write((loff_t)offsetof(struct boot_sector,root_cluster), \
sizeof(((struct boot_sector *)0)->root_cluster), \
&__v); \
} \
else { \
- MODIFY(p,start,CT_LE_W((__v)&0xffff)); \
+ MODIFY(p,start,htole16((__v)&0xffff)); \
if (fs->fat_bits == 32) \
- MODIFY(p,starthi,CT_LE_W((__v)>>16)); \
+ MODIFY(p,starthi,htole16((__v)>>16)); \
} \
} while(0)
@@ -82,7 +83,7 @@ loff_t alloc_rootdir_entry(DOS_FS * fs, DIR_ENT * de, const char *pattern)
if (fs->root_cluster) {
DIR_ENT d2;
int i = 0, got = 0;
- unsigned long clu_num, prev = 0;
+ uint32_t clu_num, prev = 0;
loff_t offset2;
clu_num = fs->root_cluster;
@@ -131,8 +132,8 @@ loff_t alloc_rootdir_entry(DOS_FS * fs, DIR_ENT * de, const char *pattern)
while (1) {
char expanded[12];
sprintf(expanded, pattern, curr_num);
- memcpy(de->name + 4, expanded, 4);
- memcpy(de->ext, expanded + 4, 3);
+ memcpy(de->name, expanded, 8);
+ memcpy(de->ext, expanded + 8, 3);
clu_num = fs->root_cluster;
i = 0;
offset2 = cluster_start(fs, clu_num);
@@ -174,7 +175,10 @@ loff_t alloc_rootdir_entry(DOS_FS * fs, DIR_ENT * de, const char *pattern)
offset = fs->root_start + next_free * sizeof(DIR_ENT);
memset(de, 0, sizeof(DIR_ENT));
while (1) {
- sprintf((char *)de->name, pattern, curr_num);
+ char expanded[12];
+ sprintf(expanded, pattern, curr_num);
+ memcpy(de->name, expanded, 8);
+ memcpy(de->ext, expanded + 8, 3);
for (scan = 0; scan < fs->root_entries; scan++)
if (scan != next_free &&
!strncmp((const char *)root[scan].name,
@@ -220,18 +224,22 @@ static char *path_name(DOS_FILE * file)
return path;
}
-static int day_n[] =
- { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 0, 0, 0, 0 };
- /* JanFebMarApr May Jun Jul Aug Sep Oct Nov Dec */
+static const int day_n[] =
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 0, 0, 0, 0 };
+/* Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec */
/* Convert a MS-DOS time/date pair to a UNIX date (seconds since 1 1 70). */
-time_t date_dos2unix(unsigned short time, unsigned short date)
+static time_t date_dos2unix(unsigned short time, unsigned short date)
{
int month, year;
time_t secs;
month = ((date >> 5) & 15) - 1;
+ if (month < 0) {
+ /* make sure that nothing bad happens if the month bits were zero */
+ month = 0;
+ }
year = date >> 9;
secs =
(time & 31) * 2 + 60 * ((time >> 5) & 63) + (time >> 11) * 3600 +
@@ -249,18 +257,19 @@ static char *file_stat(DOS_FILE * file)
time_t date;
date =
- date_dos2unix(CF_LE_W(file->dir_ent.time), CF_LE_W(file->dir_ent.date));
+ date_dos2unix(le16toh(file->dir_ent.time), le16toh(file->dir_ent.date));
tm = localtime(&date);
strftime(tmp, 99, "%H:%M:%S %b %d %Y", tm);
- sprintf(temp, " Size %u bytes, date %s", CF_LE_L(file->dir_ent.size), tmp);
+ sprintf(temp, " Size %u bytes, date %s", le32toh(file->dir_ent.size), tmp);
return temp;
}
static int bad_name(DOS_FILE * file)
{
int i, spc, suspicious = 0;
- char *bad_chars = atari_format ? "*?\\/:" : "*?<>|\"\\/:";
- unsigned char *name = file->dir_ent.name;
+ const char *bad_chars = atari_format ? "*?\\/:" : "*?<>|\"\\/:";
+ const unsigned char *name = file->dir_ent.name;
+ const unsigned char *ext = file->dir_ent.ext;
/* Do not complain about (and auto-correct) the extended attribute files
* of OS/2. */
@@ -268,6 +277,11 @@ static int bad_name(DOS_FILE * file)
strncmp((const char *)name, "WP ROOT SF", 11) == 0)
return 0;
+ /* check if we have neither a long filename nor a short name */
+ if ((file->lfn == NULL) && (file->dir_ent.lcase & FAT_NO_83NAME)) {
+ return 1;
+ }
+
/* don't complain about the dummy 11 bytes used by patched Linux
kernels */
if (file->dir_ent.lcase & FAT_NO_83NAME)
@@ -282,12 +296,12 @@ static int bad_name(DOS_FILE * file)
return 1;
}
- for (i = 8; i < 11; i++) {
- if (name[i] < ' ' || name[i] == 0x7f)
+ for (i = 0; i < 3; i++) {
+ if (ext[i] < ' ' || ext[i] == 0x7f)
return 1;
- if (name[i] > 0x7f)
+ if (ext[i] > 0x7f)
++suspicious;
- if (strchr(bad_chars, name[i]))
+ if (strchr(bad_chars, ext[i]))
return 1;
}
@@ -302,11 +316,11 @@ static int bad_name(DOS_FILE * file)
}
spc = 0;
- for (i = 8; i < 11; i++) {
- if (name[i] == ' ')
+ for (i = 0; i < 3; i++) {
+ if (ext[i] == ' ')
spc = 1;
else if (spc)
- /* non-space after a space not allowed, space terminates the name
+ /* non-space after a space not allowed, space terminates the ext
* part */
return 1;
}
@@ -340,7 +354,7 @@ static void lfn_remove(loff_t from, loff_t to)
static void drop_file(DOS_FS * fs, DOS_FILE * file)
{
- unsigned long cluster;
+ uint32_t cluster;
MODIFY(file, name[0], DELETED_FLAG);
if (file->lfn)
@@ -351,13 +365,12 @@ static void drop_file(DOS_FS * fs, DOS_FILE * file)
--n_files;
}
-static void truncate_file(DOS_FS * fs, DOS_FILE * file, unsigned long clusters)
+static void truncate_file(DOS_FS * fs, DOS_FILE * file, uint32_t clusters)
{
int deleting;
- unsigned long walk, next, prev;
+ uint32_t walk, next;
walk = FSTART(file, fs);
- prev = 0;
if ((deleting = !clusters))
MODIFY_START(file, 0, fs);
while (walk > 0 && walk != -1) {
@@ -366,7 +379,6 @@ static void truncate_file(DOS_FS * fs, DOS_FILE * file, unsigned long clusters)
set_fat(fs, walk, 0);
else if ((deleting = !--clusters))
set_fat(fs, walk, -1);
- prev = walk;
walk = next;
}
}
@@ -374,7 +386,7 @@ static void truncate_file(DOS_FS * fs, DOS_FILE * file, unsigned long clusters)
static void auto_rename(DOS_FILE * file)
{
DOS_FILE *first, *walk;
- unsigned long int number;
+ uint32_t number;
if (!file->offset)
return; /* cannot rename FAT32 root dir */
@@ -382,7 +394,7 @@ static void auto_rename(DOS_FILE * file)
number = 0;
while (1) {
char num[8];
- sprintf(num, "%07lu", number);
+ sprintf(num, "%07lu", (unsigned long)number);
memcpy(file->dir_ent.name, "FSCK", 4);
memcpy(file->dir_ent.name + 4, num, 4);
memcpy(file->dir_ent.ext, num + 4, 3);
@@ -392,7 +404,16 @@ static void auto_rename(DOS_FILE * file)
(const char *)file->dir_ent.name, MSDOS_NAME))
break;
if (!walk) {
- fs_write(file->offset, MSDOS_NAME, file->dir_ent.name);
+ if (file->dir_ent.lcase & FAT_NO_83NAME) {
+ /* as we only assign a new 8.3 filename, reset flag that 8.3 name is not
+ present */
+ file->dir_ent.lcase &= ~FAT_NO_83NAME;
+ /* reset the attributes, only keep DIR and VOLUME */
+ file->dir_ent.attr &= ~(ATTR_DIR | ATTR_VOLUME);
+ fs_write(file->offset, MSDOS_NAME + 2, file->dir_ent.name);
+ } else {
+ fs_write(file->offset, MSDOS_NAME, file->dir_ent.name);
+ }
if (file->lfn)
lfn_fix_checksum(file->lfn_offset, file->offset,
(const char *)file->dir_ent.name);
@@ -426,7 +447,16 @@ static void rename_file(DOS_FILE * file)
walk[1] = 0;
for (walk = name; *walk == ' ' || *walk == '\t'; walk++) ;
if (file_cvt(walk, file->dir_ent.name)) {
- fs_write(file->offset, MSDOS_NAME, file->dir_ent.name);
+ if (file->dir_ent.lcase & FAT_NO_83NAME) {
+ /* as we only assign a new 8.3 filename, reset flag that 8.3 name is not
+ present */
+ file->dir_ent.lcase &= ~FAT_NO_83NAME;
+ /* reset the attributes, only keep DIR and VOLUME */
+ file->dir_ent.attr &= ~(ATTR_DIR | ATTR_VOLUME);
+ fs_write(file->offset, MSDOS_NAME + 2, file->dir_ent.name);
+ } else {
+ fs_write(file->offset, MSDOS_NAME, file->dir_ent.name);
+ }
if (file->lfn)
lfn_fix_checksum(file->lfn_offset, file->offset,
(const char *)file->dir_ent.name);
@@ -438,7 +468,7 @@ static void rename_file(DOS_FILE * file)
static int handle_dot(DOS_FS * fs, DOS_FILE * file, int dots)
{
- char *name;
+ const char *name;
name =
strncmp((const char *)file->dir_ent.name, MSDOS_DOT,
@@ -462,7 +492,7 @@ static int handle_dot(DOS_FS * fs, DOS_FILE * file, int dots)
rename_file(file);
return 0;
case '4':
- MODIFY(file, size, CT_LE_L(0));
+ MODIFY(file, size, htole32(0));
MODIFY(file, attr, file->dir_ent.attr | ATTR_DIR);
break;
}
@@ -479,21 +509,21 @@ static int check_file(DOS_FS * fs, DOS_FILE * file)
{
DOS_FILE *owner;
int restart;
- unsigned long expect, curr, this, clusters, prev, walk, clusters2;
+ uint32_t expect, curr, this, clusters, prev, walk, clusters2;
if (file->dir_ent.attr & ATTR_DIR) {
- if (CF_LE_L(file->dir_ent.size)) {
+ if (le32toh(file->dir_ent.size)) {
printf("%s\n Directory has non-zero size. Fixing it.\n",
path_name(file));
- MODIFY(file, size, CT_LE_L(0));
+ MODIFY(file, size, htole32(0));
}
if (file->parent
&& !strncmp((const char *)file->dir_ent.name, MSDOS_DOT,
MSDOS_NAME)) {
expect = FSTART(file->parent, fs);
if (FSTART(file, fs) != expect) {
- printf("%s\n Start (%ld) does not point to parent (%ld)\n",
- path_name(file), FSTART(file, fs), expect);
+ printf("%s\n Start (%lu) does not point to parent (%lu)\n",
+ path_name(file), (unsigned long)FSTART(file, fs), (long)expect);
MODIFY_START(file, expect, fs);
}
return 0;
@@ -507,7 +537,7 @@ static int check_file(DOS_FS * fs, DOS_FILE * file)
expect = 0;
if (FSTART(file, fs) != expect) {
printf("%s\n Start (%lu) does not point to .. (%lu)\n",
- path_name(file), FSTART(file, fs), expect);
+ path_name(file), (unsigned long)FSTART(file, fs), (unsigned long)expect);
MODIFY_START(file, expect, fs);
}
return 0;
@@ -519,12 +549,20 @@ static int check_file(DOS_FS * fs, DOS_FILE * file)
return 0;
}
}
+ if (FSTART(file, fs) == 1) {
+ printf("%s\n Bad start cluster 1. Truncating file.\n",
+ path_name(file));
+ if (!file->offset)
+ die("Bad FAT32 root directory! (bad start cluster 1)\n");
+ MODIFY_START(file, 0, fs);
+ }
if (FSTART(file, fs) >= fs->clusters + 2) {
printf
("%s\n Start cluster beyond limit (%lu > %lu). Truncating file.\n",
- path_name(file), FSTART(file, fs), fs->clusters + 1);
+ path_name(file), (unsigned long)FSTART(file, fs), (unsigned long)(fs->clusters + 1));
if (!file->offset)
- die("Bad FAT32 root directory! (bad start cluster)\n");
+ die("Bad FAT32 root directory! (start cluster beyond limit: %lu > %lu)\n",
+ (unsigned long)FSTART(file, fs), (unsigned long)(fs->clusters + 1));
MODIFY_START(file, 0, fs);
}
clusters = prev = 0;
@@ -535,7 +573,7 @@ static int check_file(DOS_FS * fs, DOS_FILE * file)
if (!curEntry.value || bad_cluster(fs, curr)) {
printf("%s\n Contains a %s cluster (%lu). Assuming EOF.\n",
- path_name(file), curEntry.value ? "bad" : "free", curr);
+ path_name(file), curEntry.value ? "bad" : "free", (unsigned long)curr);
if (prev)
set_fat(fs, prev, -1);
else if (!file->offset)
@@ -544,14 +582,14 @@ static int check_file(DOS_FS * fs, DOS_FILE * file)
MODIFY_START(file, 0, fs);
break;
}
- if (!(file->dir_ent.attr & ATTR_DIR) && CF_LE_L(file->dir_ent.size) <=
- (unsigned long long)clusters * fs->cluster_size) {
+ if (!(file->dir_ent.attr & ATTR_DIR) && le32toh(file->dir_ent.size) <=
+ (uint64_t)clusters * fs->cluster_size) {
printf
- ("%s\n File size is %u bytes, cluster chain length is > %llu "
+ ("%s\n File size is %u bytes, cluster chain length is > %lu "
"bytes.\n Truncating file to %u bytes.\n", path_name(file),
- CF_LE_L(file->dir_ent.size),
- (unsigned long long)clusters * fs->cluster_size,
- CF_LE_L(file->dir_ent.size));
+ le32toh(file->dir_ent.size),
+ (uint64_t)clusters * fs->cluster_size,
+ le32toh(file->dir_ent.size));
truncate_file(fs, file, clusters);
break;
}
@@ -599,7 +637,7 @@ static int check_file(DOS_FS * fs, DOS_FILE * file)
else
MODIFY_START(owner, 0, fs);
MODIFY(owner, size,
- CT_LE_L((unsigned long long)clusters *
+ htole32((uint64_t)clusters *
fs->cluster_size));
if (restart)
return 1;
@@ -628,16 +666,16 @@ static int check_file(DOS_FS * fs, DOS_FILE * file)
clusters++;
prev = curr;
}
- if (!(file->dir_ent.attr & ATTR_DIR) && CF_LE_L(file->dir_ent.size) >
- (unsigned long long)clusters * fs->cluster_size) {
+ if (!(file->dir_ent.attr & ATTR_DIR) && le32toh(file->dir_ent.size) >
+ (uint64_t)clusters * fs->cluster_size) {
printf
("%s\n File size is %u bytes, cluster chain length is %llu bytes."
"\n Truncating file to %llu bytes.\n", path_name(file),
- CF_LE_L(file->dir_ent.size),
+ le32toh(file->dir_ent.size),
(unsigned long long)clusters * fs->cluster_size,
(unsigned long long)clusters * fs->cluster_size);
MODIFY(file, size,
- CT_LE_L((unsigned long long)clusters * fs->cluster_size));
+ htole32((uint64_t)clusters * fs->cluster_size));
}
return 0;
}
@@ -807,10 +845,10 @@ static int check_dir(DOS_FS * fs, DOS_FILE ** root, int dots)
static void test_file(DOS_FS * fs, DOS_FILE * file, int read_test)
{
DOS_FILE *owner;
- unsigned long walk, prev, clusters, next_clu;
+ uint32_t walk, prev, clusters, next_clu;
prev = clusters = 0;
- for (walk = FSTART(file, fs); walk > 0 && walk < fs->clusters + 2;
+ for (walk = FSTART(file, fs); walk > 1 && walk < fs->clusters + 2;
walk = next_clu) {
next_clu = next_cluster(fs, walk);
@@ -821,7 +859,7 @@ static void test_file(DOS_FS * fs, DOS_FILE * file, int read_test)
if ((owner = get_owner(fs, walk))) {
if (owner == file) {
printf("%s\n Circular cluster chain. Truncating to %lu "
- "cluster%s.\n", path_name(file), clusters,
+ "cluster%s.\n", path_name(file), (unsigned long)clusters,
clusters == 1 ? "" : "s");
if (prev)
set_fat(fs, prev, -1);
@@ -840,7 +878,7 @@ static void test_file(DOS_FS * fs, DOS_FILE * file, int read_test)
clusters++;
} else {
printf("%s\n Cluster %lu (%lu) is unreadable. Skipping it.\n",
- path_name(file), clusters, walk);
+ path_name(file), (unsigned long)clusters, (unsigned long)walk);
if (prev)
set_fat(fs, prev, next_cluster(fs, walk));
else
@@ -851,7 +889,7 @@ static void test_file(DOS_FS * fs, DOS_FILE * file, int read_test)
set_owner(fs, walk, file);
}
/* Revert ownership (for now) */
- for (walk = FSTART(file, fs); walk > 0 && walk < fs->clusters + 2;
+ for (walk = FSTART(file, fs); walk > 1 && walk < fs->clusters + 2;
walk = next_cluster(fs, walk))
if (bad_cluster(fs, walk))
break;
@@ -863,9 +901,9 @@ static void test_file(DOS_FS * fs, DOS_FILE * file, int read_test)
static void undelete(DOS_FS * fs, DOS_FILE * file)
{
- unsigned long clusters, left, prev, walk;
+ uint32_t clusters, left, prev, walk;
- clusters = left = (CF_LE_L(file->dir_ent.size) + fs->cluster_size - 1) /
+ clusters = left = (le32toh(file->dir_ent.size) + fs->cluster_size - 1) /
fs->cluster_size;
prev = 0;
@@ -891,7 +929,7 @@ static void undelete(DOS_FS * fs, DOS_FILE * file)
MODIFY_START(file, 0, fs);
if (left)
printf("Warning: Did only undelete %lu of %lu cluster%s.\n",
- clusters - left, clusters, clusters == 1 ? "" : "s");
+ (unsigned long)clusters - left, (unsigned long)clusters, clusters == 1 ? "" : "s");
}
@@ -924,11 +962,11 @@ static void add_file(DOS_FS * fs, DOS_FILE *** chain, DOS_FILE * parent,
fs_read(offset, sizeof(DIR_ENT), &de);
else {
/* Construct a DIR_ENT for the root directory */
+ memset(&de, 0, sizeof de);
memcpy(de.name, " ", MSDOS_NAME);
de.attr = ATTR_DIR;
- de.size = de.time = de.date = 0;
- de.start = CT_LE_W(fs->root_cluster & 0xffff);
- de.starthi = CT_LE_W((fs->root_cluster >> 16) & 0xffff);
+ de.start = htole16(fs->root_cluster & 0xffff);
+ de.starthi = htole16((fs->root_cluster >> 16) & 0xffff);
}
if ((type = file_type(cp, (char *)de.name)) != fdt_none) {
if (type == fdt_undelete && (de.attr & ATTR_DIR))
@@ -974,7 +1012,7 @@ static int scan_dir(DOS_FS * fs, DOS_FILE * this, FDSC ** cp)
{
DOS_FILE **chain;
int i;
- unsigned long clu_num;
+ uint32_t clu_num;
chain = &this->first;
i = 0;
diff --git a/dosfstools/src/check.h b/dosfstools/src/check.h
index 277c44b6f..fcb6bea39 100644
--- a/dosfstools/src/check.h
+++ b/dosfstools/src/check.h
@@ -1,6 +1,7 @@
-/* check.h - Check and repair a PC/MS-DOS file system
+/* check.h - Check and repair a PC/MS-DOS filesystem
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -33,7 +34,7 @@ loff_t alloc_rootdir_entry(DOS_FS * fs, DIR_ENT * de, const char *pattern);
int scan_root(DOS_FS * fs);
/* Scans the root directory and recurses into all subdirectories. See check.c
- for all the details. Returns a non-zero integer if the file system has to
+ for all the details. Returns a non-zero integer if the filesystem has to
be checked again. */
#endif
diff --git a/dosfstools/src/common.c b/dosfstools/src/common.c
index 51605a2aa..9d1119322 100644
--- a/dosfstools/src/common.c
+++ b/dosfstools/src/common.c
@@ -2,6 +2,7 @@
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -36,7 +37,7 @@ typedef struct _link {
struct _link *next;
} LINK;
-void die(char *msg, ...)
+void die(const char *msg, ...)
{
va_list args;
@@ -47,7 +48,7 @@ void die(char *msg, ...)
exit(1);
}
-void pdie(char *msg, ...)
+void pdie(const char *msg, ...)
{
va_list args;
@@ -95,7 +96,7 @@ int min(int a, int b)
return a < b ? a : b;
}
-char get_key(char *valid, char *prompt)
+char get_key(const char *valid, const char *prompt)
{
int ch, okay;
diff --git a/dosfstools/src/common.h b/dosfstools/src/common.h
index 395eabb59..c15efb538 100644
--- a/dosfstools/src/common.h
+++ b/dosfstools/src/common.h
@@ -1,6 +1,7 @@
/* common.h - Common functions
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,20 +16,18 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
-#include <asm/types.h>
-
#ifndef _COMMON_H
#define _COMMON_H
-void die(char *msg, ...) __attribute((noreturn));
+void die(const char *msg, ...) __attribute((noreturn));
/* Displays a prinf-style message and terminates the program. */
-void pdie(char *msg, ...) __attribute((noreturn));
+void pdie(const char *msg, ...) __attribute((noreturn));
/* Like die, but appends an error message according to the state of errno. */
@@ -49,7 +48,7 @@ int min(int a, int b);
/* Returns the smaller integer value of a and b. */
-char get_key(char *valid, char *prompt);
+char get_key(const char *valid, const char *prompt);
/* Displays PROMPT and waits for user input. Only characters in VALID are
accepted. Terminates the program on EOF. Returns the character. */
diff --git a/dosfstools/src/dosfsck.h b/dosfstools/src/dosfsck.h
deleted file mode 100644
index 6f53c72cf..000000000
--- a/dosfstools/src/dosfsck.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/* dosfsck.h - Common data structures and global variables
-
- Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
- Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
-
- 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 3 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, see <http://www.gnu.org/licenses/>.
-
- On Debian systems, the complete text of the GNU General Public License
- can be found in /usr/share/common-licenses/GPL-3 file.
-*/
-
-/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
- * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
-
-#ifndef _DOSFSCK_H
-#define _DOSFSCK_H
-
-#include <sys/types.h>
-#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */
-#define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h> */
-#define _LINUX_FS_H /* hack to avoid inclusion of <linux/fs.h> */
-
-#ifdef _USING_BIONIC_
-#include <sys/endian.h>
-#endif
-
-#include <asm/types.h>
-#include <asm/byteorder.h>
-
-#include <linux/msdos_fs.h>
-
-#undef CF_LE_W
-#undef CF_LE_L
-#undef CT_LE_W
-#undef CT_LE_L
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#include <byteswap.h>
-#define CF_LE_W(v) bswap_16(v)
-#define CF_LE_L(v) bswap_32(v)
-#define CT_LE_W(v) CF_LE_W(v)
-#define CT_LE_L(v) CF_LE_L(v)
-#else
-#define CF_LE_W(v) (v)
-#define CF_LE_L(v) (v)
-#define CT_LE_W(v) (v)
-#define CT_LE_L(v) (v)
-#endif /* __BIG_ENDIAN */
-
-#define VFAT_LN_ATTR (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
-
-/* ++roman: Use own definition of boot sector structure -- the kernel headers'
- * name for it is msdos_boot_sector in 2.0 and fat_boot_sector in 2.1 ... */
-struct boot_sector {
- __u8 ignored[3]; /* Boot strap short or near jump */
- __u8 system_id[8]; /* Name - can be used to special case
- partition manager volumes */
- __u8 sector_size[2]; /* bytes per logical sector */
- __u8 cluster_size; /* sectors/cluster */
- __u16 reserved; /* reserved sectors */
- __u8 fats; /* number of FATs */
- __u8 dir_entries[2]; /* root directory entries */
- __u8 sectors[2]; /* number of sectors */
- __u8 media; /* media code (unused) */
- __u16 fat_length; /* sectors/FAT */
- __u16 secs_track; /* sectors per track */
- __u16 heads; /* number of heads */
- __u32 hidden; /* hidden sectors (unused) */
- __u32 total_sect; /* number of sectors (if sectors == 0) */
-
- /* The following fields are only used by FAT32 */
- __u32 fat32_length; /* sectors/FAT */
- __u16 flags; /* bit 8: fat mirroring, low 4: active fat */
- __u8 version[2]; /* major, minor filesystem version */
- __u32 root_cluster; /* first cluster in root directory */
- __u16 info_sector; /* filesystem info sector */
- __u16 backup_boot; /* backup boot sector */
- __u8 reserved2[12]; /* Unused */
-
- __u8 drive_number; /* Logical Drive Number */
- __u8 reserved3; /* Unused */
-
- __u8 extended_sig; /* Extended Signature (0x29) */
- __u32 serial; /* Serial number */
- __u8 label[11]; /* FS label */
- __u8 fs_type[8]; /* FS Type */
-
- /* fill up to 512 bytes */
- __u8 junk[422];
-} __attribute__ ((packed));
-
-struct boot_sector_16 {
- __u8 ignored[3]; /* Boot strap short or near jump */
- __u8 system_id[8]; /* Name - can be used to special case
- partition manager volumes */
- __u8 sector_size[2]; /* bytes per logical sector */
- __u8 cluster_size; /* sectors/cluster */
- __u16 reserved; /* reserved sectors */
- __u8 fats; /* number of FATs */
- __u8 dir_entries[2]; /* root directory entries */
- __u8 sectors[2]; /* number of sectors */
- __u8 media; /* media code (unused) */
- __u16 fat_length; /* sectors/FAT */
- __u16 secs_track; /* sectors per track */
- __u16 heads; /* number of heads */
- __u32 hidden; /* hidden sectors (unused) */
- __u32 total_sect; /* number of sectors (if sectors == 0) */
-
- __u8 drive_number; /* Logical Drive Number */
- __u8 reserved2; /* Unused */
-
- __u8 extended_sig; /* Extended Signature (0x29) */
- __u32 serial; /* Serial number */
- __u8 label[11]; /* FS label */
- __u8 fs_type[8]; /* FS Type */
-
- /* fill up to 512 bytes */
- __u8 junk[450];
-} __attribute__ ((packed));
-
-struct info_sector {
- __u32 magic; /* Magic for info sector ('RRaA') */
- __u8 junk[0x1dc];
- __u32 reserved1; /* Nothing as far as I can tell */
- __u32 signature; /* 0x61417272 ('rrAa') */
- __u32 free_clusters; /* Free cluster count. -1 if unknown */
- __u32 next_cluster; /* Most recently allocated cluster. */
- __u32 reserved2[3];
- __u16 reserved3;
- __u16 boot_sign;
-};
-
-typedef struct {
- __u8 name[8], ext[3]; /* name and extension */
- __u8 attr; /* attribute bits */
- __u8 lcase; /* Case for base and extension */
- __u8 ctime_ms; /* Creation time, milliseconds */
- __u16 ctime; /* Creation time */
- __u16 cdate; /* Creation date */
- __u16 adate; /* Last access date */
- __u16 starthi; /* High 16 bits of cluster in FAT32 */
- __u16 time, date, start; /* time, date and first cluster */
- __u32 size; /* file size (in bytes) */
-} __attribute__ ((packed)) DIR_ENT;
-
-typedef struct _dos_file {
- DIR_ENT dir_ent;
- char *lfn;
- loff_t offset;
- loff_t lfn_offset;
- struct _dos_file *parent; /* parent directory */
- struct _dos_file *next; /* next entry */
- struct _dos_file *first; /* first entry (directory only) */
-} DOS_FILE;
-
-typedef struct {
- unsigned long value;
- unsigned long reserved;
-} FAT_ENTRY;
-
-typedef struct {
- int nfats;
- loff_t fat_start;
- unsigned int fat_size; /* unit is bytes */
- unsigned int fat_bits; /* size of a FAT entry */
- unsigned int eff_fat_bits; /* # of used bits in a FAT entry */
- unsigned long root_cluster; /* 0 for old-style root dir */
- loff_t root_start;
- unsigned int root_entries;
- loff_t data_start;
- unsigned int cluster_size;
- unsigned long clusters;
- loff_t fsinfo_start; /* 0 if not present */
- long free_clusters;
- loff_t backupboot_start; /* 0 if not present */
- unsigned char *fat;
- DOS_FILE **cluster_owner;
- char *label;
-} DOS_FS;
-
-#ifndef offsetof
-#define offsetof(t,e) ((int)&(((t *)0)->e))
-#endif
-
-extern int interactive, rw, list, verbose, test, write_immed;
-extern int atari_format;
-extern unsigned n_files;
-extern void *mem_queue;
-extern unsigned retandroid;
-
-/* value to use as end-of-file marker */
-#define FAT_EOF(fs) ((atari_format ? 0xfff : 0xff8) | FAT_EXTD(fs))
-#define FAT_IS_EOF(fs,v) ((unsigned long)(v) >= (0xff8|FAT_EXTD(fs)))
-/* value to mark bad clusters */
-#define FAT_BAD(fs) (0xff7 | FAT_EXTD(fs))
-/* range of values used for bad clusters */
-#define FAT_MIN_BAD(fs) ((atari_format ? 0xff0 : 0xff7) | FAT_EXTD(fs))
-#define FAT_MAX_BAD(fs) ((atari_format ? 0xff7 : 0xff7) | FAT_EXTD(fs))
-#define FAT_IS_BAD(fs,v) ((v) >= FAT_MIN_BAD(fs) && (v) <= FAT_MAX_BAD(fs))
-
-/* return -16 as a number with fs->fat_bits bits */
-#define FAT_EXTD(fs) (((1 << fs->eff_fat_bits)-1) & ~0xf)
-
-/* marker for files with no 8.3 name */
-#define FAT_NO_83NAME 32
-
-#endif
diff --git a/dosfstools/src/fat.c b/dosfstools/src/fat.c
index 5a0dfb0f2..5a92f5684 100644
--- a/dosfstools/src/fat.c
+++ b/dosfstools/src/fat.c
@@ -2,6 +2,7 @@
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -29,7 +30,7 @@
#include <unistd.h>
#include "common.h"
-#include "dosfsck.h"
+#include "fsck.fat.h"
#include "io.h"
#include "check.h"
#include "fat.h"
@@ -42,7 +43,7 @@
* @param[in] cluster Cluster of interest
* @param[in] fs Information from the FAT boot sectors (bits per FAT entry)
*/
-void get_fat(FAT_ENTRY * entry, void *fat, unsigned long cluster, DOS_FS * fs)
+void get_fat(FAT_ENTRY * entry, void *fat, uint32_t cluster, DOS_FS * fs)
{
unsigned char *ptr;
@@ -53,13 +54,13 @@ void get_fat(FAT_ENTRY * entry, void *fat, unsigned long cluster, DOS_FS * fs)
(ptr[0] | ptr[1] << 8));
break;
case 16:
- entry->value = CF_LE_W(((unsigned short *)fat)[cluster]);
+ entry->value = le16toh(((unsigned short *)fat)[cluster]);
break;
case 32:
/* According to M$, the high 4 bits of a FAT32 entry are reserved and
* are not part of the cluster number. So we cut them off. */
{
- unsigned long e = CF_LE_L(((unsigned int *)fat)[cluster]);
+ uint32_t e = le32toh(((unsigned int *)fat)[cluster]);
entry->value = e & 0xfffffff;
entry->reserved = e >> 28;
}
@@ -79,24 +80,34 @@ void get_fat(FAT_ENTRY * entry, void *fat, unsigned long cluster, DOS_FS * fs)
*/
void read_fat(DOS_FS * fs)
{
- int eff_size;
- unsigned long i;
+ int eff_size, alloc_size;
+ uint32_t i;
void *first, *second = NULL;
int first_ok, second_ok;
- unsigned long total_num_clusters;
+ uint32_t total_num_clusters;
/* Clean up from previous pass */
- free(fs->fat);
- free(fs->cluster_owner);
+ if (fs->fat)
+ free(fs->fat);
+ if (fs->cluster_owner)
+ free(fs->cluster_owner);
fs->fat = NULL;
fs->cluster_owner = NULL;
total_num_clusters = fs->clusters + 2UL;
eff_size = (total_num_clusters * fs->fat_bits + 7) / 8ULL;
- first = alloc(eff_size);
+
+ if (fs->fat_bits != 12)
+ alloc_size = eff_size;
+ else
+ /* round up to an even number of FAT entries to avoid special
+ * casing the last entry in get_fat() */
+ alloc_size = (total_num_clusters * 12 + 23) / 24 * 3;
+
+ first = alloc(alloc_size);
fs_read(fs->fat_start, eff_size, first);
if (fs->nfats > 1) {
- second = alloc(eff_size);
+ second = alloc(alloc_size);
fs_read(fs->fat_start + fs->fat_size, eff_size, second);
}
if (second && memcmp(first, second, eff_size) != 0) {
@@ -148,13 +159,13 @@ void read_fat(DOS_FS * fs)
FAT_ENTRY curEntry;
get_fat(&curEntry, fs->fat, i, fs);
if (curEntry.value == 1) {
- printf("Cluster %ld out of range (1). Setting to EOF.\n", i - 2);
+ printf("Cluster %ld out of range (1). Setting to EOF.\n", (long)(i - 2));
set_fat(fs, i, -1);
}
if (curEntry.value >= fs->clusters + 2 &&
(curEntry.value < FAT_MIN_BAD(fs))) {
printf("Cluster %ld out of range (%ld > %ld). Setting to EOF.\n",
- i - 2, curEntry.value, fs->clusters + 2 - 1);
+ (long)(i - 2), (long)curEntry.value, (long)(fs->clusters + 2 - 1));
set_fat(fs, i, -1);
}
}
@@ -173,13 +184,13 @@ void read_fat(DOS_FS * fs)
* -1 == end-of-chain
* -2 == bad cluster
*/
-void set_fat(DOS_FS * fs, unsigned long cluster, unsigned long new)
+void set_fat(DOS_FS * fs, uint32_t cluster, int32_t new)
{
unsigned char *data = NULL;
int size;
loff_t offs;
- if ((long)new == -1)
+ if (new == -1)
new = FAT_EOF(fs);
else if ((long)new == -2)
new = FAT_BAD(fs);
@@ -204,7 +215,7 @@ void set_fat(DOS_FS * fs, unsigned long cluster, unsigned long new)
case 16:
data = fs->fat + cluster * 2;
offs = fs->fat_start + cluster * 2;
- *(unsigned short *)data = CT_LE_W(new);
+ *(unsigned short *)data = htole16(new);
size = 2;
break;
case 32:
@@ -216,7 +227,7 @@ void set_fat(DOS_FS * fs, unsigned long cluster, unsigned long new)
offs = fs->fat_start + cluster * 4;
/* According to M$, the high 4 bits of a FAT32 entry are reserved and
* are not part of the cluster number. So we never touch them. */
- *(unsigned long *)data = CT_LE_L((new & 0xfffffff) |
+ *(uint32_t *)data = htole32((new & 0xfffffff) |
(curEntry.reserved << 28));
size = 4;
}
@@ -230,7 +241,7 @@ void set_fat(DOS_FS * fs, unsigned long cluster, unsigned long new)
}
}
-int bad_cluster(DOS_FS * fs, unsigned long cluster)
+int bad_cluster(DOS_FS * fs, uint32_t cluster)
{
FAT_ENTRY curEntry;
get_fat(&curEntry, fs->fat, cluster, fs);
@@ -248,9 +259,9 @@ int bad_cluster(DOS_FS * fs, unsigned long cluster)
* @return -1 'cluster' is at the end of the chain
* @return Other values Next cluster in this chain
*/
-unsigned long next_cluster(DOS_FS * fs, unsigned long cluster)
+uint32_t next_cluster(DOS_FS * fs, uint32_t cluster)
{
- unsigned long value;
+ uint32_t value;
FAT_ENTRY curEntry;
get_fat(&curEntry, fs->fat, cluster, fs);
@@ -261,10 +272,10 @@ unsigned long next_cluster(DOS_FS * fs, unsigned long cluster)
return FAT_IS_EOF(fs, value) ? -1 : value;
}
-loff_t cluster_start(DOS_FS * fs, unsigned long cluster)
+loff_t cluster_start(DOS_FS * fs, uint32_t cluster)
{
return fs->data_start + ((loff_t) cluster -
- 2) * (unsigned long long)fs->cluster_size;
+ 2) * (uint64_t)fs->cluster_size;
}
/**
@@ -276,7 +287,7 @@ loff_t cluster_start(DOS_FS * fs, unsigned long cluster)
* @param[in] owner Information on dentry that owns this cluster
* (may be NULL)
*/
-void set_owner(DOS_FS * fs, unsigned long cluster, DOS_FILE * owner)
+void set_owner(DOS_FS * fs, uint32_t cluster, DOS_FILE * owner)
{
if (fs->cluster_owner == NULL)
die("Internal error: attempt to set owner in non-existent table");
@@ -287,7 +298,7 @@ void set_owner(DOS_FS * fs, unsigned long cluster, DOS_FILE * owner)
fs->cluster_owner[cluster] = owner;
}
-DOS_FILE *get_owner(DOS_FS * fs, unsigned long cluster)
+DOS_FILE *get_owner(DOS_FS * fs, uint32_t cluster)
{
if (fs->cluster_owner == NULL)
return NULL;
@@ -297,7 +308,7 @@ DOS_FILE *get_owner(DOS_FS * fs, unsigned long cluster)
void fix_bad(DOS_FS * fs)
{
- unsigned long i;
+ uint32_t i;
if (verbose)
printf("Checking for bad clusters.\n");
@@ -307,7 +318,7 @@ void fix_bad(DOS_FS * fs)
if (!get_owner(fs, i) && !FAT_IS_BAD(fs, curEntry.value))
if (!fs_test(cluster_start(fs, i), fs->cluster_size)) {
- printf("Cluster %lu is unreadable.\n", i);
+ printf("Cluster %lu is unreadable.\n", (unsigned long)i);
set_fat(fs, i, -2);
}
}
@@ -316,7 +327,7 @@ void fix_bad(DOS_FS * fs)
void reclaim_free(DOS_FS * fs)
{
int reclaimed;
- unsigned long i;
+ uint32_t i;
if (verbose)
printf("Checking for unused clusters.\n");
@@ -332,7 +343,7 @@ void reclaim_free(DOS_FS * fs)
}
}
if (reclaimed)
- printf("Reclaimed %d unused cluster%s (%llu bytes).\n", reclaimed,
+ printf("Reclaimed %d unused cluster%s (%llu bytes).\n", (int)reclaimed,
reclaimed == 1 ? "" : "s",
(unsigned long long)reclaimed * fs->cluster_size);
}
@@ -347,11 +358,11 @@ void reclaim_free(DOS_FS * fs)
* clusters link to it.
* @param[in] start_cluster Where to start scanning for orphans
*/
-static void tag_free(DOS_FS * fs, DOS_FILE * owner, unsigned long *num_refs,
- unsigned long start_cluster)
+static void tag_free(DOS_FS * fs, DOS_FILE * owner, uint32_t *num_refs,
+ uint32_t start_cluster)
{
int prev;
- unsigned long i, walk;
+ uint32_t i, walk;
if (start_cluster == 0)
start_cluster = 2;
@@ -400,16 +411,16 @@ void reclaim_file(DOS_FS * fs)
DOS_FILE orphan;
int reclaimed, files;
int changed = 0;
- unsigned long i, next, walk;
- unsigned long *num_refs = NULL; /* Only for orphaned clusters */
- unsigned long total_num_clusters;
+ uint32_t i, next, walk;
+ uint32_t *num_refs = NULL; /* Only for orphaned clusters */
+ uint32_t total_num_clusters;
if (verbose)
printf("Reclaiming unconnected clusters.\n");
total_num_clusters = fs->clusters + 2UL;
- num_refs = alloc(total_num_clusters * sizeof(unsigned long));
- memset(num_refs, 0, (total_num_clusters * sizeof(unsigned long)));
+ num_refs = alloc(total_num_clusters * sizeof(uint32_t));
+ memset(num_refs, 0, (total_num_clusters * sizeof(uint32_t)));
/* Guarantee that all orphan chains (except cycles) end cleanly
* with an end-of-chain mark.
@@ -454,7 +465,7 @@ void reclaim_file(DOS_FS * fs)
die("Internal error: num_refs going below zero");
set_fat(fs, i, -1);
changed = curEntry.value;
- printf("Broke cycle at cluster %lu in free chain.\n", i);
+ printf("Broke cycle at cluster %lu in free chain.\n", (unsigned long)i);
/* If we've created a new chain head,
* tag_free() can claim it
@@ -474,13 +485,13 @@ void reclaim_file(DOS_FS * fs)
DIR_ENT de;
loff_t offset;
files++;
- offset = alloc_rootdir_entry(fs, &de, "FSCK%04d");
- de.start = CT_LE_W(i & 0xffff);
+ offset = alloc_rootdir_entry(fs, &de, "FSCK%04dREC");
+ de.start = htole16(i & 0xffff);
if (fs->fat_bits == 32)
- de.starthi = CT_LE_W(i >> 16);
+ de.starthi = htole16(i >> 16);
for (walk = i; walk > 0 && walk != -1;
walk = next_cluster(fs, walk)) {
- de.size = CT_LE_L(CF_LE_L(de.size) + fs->cluster_size);
+ de.size = htole32(le32toh(de.size) + fs->cluster_size);
reclaimed++;
}
fs_write(offset, sizeof(DIR_ENT), &de);
@@ -494,10 +505,10 @@ void reclaim_file(DOS_FS * fs)
free(num_refs);
}
-unsigned long update_free(DOS_FS * fs)
+uint32_t update_free(DOS_FS * fs)
{
- unsigned long i;
- unsigned long free = 0;
+ uint32_t i;
+ uint32_t free = 0;
int do_set = 0;
for (i = 2; i < fs->clusters + 2; i++) {
@@ -516,7 +527,7 @@ unsigned long update_free(DOS_FS * fs)
if (fs->free_clusters != 0xFFFFFFFF) {
if (free != fs->free_clusters) {
printf("Free cluster summary wrong (%ld vs. really %ld)\n",
- fs->free_clusters, free);
+ (long)fs->free_clusters, (long)free);
if (interactive)
printf("1) Correct\n2) Don't correct\n");
else
@@ -525,7 +536,7 @@ unsigned long update_free(DOS_FS * fs)
do_set = 1;
}
} else {
- printf("Free cluster summary uninitialized (should be %ld)\n", free);
+ printf("Free cluster summary uninitialized (should be %ld)\n", (long)free);
if (rw) {
if (interactive)
printf("1) Set it\n2) Leave it uninitialized\n");
@@ -537,7 +548,7 @@ unsigned long update_free(DOS_FS * fs)
}
if (do_set) {
- unsigned long le_free = CT_LE_L(free);
+ uint32_t le_free = htole32(free);
fs->free_clusters = free;
fs_write(fs->fsinfo_start + offsetof(struct info_sector, free_clusters),
sizeof(le_free), &le_free);
diff --git a/dosfstools/src/fat.h b/dosfstools/src/fat.h
index 13ac1b345..b50ed4a96 100644
--- a/dosfstools/src/fat.h
+++ b/dosfstools/src/fat.h
@@ -1,6 +1,7 @@
/* fat.h - Read/write access to the FAT
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ THe complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -24,41 +25,41 @@
void read_fat(DOS_FS * fs);
-/* Loads the FAT of the file system described by FS. Initializes the FAT,
+/* Loads the FAT of the filesystem described by FS. Initializes the FAT,
replaces broken FATs and rejects invalid cluster entries. */
-void get_fat(FAT_ENTRY * entry, void *fat, unsigned long cluster, DOS_FS * fs);
+void get_fat(FAT_ENTRY * entry, void *fat, uint32_t cluster, DOS_FS * fs);
/* Retrieve the FAT entry (next chained cluster) for CLUSTER. */
-void set_fat(DOS_FS * fs, unsigned long cluster, unsigned long new);
+void set_fat(DOS_FS * fs, uint32_t cluster, int32_t new);
/* Changes the value of the CLUSTERth cluster of the FAT of FS to NEW. Special
values of NEW are -1 (EOF, 0xff8 or 0xfff8) and -2 (bad sector, 0xff7 or
0xfff7) */
-int bad_cluster(DOS_FS * fs, unsigned long cluster);
+int bad_cluster(DOS_FS * fs, uint32_t cluster);
/* Returns a non-zero integer if the CLUSTERth cluster is marked as bad or zero
otherwise. */
-unsigned long next_cluster(DOS_FS * fs, unsigned long cluster);
+uint32_t next_cluster(DOS_FS * fs, uint32_t cluster);
/* Returns the number of the cluster following CLUSTER, or -1 if this is the
last cluster of the respective cluster chain. CLUSTER must not be a bad
cluster. */
-loff_t cluster_start(DOS_FS * fs, unsigned long cluster);
+loff_t cluster_start(DOS_FS * fs, uint32_t cluster);
/* Returns the byte offset of CLUSTER, relative to the respective device. */
-void set_owner(DOS_FS * fs, unsigned long cluster, DOS_FILE * owner);
+void set_owner(DOS_FS * fs, uint32_t cluster, DOS_FILE * owner);
/* Sets the owner pointer of the respective cluster to OWNER. If OWNER was NULL
before, it can be set to NULL or any non-NULL value. Otherwise, only NULL is
accepted as the new value. */
-DOS_FILE *get_owner(DOS_FS * fs, unsigned long cluster);
+DOS_FILE *get_owner(DOS_FS * fs, uint32_t cluster);
/* Returns the owner of the repective cluster or NULL if the cluster has no
owner. */
@@ -77,7 +78,7 @@ void reclaim_file(DOS_FS * fs);
for them in the root directory. Also tries to fix all inconsistencies (e.g.
loops, shared clusters, etc.) in the process. */
-unsigned long update_free(DOS_FS * fs);
+uint32_t update_free(DOS_FS * fs);
/* Updates free cluster count in FSINFO sector. */
diff --git a/dosfstools/src/dosfslabel.c b/dosfstools/src/fatlabel.c
index 5e2d2824f..1484ba527 100644
--- a/dosfstools/src/dosfslabel.c
+++ b/dosfstools/src/fatlabel.c
@@ -1,8 +1,9 @@
-/* dosfslabel.c - User interface
+/* fatlabel.c - User interface
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
Copyright (C) 2007 Red Hat, Inc.
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -17,7 +18,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -29,13 +30,10 @@
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
-
-#ifdef _USING_BIONIC_
-#include <linux/fs.h>
-#endif
+#include <ctype.h>
#include "common.h"
-#include "dosfsck.h"
+#include "fsck.fat.h"
#include "io.h"
#include "boot.h"
#include "fat.h"
@@ -52,7 +50,7 @@ static void usage(int error)
FILE *f = error ? stderr : stdout;
int status = error ? 1 : 0;
- fprintf(f, "usage: dosfslabel device [label]\n");
+ fprintf(f, "usage: fatlabel device [label]\n");
exit(status);
}
@@ -86,11 +84,16 @@ static void check_atari(void)
int main(int argc, char *argv[])
{
- DOS_FS fs;
+ DOS_FS fs = { 0 };
rw = 0;
+ int i;
+
char *device = NULL;
- char *label = NULL;
+ char label[12] = { 0 };
+
+ loff_t offset;
+ DIR_ENT de;
check_atari();
@@ -100,25 +103,38 @@ int main(int argc, char *argv[])
if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
usage(0);
else if (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version")) {
- printf("dosfslabel " VERSION ", " VERSION_DATE ", FAT32, LFN\n");
+ printf("fatlabel " VERSION " (" VERSION_DATE ")\n");
exit(0);
}
device = argv[1];
if (argc == 3) {
- label = argv[2];
- if (strlen(label) > 11) {
+ strncpy(label, argv[2], 11);
+ if (strlen(argv[2]) > 11) {
fprintf(stderr,
- "dosfslabel: labels can be no longer than 11 characters\n");
+ "fatlabel: labels can be no longer than 11 characters\n");
exit(1);
}
+ for (i = 0; label[i] && i < 11; i++)
+ /* don't know if here should be more strict !uppercase(label[i]) */
+ if (islower(label[i])) {
+ fprintf(stderr,
+ "fatlabel: warning - lowercase labels might not work properly with DOS or Windows\n");
+ break;
+ }
rw = 1;
}
fs_open(device, rw);
read_boot(&fs);
+ if (fs.fat_bits == 32)
+ read_fat(&fs);
if (!rw) {
- fprintf(stdout, "%s\n", fs.label);
+ offset = find_volume_de(&fs, &de);
+ if (offset == 0)
+ fprintf(stdout, "%s\n", fs.label);
+ else
+ fprintf(stdout, "%.8s%.3s\n", de.name, de.ext);
exit(0);
}
diff --git a/dosfstools/src/file.c b/dosfstools/src/file.c
index a73b73f5e..dffcec1cd 100644
--- a/dosfstools/src/file.c
+++ b/dosfstools/src/file.c
@@ -2,6 +2,7 @@
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -29,16 +30,9 @@
#include <ctype.h>
#include <unistd.h>
-#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */
-#define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h> */
-#define _LINUX_FS_H /* hack to avoid inclusion of <linux/fs.h> */
-
-#include <asm/types.h>
-
-#include <linux/msdos_fs.h>
-
#include "common.h"
#include "file.h"
+#include "msdos_fs.h"
FDSC *fp_root = NULL;
diff --git a/dosfstools/src/file.h b/dosfstools/src/file.h
index 40bd58a92..eaaf356be 100644
--- a/dosfstools/src/file.h
+++ b/dosfstools/src/file.h
@@ -1,6 +1,7 @@
/* file.h - Additional file attributes
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,13 +16,15 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
#ifndef _FILE_H
#define _FILE_H
+#include "msdos_fs.h"
+
typedef enum { fdt_none, fdt_drop, fdt_undelete } FD_TYPE;
typedef struct _fptr {
diff --git a/dosfstools/src/dosfsck.c b/dosfstools/src/fsck.fat.c
index a7a59e1a1..2bc3dc216 100644
--- a/dosfstools/src/dosfsck.c
+++ b/dosfstools/src/fsck.fat.c
@@ -1,7 +1,8 @@
-/* dosfsck.c - User interface
+/* fsck.fat.c - User interface
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -33,7 +34,7 @@
#include <getopt.h>
#include "common.h"
-#include "dosfsck.h"
+#include "fsck.fat.h"
#include "io.h"
#include "boot.h"
#include "fat.h"
@@ -41,40 +42,31 @@
#include "check.h"
int interactive = 0, rw = 0, list = 0, test = 0, verbose = 0, write_immed = 0;
-int atari_format = 0;
+int atari_format = 0, boot_only = 0;
unsigned n_files = 0;
void *mem_queue = NULL;
-#ifdef USE_ANDROID_RETVALS
-unsigned retandroid = 1;
-#else
-unsigned retandroid = 0;
-#endif
-
static void usage(char *name)
{
- fprintf(stderr, "usage: %s [-aAflrtvVwy] [-d path -d ...] "
+ fprintf(stderr, "usage: %s [-aAbflrtvVwy] [-d path -d ...] "
"[-u path -u ...]\n%15sdevice\n", name, "");
- fprintf(stderr, " -a automatically repair the file system\n");
- fprintf(stderr, " -A toggle Atari file system format\n");
+ fprintf(stderr, " -a automatically repair the filesystem\n");
+ fprintf(stderr, " -A toggle Atari filesystem format\n");
+ fprintf(stderr, " -b make read-only boot sector check\n");
fprintf(stderr, " -d path drop that file\n");
- fprintf(stderr, " -f ignored\n");
+ fprintf(stderr, " -f salvage unused chains to files\n");
fprintf(stderr, " -l list path names\n");
fprintf(stderr,
" -n no-op, check non-interactively without changing\n");
fprintf(stderr, " -p same as -a, for compat with other *fsck\n");
- fprintf(stderr, " -r interactively repair the file system\n");
+ fprintf(stderr, " -r interactively repair the filesystem (default)\n");
fprintf(stderr, " -t test for bad clusters\n");
fprintf(stderr, " -u path try to undelete that (non-directory) file\n");
fprintf(stderr, " -v verbose mode\n");
fprintf(stderr, " -V perform a verification pass\n");
fprintf(stderr, " -w write changes to disk immediately\n");
fprintf(stderr, " -y same as -a, for compat with other *fsck\n");
- if (retandroid) {
- exit(1);
- } else {
- exit(2);
- }
+ exit(2);
}
/*
@@ -109,15 +101,14 @@ int main(int argc, char **argv)
{
DOS_FS fs;
int salvage_files, verify, c;
- unsigned n_files_check = 0, n_files_verify = 0;
- unsigned long free_clusters;
+ uint32_t free_clusters = 0;
memset(&fs, 0, sizeof(fs));
- rw = salvage_files = verify = 0;
- interactive = 1;
+ salvage_files = verify = 0;
+ rw = interactive = 1;
check_atari();
- while ((c = getopt(argc, argv, "Aad:flnprtu:vVwy")) != EOF)
+ while ((c = getopt(argc, argv, "Aad:bflnprtu:vVwy")) != -1)
switch (c) {
case 'A': /* toggle Atari format */
atari_format = !atari_format;
@@ -129,6 +120,11 @@ int main(int argc, char **argv)
interactive = 0;
salvage_files = 1;
break;
+ case 'b':
+ rw = 0;
+ interactive = 0;
+ boot_only = 1;
+ break;
case 'd':
file_add(optarg, fdt_drop);
break;
@@ -154,7 +150,6 @@ int main(int argc, char **argv)
break;
case 'v':
verbose = 1;
- printf("dosfsck " VERSION " (" VERSION_DATE ")\n");
break;
case 'V':
verify = 1;
@@ -166,33 +161,32 @@ int main(int argc, char **argv)
usage(argv[0]);
}
if ((test || write_immed) && !rw) {
- fprintf(stderr, "-t and -w require -a or -r\n");
- if (retandroid) {
- exit(1);
- } else {
- exit(2);
- }
+ fprintf(stderr, "-t and -w can not be used in read only mode\n");
+ exit(2);
}
if (optind != argc - 1)
usage(argv[0]);
- printf("dosfsck " VERSION ", " VERSION_DATE ", FAT32, LFN\n");
+ printf("fsck.fat " VERSION " (" VERSION_DATE ")\n");
fs_open(argv[optind], rw);
+
read_boot(&fs);
+ if (boot_only)
+ goto exit;
+
if (verify)
printf("Starting check/repair pass.\n");
while (read_fat(&fs), scan_root(&fs))
qfree(&mem_queue);
if (test)
fix_bad(&fs);
- if (salvage_files && 0)
+ if (salvage_files)
reclaim_file(&fs);
else
reclaim_free(&fs);
free_clusters = update_free(&fs);
file_unused();
qfree(&mem_queue);
- n_files_check = n_files;
if (verify) {
n_files = 0;
printf("Starting verification pass.\n");
@@ -200,9 +194,9 @@ int main(int argc, char **argv)
scan_root(&fs);
reclaim_free(&fs);
qfree(&mem_queue);
- n_files_verify = n_files;
}
+exit:
if (fs_changed()) {
if (rw) {
if (interactive)
@@ -210,15 +204,12 @@ int main(int argc, char **argv)
else
printf("Performing changes.\n");
} else
- printf("Leaving file system unchanged.\n");
+ printf("Leaving filesystem unchanged.\n");
}
- printf("%s: %u files, %lu/%lu clusters\n", argv[optind],
- n_files, fs.clusters - free_clusters, fs.clusters);
+ if (!boot_only)
+ printf("%s: %u files, %lu/%lu clusters\n", argv[optind],
+ n_files, (unsigned long)fs.clusters - free_clusters, (unsigned long)fs.clusters);
- if (retandroid) {
- return fs_close(rw) ? 4 : 0;
- } else {
- return fs_close(rw) ? 1 : 0;
- }
+ return fs_close(rw) ? 1 : 0;
}
diff --git a/dosfstools/src/fsck.fat.h b/dosfstools/src/fsck.fat.h
new file mode 100644
index 000000000..e5f617871
--- /dev/null
+++ b/dosfstools/src/fsck.fat.h
@@ -0,0 +1,191 @@
+/* fsck.fat.h - Common data structures and global variables
+
+ Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
+ Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+
+ The complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
+*/
+
+/* FAT32, VFAT, Atari format support, and various fixes additions May 1998
+ * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
+
+#ifndef _DOSFSCK_H
+#define _DOSFSCK_H
+
+#include <fcntl.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <endian.h>
+
+#include "msdos_fs.h"
+
+#define VFAT_LN_ATTR (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME)
+
+#define FAT_STATE_DIRTY 0x01
+
+/* ++roman: Use own definition of boot sector structure -- the kernel headers'
+ * name for it is msdos_boot_sector in 2.0 and fat_boot_sector in 2.1 ... */
+struct boot_sector {
+ uint8_t ignored[3]; /* Boot strap short or near jump */
+ uint8_t system_id[8]; /* Name - can be used to special case
+ partition manager volumes */
+ uint8_t sector_size[2]; /* bytes per logical sector */
+ uint8_t cluster_size; /* sectors/cluster */
+ uint16_t reserved; /* reserved sectors */
+ uint8_t fats; /* number of FATs */
+ uint8_t dir_entries[2]; /* root directory entries */
+ uint8_t sectors[2]; /* number of sectors */
+ uint8_t media; /* media code (unused) */
+ uint16_t fat_length; /* sectors/FAT */
+ uint16_t secs_track; /* sectors per track */
+ uint16_t heads; /* number of heads */
+ uint32_t hidden; /* hidden sectors (unused) */
+ uint32_t total_sect; /* number of sectors (if sectors == 0) */
+
+ /* The following fields are only used by FAT32 */
+ uint32_t fat32_length; /* sectors/FAT */
+ uint16_t flags; /* bit 8: fat mirroring, low 4: active fat */
+ uint8_t version[2]; /* major, minor filesystem version */
+ uint32_t root_cluster; /* first cluster in root directory */
+ uint16_t info_sector; /* filesystem info sector */
+ uint16_t backup_boot; /* backup boot sector */
+ uint8_t reserved2[12]; /* Unused */
+
+ uint8_t drive_number; /* Logical Drive Number */
+ uint8_t reserved3; /* Unused */
+
+ uint8_t extended_sig; /* Extended Signature (0x29) */
+ uint32_t serial; /* Serial number */
+ uint8_t label[11]; /* FS label */
+ uint8_t fs_type[8]; /* FS Type */
+
+ /* fill up to 512 bytes */
+ uint8_t junk[422];
+} __attribute__ ((packed));
+
+struct boot_sector_16 {
+ uint8_t ignored[3]; /* Boot strap short or near jump */
+ uint8_t system_id[8]; /* Name - can be used to special case
+ partition manager volumes */
+ uint8_t sector_size[2]; /* bytes per logical sector */
+ uint8_t cluster_size; /* sectors/cluster */
+ uint16_t reserved; /* reserved sectors */
+ uint8_t fats; /* number of FATs */
+ uint8_t dir_entries[2]; /* root directory entries */
+ uint8_t sectors[2]; /* number of sectors */
+ uint8_t media; /* media code (unused) */
+ uint16_t fat_length; /* sectors/FAT */
+ uint16_t secs_track; /* sectors per track */
+ uint16_t heads; /* number of heads */
+ uint32_t hidden; /* hidden sectors (unused) */
+ uint32_t total_sect; /* number of sectors (if sectors == 0) */
+
+ uint8_t drive_number; /* Logical Drive Number */
+ uint8_t reserved2; /* Unused */
+
+ uint8_t extended_sig; /* Extended Signature (0x29) */
+ uint32_t serial; /* Serial number */
+ uint8_t label[11]; /* FS label */
+ uint8_t fs_type[8]; /* FS Type */
+
+ /* fill up to 512 bytes */
+ uint8_t junk[450];
+} __attribute__ ((packed));
+
+struct info_sector {
+ uint32_t magic; /* Magic for info sector ('RRaA') */
+ uint8_t junk[0x1dc];
+ uint32_t reserved1; /* Nothing as far as I can tell */
+ uint32_t signature; /* 0x61417272 ('rrAa') */
+ uint32_t free_clusters; /* Free cluster count. -1 if unknown */
+ uint32_t next_cluster; /* Most recently allocated cluster. */
+ uint32_t reserved2[3];
+ uint16_t reserved3;
+ uint16_t boot_sign;
+};
+
+typedef struct {
+ uint8_t name[8], ext[3]; /* name and extension */
+ uint8_t attr; /* attribute bits */
+ uint8_t lcase; /* Case for base and extension */
+ uint8_t ctime_ms; /* Creation time, milliseconds */
+ uint16_t ctime; /* Creation time */
+ uint16_t cdate; /* Creation date */
+ uint16_t adate; /* Last access date */
+ uint16_t starthi; /* High 16 bits of cluster in FAT32 */
+ uint16_t time, date, start; /* time, date and first cluster */
+ uint32_t size; /* file size (in bytes) */
+} __attribute__ ((packed)) DIR_ENT;
+
+typedef struct _dos_file {
+ DIR_ENT dir_ent;
+ char *lfn;
+ loff_t offset;
+ loff_t lfn_offset;
+ struct _dos_file *parent; /* parent directory */
+ struct _dos_file *next; /* next entry */
+ struct _dos_file *first; /* first entry (directory only) */
+} DOS_FILE;
+
+typedef struct {
+ uint32_t value;
+ uint32_t reserved;
+} FAT_ENTRY;
+
+typedef struct {
+ int nfats;
+ loff_t fat_start;
+ unsigned int fat_size; /* unit is bytes */
+ unsigned int fat_bits; /* size of a FAT entry */
+ unsigned int eff_fat_bits; /* # of used bits in a FAT entry */
+ uint32_t root_cluster; /* 0 for old-style root dir */
+ loff_t root_start;
+ unsigned int root_entries;
+ loff_t data_start;
+ unsigned int cluster_size;
+ uint32_t clusters;
+ loff_t fsinfo_start; /* 0 if not present */
+ long free_clusters;
+ loff_t backupboot_start; /* 0 if not present */
+ unsigned char *fat;
+ DOS_FILE **cluster_owner;
+ char *label;
+} DOS_FS;
+
+extern int interactive, rw, list, verbose, test, write_immed;
+extern int atari_format;
+extern unsigned n_files;
+extern void *mem_queue;
+
+/* value to use as end-of-file marker */
+#define FAT_EOF(fs) ((atari_format ? 0xfff : 0xff8) | FAT_EXTD(fs))
+#define FAT_IS_EOF(fs,v) ((uint32_t)(v) >= (0xff8|FAT_EXTD(fs)))
+/* value to mark bad clusters */
+#define FAT_BAD(fs) (0xff7 | FAT_EXTD(fs))
+/* range of values used for bad clusters */
+#define FAT_MIN_BAD(fs) ((atari_format ? 0xff0 : 0xff7) | FAT_EXTD(fs))
+#define FAT_MAX_BAD(fs) ((atari_format ? 0xff7 : 0xff7) | FAT_EXTD(fs))
+#define FAT_IS_BAD(fs,v) ((v) >= FAT_MIN_BAD(fs) && (v) <= FAT_MAX_BAD(fs))
+
+/* return -16 as a number with fs->fat_bits bits */
+#define FAT_EXTD(fs) (((1 << fs->eff_fat_bits)-1) & ~0xf)
+
+/* marker for files with no 8.3 name */
+#define FAT_NO_83NAME 32
+
+#endif
diff --git a/dosfstools/src/io.c b/dosfstools/src/io.c
index a703c2db1..450432c8e 100644
--- a/dosfstools/src/io.c
+++ b/dosfstools/src/io.c
@@ -2,6 +2,7 @@
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -30,7 +31,6 @@
* by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
#define _LARGEFILE64_SOURCE
-#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -41,7 +41,7 @@
#include <fcntl.h>
#include <linux/fd.h>
-#include "dosfsck.h"
+#include "fsck.fat.h"
#include "common.h"
#include "io.h"
@@ -132,9 +132,11 @@ void fs_read(loff_t pos, int size, void *data)
if (walk->pos < pos + size && walk->pos + walk->size > pos) {
if (walk->pos < pos)
memcpy(data, (char *)walk->data + pos - walk->pos, min(size,
- walk->size
- - pos +
- walk->pos));
+ walk->
+ size -
+ pos +
+ walk->
+ pos));
else
memcpy((char *)data + walk->pos - pos, walk->data,
min(walk->size, size + pos - walk->pos));
@@ -220,7 +222,7 @@ int fs_close(int write)
changes = next;
}
if (close(fd) < 0)
- pdie("closing file system");
+ pdie("closing filesystem");
return changed || did_change;
}
diff --git a/dosfstools/src/io.h b/dosfstools/src/io.h
index 2db4ea7ac..d23d07ee3 100644
--- a/dosfstools/src/io.h
+++ b/dosfstools/src/io.h
@@ -2,6 +2,7 @@
Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -16,7 +17,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -26,7 +27,7 @@
#ifndef _IO_H
#define _IO_H
-#include <sys/types.h> /* for loff_t */
+#include <fcntl.h> /* for loff_t */
loff_t llseek(int fd, loff_t offset, int whence);
@@ -34,7 +35,7 @@ loff_t llseek(int fd, loff_t offset, int whence);
void fs_open(char *path, int rw);
-/* Opens the file system PATH. If RW is zero, the file system is opened
+/* Opens the filesystem PATH. If RW is zero, the filesystem is opened
read-only, otherwise, it is opened read-write. */
void fs_read(loff_t pos, int size, void *data);
@@ -55,13 +56,13 @@ void fs_write(loff_t pos, int size, void *data);
int fs_close(int write);
-/* Closes the file system, performs all pending changes if WRITE is non-zero
+/* Closes the filesystem, performs all pending changes if WRITE is non-zero
and removes the list of changes. Returns a non-zero integer if the file
system has been changed since the last fs_open, zero otherwise. */
int fs_changed(void);
-/* Determines whether the file system has changed. See fs_close. */
+/* Determines whether the filesystem has changed. See fs_close. */
extern unsigned device_no;
diff --git a/dosfstools/src/lfn.c b/dosfstools/src/lfn.c
index 736491cb0..2601172ee 100644
--- a/dosfstools/src/lfn.c
+++ b/dosfstools/src/lfn.c
@@ -1,6 +1,7 @@
/* lfn.c - Functions for handling VFAT long filenames
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,11 +16,12 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
#include <stdio.h>
+#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
@@ -27,19 +29,19 @@
#include "common.h"
#include "io.h"
-#include "dosfsck.h"
+#include "fsck.fat.h"
#include "lfn.h"
#include "file.h"
typedef struct {
- __u8 id; /* sequence number for slot */
- __u8 name0_4[10]; /* first 5 characters in name */
- __u8 attr; /* attribute byte */
- __u8 reserved; /* always 0 */
- __u8 alias_checksum; /* checksum for 8.3 alias */
- __u8 name5_10[12]; /* 6 more characters in name */
- __u16 start; /* starting cluster number, 0 in long slots */
- __u8 name11_12[4]; /* last 2 characters in name */
+ uint8_t id; /* sequence number for slot */
+ uint8_t name0_4[10]; /* first 5 characters in name */
+ uint8_t attr; /* attribute byte */
+ uint8_t reserved; /* always 0 */
+ uint8_t alias_checksum; /* checksum for 8.3 alias */
+ uint8_t name5_10[12]; /* 6 more characters in name */
+ uint16_t start; /* starting cluster number, 0 in long slots */
+ uint8_t name11_12[4]; /* last 2 characters in name */
} LFN_ENT;
#define LFN_ID_START 0x40
@@ -85,6 +87,22 @@ static unsigned char fat_uni2esc[64] = {
(cnv_unicode( lfn_unicode+(lfn_slot*CHARS_PER_LFN*2), \
lfn_parts*CHARS_PER_LFN, 0 ))
+#define BYTES_TO_WCHAR(cl,ch) ((wchar_t)((unsigned)(cl) + ((unsigned)(ch) << 8)))
+static size_t mbslen(wchar_t x)
+{
+ wchar_t wstr[] = { x, 0 };
+ return wcstombs(NULL, wstr, 0);
+}
+
+static size_t wctombs(char *dest, wchar_t x)
+{
+ wchar_t wstr[] = { x, 0 };
+ size_t size = wcstombs(NULL, wstr, 0);
+ if (size != (size_t) - 1)
+ size = wcstombs(dest, wstr, size + 1);
+ return size;
+}
+
/* This function converts an unicode string to a normal ASCII string, assuming
* ISO-8859-1 charset. Characters not in 8859-1 are converted to the same
* escape notation as used by the kernel, i.e. the uuencode-like ":xxx" */
@@ -93,10 +111,13 @@ static char *cnv_unicode(const unsigned char *uni, int maxlen, int use_q)
const unsigned char *up;
unsigned char *out, *cp;
int len, val;
+ size_t x;
for (len = 0, up = uni; (up - uni) / 2 < maxlen && (up[0] || up[1]);
up += 2) {
- if (UNICODE_CONVERTABLE(up[0], up[1]))
+ if ((x = mbslen(BYTES_TO_WCHAR(up[0], up[1]))) != (size_t) - 1)
+ len += x;
+ else if (UNICODE_CONVERTABLE(up[0], up[1]))
++len;
else
len += 4;
@@ -104,7 +125,10 @@ static char *cnv_unicode(const unsigned char *uni, int maxlen, int use_q)
cp = out = use_q ? qalloc(&mem_queue, len + 1) : alloc(len + 1);
for (up = uni; (up - uni) / 2 < maxlen && (up[0] || up[1]); up += 2) {
- if (UNICODE_CONVERTABLE(up[0], up[1]))
+ if ((x =
+ wctombs((char *)cp, BYTES_TO_WCHAR(up[0], up[1]))) != (size_t) - 1)
+ cp += x;
+ else if (UNICODE_CONVERTABLE(up[0], up[1]))
*cp++ = up[0];
else {
/* here the same escape notation is used as in the Linux kernel */
@@ -150,7 +174,7 @@ static void clear_lfn_slots(int start, int end)
void lfn_fix_checksum(loff_t from, loff_t to, const char *short_name)
{
int i;
- __u8 sum;
+ uint8_t sum;
for (sum = 0, i = 0; i < 11; i++)
sum = (((sum & 1) << 7) | ((sum & 0xfe) >> 1)) + short_name[i];
@@ -366,7 +390,7 @@ void lfn_add_slot(DIR_ENT * de, loff_t dir_offset)
sizeof(lfn->reserved), &lfn->reserved);
}
}
- if (lfn->start != CT_LE_W(0)) {
+ if (lfn->start != htole16(0)) {
printf("Start cluster field in VFAT long filename slot is not 0 "
"(but 0x%04x).\n", lfn->start);
if (interactive)
@@ -374,7 +398,7 @@ void lfn_add_slot(DIR_ENT * de, loff_t dir_offset)
else
printf("Auto-setting to 0.\n");
if (!interactive || get_key("12", "?") == '1') {
- lfn->start = CT_LE_W(0);
+ lfn->start = htole16(0);
fs_write(dir_offset + offsetof(LFN_ENT, start),
sizeof(lfn->start), &lfn->start);
}
@@ -386,7 +410,7 @@ void lfn_add_slot(DIR_ENT * de, loff_t dir_offset)
char *lfn_get(DIR_ENT * de, loff_t * lfn_offset)
{
char *lfn;
- __u8 sum;
+ uint8_t sum;
int i;
*lfn_offset = 0;
@@ -430,7 +454,7 @@ char *lfn_get(DIR_ENT * de, loff_t * lfn_offset)
return NULL;
case '3':
for (i = 0; i < lfn_parts; ++i) {
- __u8 id = (lfn_parts - i) | (i == 0 ? LFN_ID_START : 0);
+ uint8_t id = (lfn_parts - i) | (i == 0 ? LFN_ID_START : 0);
fs_write(lfn_offsets[i] + offsetof(LFN_ENT, id),
sizeof(id), &id);
}
@@ -440,8 +464,10 @@ char *lfn_get(DIR_ENT * de, loff_t * lfn_offset)
}
}
- for (sum = 0, i = 0; i < 11; i++)
+ for (sum = 0, i = 0; i < 8; i++)
sum = (((sum & 1) << 7) | ((sum & 0xfe) >> 1)) + de->name[i];
+ for (i = 0; i < 3; i++)
+ sum = (((sum & 1) << 7) | ((sum & 0xfe) >> 1)) + de->ext[i];
if (sum != lfn_checksum) {
/* checksum doesn't match, long name doesn't apply to this alias */
/* Causes: 1) alias renamed */
diff --git a/dosfstools/src/lfn.h b/dosfstools/src/lfn.h
index 2ea44a725..e5c3991ff 100644
--- a/dosfstools/src/lfn.h
+++ b/dosfstools/src/lfn.h
@@ -1,6 +1,7 @@
/* lfn.h - Functions for handling VFAT long filenames
Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,7 +16,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
diff --git a/dosfstools/src/mkdosfs.c b/dosfstools/src/mkfs.fat.c
index 9873bef12..dddbe2472 100644
--- a/dosfstools/src/mkdosfs.c
+++ b/dosfstools/src/mkfs.fat.c
@@ -1,10 +1,11 @@
-/* mkdosfs.c - utility to create FAT/MS-DOS filesystems
+/* mkfs.fat.c - utility to create FAT/MS-DOS filesystems
Copyright (C) 1991 Linus Torvalds <torvalds@klaava.helsinki.fi>
Copyright (C) 1992-1993 Remy Card <card@masi.ibp.fr>
Copyright (C) 1993-1994 David Hudson <dave@humbug.demon.co.uk>
Copyright (C) 1998 H. Peter Anvin <hpa@zytor.com>
Copyright (C) 1998-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -19,7 +20,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
@@ -27,7 +28,7 @@
under Linux. A lot of the basic structure of this program has been
borrowed from Remy Card's "mke2fs" code.
- As far as possible the aim here is to make the "mkdosfs" command
+ As far as possible the aim here is to make the "mkfs.fat" command
look almost identical to the other Linux filesystem make utilties,
eg bad blocks are still specified as blocks, not sectors, but when
it comes down to it, DOS is tied to the idea of a sector (512 bytes
@@ -47,11 +48,8 @@
#include <fcntl.h>
#include <linux/hdreg.h>
-#if defined(_USING_BIONIC_)
-#include <linux/fs.h>
-#else
#include <sys/mount.h>
-#endif
+#include <linux/fs.h>
#include <linux/fd.h>
#include <endian.h>
#include <mntent.h>
@@ -62,43 +60,19 @@
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/time.h>
-#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
+#include <ctype.h>
+#include <stdint.h>
+#include <endian.h>
+#include <getopt.h>
-#include <asm/types.h>
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-
-#include <asm/byteorder.h>
-#ifdef __le16_to_cpu
-/* ++roman: 2.1 kernel headers define these function, they're probably more
- * efficient then coding the swaps machine-independently. */
-#define CF_LE_W __le16_to_cpu
-#define CF_LE_L __le32_to_cpu
-#define CT_LE_W __cpu_to_le16
-#define CT_LE_L __cpu_to_le32
-#else
-#define CF_LE_W(v) ((((v) & 0xff) << 8) | (((v) >> 8) & 0xff))
-#define CF_LE_L(v) (((unsigned)(v)>>24) | (((unsigned)(v)>>8)&0xff00) | \
- (((unsigned)(v)<<8)&0xff0000) | ((unsigned)(v)<<24))
-#define CT_LE_W(v) CF_LE_W(v)
-#define CT_LE_L(v) CF_LE_L(v)
-#endif /* defined(__le16_to_cpu) */
-
-#else
-
-#define CF_LE_W(v) (v)
-#define CF_LE_L(v) (v)
-#define CT_LE_W(v) (v)
-#define CT_LE_L(v) (v)
-
-#endif /* __BIG_ENDIAN */
+#include "msdos_fs.h"
/* In earlier versions, an own llseek() was used, but glibc lseek() is
* sufficient (or even better :) for 64 bit offsets in the meantime */
-#define llseek lseek64
+#define llseek lseek
/* Constant definitions */
@@ -109,6 +83,8 @@
#define HARD_SECTOR_SIZE 512
#define SECTORS_PER_BLOCK ( BLOCK_SIZE / HARD_SECTOR_SIZE )
+#define NO_NAME "NO NAME "
+
/* Macro definitions */
/* Report a failure message and return a failure error code */
@@ -121,26 +97,11 @@
/* Compute ceil(a/b) */
-inline int cdiv(int a, int b)
+static inline int cdiv(int a, int b)
{
return (a + b - 1) / b;
}
-/* MS-DOS filesystem structures -- I included them here instead of
- including linux/msdos_fs.h since that doesn't include some fields we
- need */
-
-#define ATTR_RO 1 /* read-only */
-#define ATTR_HIDDEN 2 /* hidden */
-#define ATTR_SYS 4 /* system */
-#define ATTR_VOLUME 8 /* volume label */
-#define ATTR_DIR 16 /* directory */
-#define ATTR_ARCH 32 /* archived */
-
-#define ATTR_NONE 0 /* no attribute bits */
-#define ATTR_UNUSED (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
- /* attribute bits that are copied "as is" */
-
/* FAT values */
#define FAT_EOF (atari_format ? 0x0fffffff : 0x0ffffff8)
#define FAT_BAD 0x0ffffff7
@@ -172,80 +133,67 @@ inline int cdiv(int a, int b)
* alignments */
struct msdos_volume_info {
- __u8 drive_number; /* BIOS drive number */
- __u8 RESERVED; /* Unused */
- __u8 ext_boot_sign; /* 0x29 if fields below exist (DOS 3.3+) */
- __u8 volume_id[4]; /* Volume ID number */
- __u8 volume_label[11]; /* Volume label */
- __u8 fs_type[8]; /* Typically FAT12 or FAT16 */
+ uint8_t drive_number; /* BIOS drive number */
+ uint8_t RESERVED; /* Unused */
+ uint8_t ext_boot_sign; /* 0x29 if fields below exist (DOS 3.3+) */
+ uint8_t volume_id[4]; /* Volume ID number */
+ uint8_t volume_label[11]; /* Volume label */
+ uint8_t fs_type[8]; /* Typically FAT12 or FAT16 */
} __attribute__ ((packed));
struct msdos_boot_sector {
- __u8 boot_jump[3]; /* Boot strap short or near jump */
- __u8 system_id[8]; /* Name - can be used to special case
+ uint8_t boot_jump[3]; /* Boot strap short or near jump */
+ uint8_t system_id[8]; /* Name - can be used to special case
partition manager volumes */
- __u8 sector_size[2]; /* bytes per logical sector */
- __u8 cluster_size; /* sectors/cluster */
- __u16 reserved; /* reserved sectors */
- __u8 fats; /* number of FATs */
- __u8 dir_entries[2]; /* root directory entries */
- __u8 sectors[2]; /* number of sectors */
- __u8 media; /* media code (unused) */
- __u16 fat_length; /* sectors/FAT */
- __u16 secs_track; /* sectors per track */
- __u16 heads; /* number of heads */
- __u32 hidden; /* hidden sectors (unused) */
- __u32 total_sect; /* number of sectors (if sectors == 0) */
+ uint8_t sector_size[2]; /* bytes per logical sector */
+ uint8_t cluster_size; /* sectors/cluster */
+ uint16_t reserved; /* reserved sectors */
+ uint8_t fats; /* number of FATs */
+ uint8_t dir_entries[2]; /* root directory entries */
+ uint8_t sectors[2]; /* number of sectors */
+ uint8_t media; /* media code (unused) */
+ uint16_t fat_length; /* sectors/FAT */
+ uint16_t secs_track; /* sectors per track */
+ uint16_t heads; /* number of heads */
+ uint32_t hidden; /* hidden sectors (unused) */
+ uint32_t total_sect; /* number of sectors (if sectors == 0) */
union {
struct {
struct msdos_volume_info vi;
- __u8 boot_code[BOOTCODE_SIZE];
+ uint8_t boot_code[BOOTCODE_SIZE];
} __attribute__ ((packed)) _oldfat;
struct {
- __u32 fat32_length; /* sectors/FAT */
- __u16 flags; /* bit 8: fat mirroring, low 4: active fat */
- __u8 version[2]; /* major, minor filesystem version */
- __u32 root_cluster; /* first cluster in root directory */
- __u16 info_sector; /* filesystem info sector */
- __u16 backup_boot; /* backup boot sector */
- __u16 reserved2[6]; /* Unused */
+ uint32_t fat32_length; /* sectors/FAT */
+ uint16_t flags; /* bit 8: fat mirroring, low 4: active fat */
+ uint8_t version[2]; /* major, minor filesystem version */
+ uint32_t root_cluster; /* first cluster in root directory */
+ uint16_t info_sector; /* filesystem info sector */
+ uint16_t backup_boot; /* backup boot sector */
+ uint16_t reserved2[6]; /* Unused */
struct msdos_volume_info vi;
- __u8 boot_code[BOOTCODE_FAT32_SIZE];
+ uint8_t boot_code[BOOTCODE_FAT32_SIZE];
} __attribute__ ((packed)) _fat32;
} __attribute__ ((packed)) fstype;
- __u16 boot_sign;
+ uint16_t boot_sign;
} __attribute__ ((packed));
#define fat32 fstype._fat32
#define oldfat fstype._oldfat
struct fat32_fsinfo {
- __u32 reserved1; /* Nothing as far as I can tell */
- __u32 signature; /* 0x61417272L */
- __u32 free_clusters; /* Free cluster count. -1 if unknown */
- __u32 next_cluster; /* Most recently allocated cluster.
+ uint32_t reserved1; /* Nothing as far as I can tell */
+ uint32_t signature; /* 0x61417272L */
+ uint32_t free_clusters; /* Free cluster count. -1 if unknown */
+ uint32_t next_cluster; /* Most recently allocated cluster.
* Unused under Linux. */
- __u32 reserved2[4];
+ uint32_t reserved2[4];
};
-struct msdos_dir_entry {
- char name[8], ext[3]; /* name and extension */
- __u8 attr; /* attribute bits */
- __u8 lcase; /* Case for base and extension */
- __u8 ctime_ms; /* Creation time, milliseconds */
- __u16 ctime; /* Creation time */
- __u16 cdate; /* Creation date */
- __u16 adate; /* Last access date */
- __u16 starthi; /* high 16 bits of first cl. (FAT32) */
- __u16 time, date, start; /* time, date and first cluster */
- __u32 size; /* file size (in bytes) */
-} __attribute__ ((packed));
-
/* The "boot code" we put into the filesystem... it writes a message and
tells the user to try again */
-char dummy_boot_jump[3] = { 0xeb, 0x3c, 0x90 };
+unsigned char dummy_boot_jump[3] = { 0xeb, 0x3c, 0x90 };
-char dummy_boot_jump_m68k[2] = { 0x60, 0x1c };
+unsigned char dummy_boot_jump_m68k[2] = { 0x60, 0x1c };
#define MSG_OFFSET_OFFSET 3
char dummy_boot_code[BOOTCODE_SIZE] = "\x0e" /* push cs */
@@ -274,16 +222,15 @@ char dummy_boot_code[BOOTCODE_SIZE] = "\x0e" /* push cs */
/* Global variables - the root of all evil :-) - see these and weep! */
-static char *program_name = "mkdosfs"; /* Name of the program */
+static const char *program_name = "mkfs.fat"; /* Name of the program */
static char *device_name = NULL; /* Name of the device on which to create the filesystem */
static int atari_format = 0; /* Use Atari variation of MS-DOS FS format */
static int check = FALSE; /* Default to no readablity checking */
static int verbose = 0; /* Default to verbose mode off */
static long volume_id; /* Volume ID number */
static time_t create_time; /* Creation time */
-static struct timeval create_timeval; /* Creation time */
-static char volume_name[] = " "; /* Volume name */
-static unsigned long long blocks; /* Number of blocks in filesystem */
+static char volume_name[] = NO_NAME; /* Volume name */
+static uint64_t blocks; /* Number of blocks in filesystem */
static int sector_size = 512; /* Size of a logical sector */
static int sector_size_set = 0; /* User selected sector size */
static int backup_boot = 0; /* Sector# of backup boot sector */
@@ -307,9 +254,16 @@ static int sectors_per_cluster = 0; /* Number of sectors per disk cluster */
static int root_dir_entries = 0; /* Number of root directory entries */
static char *blank_sector; /* Blank sector - all zeros */
static int hidden_sectors = 0; /* Number of hidden sectors */
+static int hidden_sectors_by_user = 0; /* -h option invoked */
+static int drive_number_option = 0; /* drive number */
+static int drive_number_by_user = 0; /* drive number option invoked */
+static int fat_media_byte = 0; /* media byte in header and starting FAT */
static int malloc_entire_fat = FALSE; /* Whether we should malloc() the entire FAT or not */
static int align_structures = TRUE; /* Whether to enforce alignment */
static int orphaned_sectors = 0; /* Sectors that exist in the last block of filesystem */
+static int invariant = 0; /* Whether to set normally randomized or
+ current time based values to
+ constants */
/* Function prototype definitions */
@@ -321,7 +275,7 @@ static void alarm_intr(int alnum);
static void check_blocks(void);
static void get_list_blocks(char *filename);
static int valid_offset(int fd, loff_t offset);
-static unsigned long long count_blocks(char *filename, int *remainder);
+static uint64_t count_blocks(char *filename, int *remainder);
static void check_mount(char *device_name);
static void establish_params(int device_num, int size);
static void setup_tables(void);
@@ -416,6 +370,8 @@ static long do_check(char *buffer, int try, off_t current_block)
static void alarm_intr(int alnum)
{
+ (void)alnum;
+
if (currently_testing >= blocks)
return;
@@ -474,7 +430,7 @@ static void get_list_blocks(char *filename)
{
int i;
FILE *listfile;
- unsigned long blockno;
+ long blockno;
listfile = fopen(filename, "r");
if (listfile == (FILE *) NULL)
@@ -508,8 +464,7 @@ static int valid_offset(int fd, loff_t offset)
/* Given a filename, look to see how many blocks of BLOCK_SIZE are present, returning the answer */
-static unsigned long long count_blocks(char *filename, int *remainder)
-
+static uint64_t count_blocks(char *filename, int *remainder)
{
loff_t high, low;
int fd;
@@ -535,15 +490,14 @@ static unsigned long long count_blocks(char *filename, int *remainder)
}
close(fd);
- *remainder = (low%BLOCK_SIZE)/sector_size;
- return(low / BLOCK_SIZE);
+ *remainder = (low % BLOCK_SIZE) / sector_size;
+ return (low / BLOCK_SIZE);
}
/* Check to see if the specified device is currently mounted - abort if it is */
static void check_mount(char *device_name)
{
-#if ! defined(_USING_BIONIC_)
FILE *f;
struct mntent *mnt;
@@ -551,9 +505,8 @@ static void check_mount(char *device_name)
return;
while ((mnt = getmntent(f)) != NULL)
if (strcmp(device_name, mnt->mnt_fsname) == 0)
- die("%s contains a mounted file system.");
+ die("%s contains a mounted filesystem.");
endmntent(f);
-#endif
}
/* Establish the geometry and media parameters for the device */
@@ -603,8 +556,8 @@ static void establish_params(int device_num, int size)
if (ioctl(dev, FDGETPRM, &param)) /* Can we get the diskette geometry? */
die("unable to get diskette geometry for '%s'");
}
- bs.secs_track = CT_LE_W(param.sect); /* Set up the geometry information */
- bs.heads = CT_LE_W(param.head);
+ bs.secs_track = htole16(param.sect); /* Set up the geometry information */
+ bs.heads = htole16(param.head);
switch (param.size) { /* Set up the media descriptor byte */
case 720: /* 5.25", 2, 9, 40 - 360K */
bs.media = (char)0xfd;
@@ -649,32 +602,32 @@ floppy_default:
switch (loop_size) { /* Assuming the loop device -> floppy later */
case 720: /* 5.25", 2, 9, 40 - 360K */
- bs.secs_track = CF_LE_W(9);
- bs.heads = CF_LE_W(2);
+ bs.secs_track = le16toh(9);
+ bs.heads = le16toh(2);
bs.media = (char)0xfd;
bs.cluster_size = (char)2;
def_root_dir_entries = 112;
break;
case 1440: /* 3.5", 2, 9, 80 - 720K */
- bs.secs_track = CF_LE_W(9);
- bs.heads = CF_LE_W(2);
+ bs.secs_track = le16toh(9);
+ bs.heads = le16toh(2);
bs.media = (char)0xf9;
bs.cluster_size = (char)2;
def_root_dir_entries = 112;
break;
case 2400: /* 5.25", 2, 15, 80 - 1200K */
- bs.secs_track = CF_LE_W(15);
- bs.heads = CF_LE_W(2);
+ bs.secs_track = le16toh(15);
+ bs.heads = le16toh(2);
bs.media = (char)0xf9;
bs.cluster_size = (char)(atari_format ? 2 : 1);
def_root_dir_entries = 224;
break;
case 5760: /* 3.5", 2, 36, 80 - 2880K */
- bs.secs_track = CF_LE_W(36);
- bs.heads = CF_LE_W(2);
+ bs.secs_track = le16toh(36);
+ bs.heads = le16toh(2);
bs.media = (char)0xf0;
bs.cluster_size = (char)2;
bs.dir_entries[0] = (char)224;
@@ -682,8 +635,8 @@ floppy_default:
break;
case 2880: /* 3.5", 2, 18, 80 - 1440K */
- bs.secs_track = CF_LE_W(18);
- bs.heads = CF_LE_W(2);
+ bs.secs_track = le16toh(18);
+ bs.heads = le16toh(2);
bs.media = (char)0xf0;
bs.cluster_size = (char)(atari_format ? 2 : 1);
def_root_dir_entries = 224;
@@ -692,8 +645,8 @@ floppy_default:
default: /* Anything else: default hd setup */
printf("Loop device does not match a floppy size, using "
"default hd params\n");
- bs.secs_track = CT_LE_W(32); /* these are fake values... */
- bs.heads = CT_LE_W(64);
+ bs.secs_track = htole16(32); /* these are fake values... */
+ bs.heads = htole16(64);
goto def_hd_params;
}
} else
@@ -704,11 +657,13 @@ floppy_default:
if (ioctl(dev, HDIO_GETGEO, &geometry) || geometry.sectors == 0
|| geometry.heads == 0) {
printf("unable to get drive geometry, using default 255/63\n");
- bs.secs_track = CT_LE_W(63);
- bs.heads = CT_LE_W(255);
+ bs.secs_track = htole16(63);
+ bs.heads = htole16(255);
} else {
- bs.secs_track = CT_LE_W(geometry.sectors); /* Set up the geometry information */
- bs.heads = CT_LE_W(geometry.heads);
+ bs.secs_track = htole16(geometry.sectors); /* Set up the geometry information */
+ bs.heads = htole16(geometry.heads);
+ if (!hidden_sectors_by_user)
+ hidden_sectors = htole32(geometry.start);
}
def_hd_params:
bs.media = (char)0xf8; /* Set up the media descriptor for a hard drive */
@@ -721,16 +676,17 @@ def_hd_params:
/* For FAT32, try to do the same as M$'s format command
* (see http://www.win.tue.nl/~aeb/linux/fs/fat/fatgen103.pdf p. 20):
* fs size <= 260M: 0.5k clusters
- * fs size <= 8G: 4k clusters
- * fs size <= 16G: 8k clusters
- * fs size > 16G: 16k clusters
+ * fs size <= 8G: 4k clusters
+ * fs size <= 16G: 8k clusters
+ * fs size <= 32G: 16k clusters
+ * fs size > 32G: 32k clusters
*/
- unsigned long sz_mb =
+ uint32_t sz_mb =
(blocks + (1 << (20 - BLOCK_SIZE_BITS)) - 1) >> (20 -
BLOCK_SIZE_BITS);
bs.cluster_size =
- sz_mb > 16 * 1024 ? 32 : sz_mb > 8 * 1024 ? 16 : sz_mb >
- 260 ? 8 : 1;
+ sz_mb > 32 * 1024 ? 64 : sz_mb > 16 * 1024 ? 32 : sz_mb >
+ 8 * 1024 ? 16 : sz_mb > 260 ? 8 : 1;
} else {
/* FAT12 and FAT16: start at 4 sectors per cluster */
bs.cluster_size = (char)4;
@@ -763,15 +719,28 @@ static void setup_tables(void)
struct msdos_volume_info *vi =
(size_fat == 32 ? &bs.fat32.vi : &bs.oldfat.vi);
- if (atari_format)
+ if (atari_format) {
/* On Atari, the first few bytes of the boot sector are assigned
* differently: The jump code is only 2 bytes (and m68k machine code
* :-), then 6 bytes filler (ignored), then 3 byte serial number. */
- memcpy(bs.system_id - 1, "mkdosf", 6);
- else
- strcpy((char *)bs.system_id, "mkdosfs");
+ bs.boot_jump[2] = 'm';
+ memcpy((char *)bs.system_id, "kdosf", strlen("kdosf"));
+ } else
+ memcpy((char *)bs.system_id, "mkfs.fat", strlen("mkfs.fat"));
if (sectors_per_cluster)
bs.cluster_size = (char)sectors_per_cluster;
+
+ if (fat_media_byte)
+ bs.media = (char) fat_media_byte;
+
+ if (bs.media == 0xf8)
+ vi->drive_number=0x80;
+ else
+ vi->drive_number=0x00;
+
+ if (drive_number_by_user)
+ vi->drive_number= (char) drive_number_option;
+
if (size_fat == 32) {
/* Under FAT32, the root dir is in a cluster chain, and this is
* signalled by bs.dir_entries being 0. */
@@ -810,7 +779,7 @@ static void setup_tables(void)
} else {
memcpy(bs.oldfat.boot_code, dummy_boot_code, BOOTCODE_SIZE);
}
- bs.boot_sign = CT_LE_W(BOOT_SIGN);
+ bs.boot_sign = htole16(BOOT_SIGN);
} else {
memcpy(bs.boot_jump, dummy_boot_jump_m68k, 2);
}
@@ -824,21 +793,22 @@ static void setup_tables(void)
if (size_fat == 32 && reserved_sectors < 2)
die("On FAT32 at least 2 reserved sectors are needed.");
}
- bs.reserved = CT_LE_W(reserved_sectors);
+ bs.reserved = htole16(reserved_sectors);
if (verbose >= 2)
printf("Using %d reserved sectors\n", reserved_sectors);
bs.fats = (char)nr_fats;
if (!atari_format || size_fat == 32)
- bs.hidden = CT_LE_L(hidden_sectors);
+ bs.hidden = htole32(hidden_sectors);
else {
/* In Atari format, hidden is a 16 bit field */
- __u16 hidden = CT_LE_W(hidden_sectors);
+ uint16_t hidden = htole16(hidden_sectors);
if (hidden_sectors & ~0xffff)
die("#hidden doesn't fit in 16bit field of Atari format\n");
memcpy(&bs.hidden, &hidden, 2);
}
- num_sectors = (long long)(blocks *BLOCK_SIZE / sector_size)+orphaned_sectors;
+ num_sectors =
+ (long long)(blocks * BLOCK_SIZE / sector_size) + orphaned_sectors;
if (!atari_format) {
unsigned fatdata1216; /* Sectors for FATs + data area (FAT12/16) */
@@ -867,8 +837,7 @@ static void setup_tables(void)
maxclustsize = 128;
do {
- fatdata32 = num_sectors
- - align_object(reserved_sectors, bs.cluster_size);
+ fatdata32 = num_sectors - reserved_sectors;
fatdata1216 = fatdata32
- align_object(root_dir_sectors, bs.cluster_size);
@@ -930,7 +899,6 @@ static void setup_tables(void)
clust32 = ((long long)fatdata32 * sector_size + nr_fats * 8) /
((int)bs.cluster_size * sector_size + nr_fats * 4);
fatlength32 = cdiv((clust32 + 2) * 4, sector_size);
- fatlength32 = align_object(fatlength32, bs.cluster_size);
/* Need to recalculate number of clusters, since the unused parts of the
* FATS and data area together could make up space for an additional,
* not really present cluster. */
@@ -973,7 +941,7 @@ static void setup_tables(void)
case 12:
cluster_count = clust12;
fat_length = fatlength12;
- bs.fat_length = CT_LE_W(fatlength12);
+ bs.fat_length = htole16(fatlength12);
memcpy(vi->fs_type, MSDOS_FAT12_SIGN, 8);
break;
@@ -992,12 +960,12 @@ static void setup_tables(void)
"the total number of clusters becomes less than the "
"threshold value for\n"
"distinction between 12 and 16 bit FATs.\n");
- die("Make the file system a bit smaller manually.");
+ die("Make the filesystem a bit smaller manually.");
}
}
cluster_count = clust16;
fat_length = fatlength16;
- bs.fat_length = CT_LE_W(fatlength16);
+ bs.fat_length = htole16(fatlength16);
memcpy(vi->fs_type, MSDOS_FAT16_SIGN, 8);
break;
@@ -1007,8 +975,8 @@ static void setup_tables(void)
"WARNING: Not enough clusters for a 32 bit FAT!\n");
cluster_count = clust32;
fat_length = fatlength32;
- bs.fat_length = CT_LE_W(0);
- bs.fat32.fat32_length = CT_LE_L(fatlength32);
+ bs.fat_length = htole16(0);
+ bs.fat32.fat32_length = htole32(fatlength32);
memcpy(vi->fs_type, MSDOS_FAT32_SIGN, 8);
root_dir_entries = 0;
break;
@@ -1017,10 +985,6 @@ static void setup_tables(void)
die("FAT not 12, 16 or 32 bits");
}
- /* Adjust the reserved number of sectors for alignment */
- reserved_sectors = align_object(reserved_sectors, bs.cluster_size);
- bs.reserved = CT_LE_W(reserved_sectors);
-
/* Adjust the number of root directory entries to help enforce alignment */
if (align_structures) {
root_dir_entries = align_object(root_dir_sectors, bs.cluster_size)
@@ -1030,7 +994,7 @@ static void setup_tables(void)
unsigned clusters, maxclust, fatdata;
/* GEMDOS always uses a 12 bit FAT on floppies, and always a 16 bit FAT on
- * hard disks. So use 12 bit if the size of the file system suggests that
+ * hard disks. So use 12 bit if the size of the filesystem suggests that
* this fs is for a floppy disk, if the user hasn't explicitly requested a
* size.
*/
@@ -1102,10 +1066,10 @@ static void setup_tables(void)
cluster_count = clusters;
if (size_fat != 32)
- bs.fat_length = CT_LE_W(fat_length);
+ bs.fat_length = htole16(fat_length);
else {
bs.fat_length = 0;
- bs.fat32.fat32_length = CT_LE_L(fat_length);
+ bs.fat32.fat32_length = htole32(fat_length);
}
}
@@ -1117,11 +1081,11 @@ static void setup_tables(void)
if (size_fat == 32) {
/* set up additional FAT32 fields */
- bs.fat32.flags = CT_LE_W(0);
+ bs.fat32.flags = htole16(0);
bs.fat32.version[0] = 0;
bs.fat32.version[1] = 0;
- bs.fat32.root_cluster = CT_LE_L(2);
- bs.fat32.info_sector = CT_LE_W(1);
+ bs.fat32.root_cluster = htole32(2);
+ bs.fat32.info_sector = htole16(1);
if (!backup_boot)
backup_boot = (reserved_sectors >= 7) ? 6 :
(reserved_sectors >= 2) ? reserved_sectors - 1 : 0;
@@ -1134,7 +1098,7 @@ static void setup_tables(void)
if (verbose >= 2)
printf("Using sector %d as backup boot sector (0 = none)\n",
backup_boot);
- bs.fat32.backup_boot = CT_LE_W(backup_boot);
+ bs.fat32.backup_boot = htole16(backup_boot);
memset(&bs.fat32.reserved2, 0, sizeof(bs.fat32.reserved2));
}
@@ -1149,12 +1113,12 @@ static void setup_tables(void)
if (num_sectors >= 65536) {
bs.sectors[0] = (char)0;
bs.sectors[1] = (char)0;
- bs.total_sect = CT_LE_L(num_sectors);
+ bs.total_sect = htole32(num_sectors);
} else {
bs.sectors[0] = (char)(num_sectors & 0x00ff);
bs.sectors[1] = (char)((num_sectors & 0xff00) >> 8);
if (!atari_format)
- bs.total_sect = CT_LE_L(0);
+ bs.total_sect = htole32(0);
}
if (!atari_format)
@@ -1162,9 +1126,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 file system - try more sectors per cluster");
+ die("Too many clusters for filesystem - try more sectors per cluster");
else
- die("Attempting to create a too large file system");
+ die("Attempting to create a too large filesystem");
}
/* The two following vars are in hard sectors, i.e. 512 byte sectors! */
@@ -1173,18 +1137,20 @@ static void setup_tables(void)
start_data_block = (start_data_sector + SECTORS_PER_BLOCK - 1) /
SECTORS_PER_BLOCK;
- if (blocks < start_data_block + 32) /* Arbitrary undersize file system! */
- die("Too few blocks for viable file system");
+ if (blocks < start_data_block + 32) /* Arbitrary undersize filesystem! */
+ die("Too few blocks for viable filesystem");
if (verbose) {
printf("%s has %d head%s and %d sector%s per track,\n",
- device_name, CF_LE_W(bs.heads),
- (CF_LE_W(bs.heads) != 1) ? "s" : "", CF_LE_W(bs.secs_track),
- (CF_LE_W(bs.secs_track) != 1) ? "s" : "");
+ device_name, le16toh(bs.heads),
+ (le16toh(bs.heads) != 1) ? "s" : "", le16toh(bs.secs_track),
+ (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("file system has %d %d-bit FAT%s and %d sector%s per cluster.\n",
+ 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" : "",
(int)(bs.cluster_size), (bs.cluster_size != 1) ? "s" : "");
printf("FAT size is %d sector%s, and provides %d cluster%s.\n",
@@ -1204,7 +1170,7 @@ static void setup_tables(void)
}
printf("Volume ID is %08lx, ", volume_id &
(atari_format ? 0x00ffffff : 0xffffffff));
- if (strcmp(volume_name, " "))
+ if (strcmp(volume_name, NO_NAME))
printf("volume label %s.\n", volume_name);
else
printf("no volume label.\n");
@@ -1243,26 +1209,29 @@ static void setup_tables(void)
}
memset(root_dir, 0, size_root_dir);
- if (memcmp(volume_name, " ", 11)) {
+ if (memcmp(volume_name, NO_NAME, 11)) {
struct msdos_dir_entry *de = &root_dir[0];
memcpy(de->name, volume_name, 8);
memcpy(de->ext, volume_name + 8, 3);
de->attr = ATTR_VOLUME;
- ctime = localtime(&create_time);
- de->time = CT_LE_W((unsigned short)((ctime->tm_sec >> 1) +
+ if (!invariant)
+ ctime = localtime(&create_time);
+ else
+ ctime = gmtime(&create_time);
+ de->time = htole16((unsigned short)((ctime->tm_sec >> 1) +
(ctime->tm_min << 5) +
(ctime->tm_hour << 11)));
de->date =
- CT_LE_W((unsigned short)(ctime->tm_mday +
+ htole16((unsigned short)(ctime->tm_mday +
((ctime->tm_mon + 1) << 5) +
((ctime->tm_year - 80) << 9)));
- de->ctime_ms = 0;
+ de->ctime_cs = 0;
de->ctime = de->time;
de->cdate = de->date;
de->adate = de->date;
- de->starthi = CT_LE_W(0);
- de->start = CT_LE_W(0);
- de->size = CT_LE_L(0);
+ de->starthi = htole16(0);
+ de->start = htole16(0);
+ de->size = htole32(0);
}
if (size_fat == 32) {
@@ -1282,13 +1251,13 @@ static void setup_tables(void)
info_sector[3] = 'A';
/* Magic for fsinfo structure */
- info->signature = CT_LE_L(0x61417272);
+ info->signature = htole32(0x61417272);
/* We've allocated cluster 2 for the root dir. */
- info->free_clusters = CT_LE_L(cluster_count - 1);
- info->next_cluster = CT_LE_L(2);
+ info->free_clusters = htole32(cluster_count - 1);
+ info->next_cluster = htole32(2);
/* Info sector also must have boot sign */
- *(__u16 *) (info_sector + 0x1fe) = CT_LE_W(BOOT_SIGN);
+ *(uint16_t *) (info_sector + 0x1fe) = htole16(BOOT_SIGN);
}
if (!(blank_sector = malloc(sector_size)))
@@ -1326,7 +1295,7 @@ static void write_tables(void)
int fat_length;
fat_length = (size_fat == 32) ?
- CF_LE_L(bs.fat32.fat32_length) : CF_LE_W(bs.fat_length);
+ le32toh(bs.fat32.fat32_length) : le16toh(bs.fat_length);
seekto(0, "start of device");
/* clear all reserved sectors */
@@ -1337,7 +1306,7 @@ static void write_tables(void)
writebuf((char *)&bs, sizeof(struct msdos_boot_sector), "boot sector");
/* on FAT32, write the info sector and backup boot sector */
if (size_fat == 32) {
- seekto(CF_LE_W(bs.fat32.info_sector) * sector_size, "info sector");
+ seekto(le16toh(bs.fat32.info_sector) * sector_size, "info sector");
writebuf(info_sector, 512, "info sector");
if (backup_boot != 0) {
seekto(backup_boot * sector_size, "backup boot sector");
@@ -1366,16 +1335,20 @@ static void write_tables(void)
free(fat); /* Free up the fat table space reserved during setup_tables */
}
-/* Report the command usage and return a failure error code */
+/* Report the command usage and exit with the given error code */
-void usage(void)
+static void usage(int exitval)
{
- fatal_error("\
-Usage: mkdosfs [-a][-A][-c][-C][-v][-I][-l bad-block-file][-b backup-boot-sector]\n\
+ fprintf(stderr, "\
+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\
+ [--help]\n\
/dev/name [blocks]\n");
+ exit(exitval);
}
/*
@@ -1418,8 +1391,17 @@ int main(int argc, char **argv)
struct stat statbuf;
int i = 0, pos, ch;
int create = 0;
- unsigned long long cblocks = 0;
+ uint64_t cblocks = 0;
int min_sector_size;
+ int bad_block_count = 0;
+ struct timeval create_timeval;
+
+ enum {OPT_HELP=1000, OPT_INVARIANT,};
+ const struct option long_options[] = {
+ {"help", no_argument, NULL, OPT_HELP},
+ {"invariant", no_argument, NULL, OPT_INVARIANT},
+ {0,}
+ };
if (argc && *argv) { /* What's the program name? */
char *p;
@@ -1430,12 +1412,13 @@ int main(int argc, char **argv)
gettimeofday(&create_timeval, NULL);
create_time = create_timeval.tv_sec;
- volume_id = (u_int32_t) ((create_timeval.tv_sec << 20) | create_timeval.tv_usec); /* Default volume ID = creation time, fudged for more uniqueness */
+ volume_id = (uint32_t) ((create_timeval.tv_sec << 20) | create_timeval.tv_usec); /* Default volume ID = creation time, fudged for more uniqueness */
check_atari();
- printf("%s " VERSION " (" VERSION_DATE ")\n", program_name);
+ printf("mkfs.fat " VERSION " (" VERSION_DATE ")\n");
- while ((c = getopt(argc, argv, "aAb:cCf:F:Ii:l:m:n:r:R:s:S:h:v")) != EOF)
+ while ((c = getopt_long(argc, argv, "aAb:cCf:D:F:Ii:l:m:M:n:r:R:s:S:h:v",
+ long_options, NULL)) != -1)
/* Scan the command line for options */
switch (c) {
case 'A': /* toggle Atari format */
@@ -1450,7 +1433,7 @@ int main(int argc, char **argv)
backup_boot = (int)strtol(optarg, &tmp, 0);
if (*tmp || backup_boot < 2 || backup_boot > 0xffff) {
printf("Bad location for backup boot sector : %s\n", optarg);
- usage();
+ usage(1);
}
break;
@@ -1463,11 +1446,20 @@ int main(int argc, char **argv)
create = TRUE;
break;
+ case 'D': /* D : Choose Drive Number */
+ drive_number_option = (int) strtol (optarg, &tmp, 0);
+ if (*tmp || (drive_number_option != 0 && drive_number_option != 0x80)) {
+ printf ("Drive number must be 0 or 0x80: %s\n", optarg);
+ usage(1);
+ }
+ drive_number_by_user=1;
+ break;
+
case 'f': /* f : Choose number of FATs */
nr_fats = (int)strtol(optarg, &tmp, 0);
if (*tmp || nr_fats < 1 || nr_fats > 4) {
printf("Bad number of FATs : %s\n", optarg);
- usage();
+ usage(1);
}
break;
@@ -1475,7 +1467,7 @@ int main(int argc, char **argv)
size_fat = (int)strtol(optarg, &tmp, 0);
if (*tmp || (size_fat != 12 && size_fat != 16 && size_fat != 32)) {
printf("Bad FAT type : %s\n", optarg);
- usage();
+ usage(1);
}
size_fat_by_user = 1;
break;
@@ -1484,8 +1476,9 @@ int main(int argc, char **argv)
hidden_sectors = (int)strtol(optarg, &tmp, 0);
if (*tmp || hidden_sectors < 0) {
printf("Bad number of hidden sectors : %s\n", optarg);
- usage();
+ usage(1);
}
+ hidden_sectors_by_user = 1;
break;
case 'I':
@@ -1496,7 +1489,7 @@ int main(int argc, char **argv)
volume_id = strtoul(optarg, &tmp, 16);
if (*tmp) {
printf("Volume ID must be a hexadecimal number\n");
- usage();
+ usage(1);
}
break;
@@ -1565,15 +1558,35 @@ int main(int argc, char **argv)
}
break;
+ case 'M': /* M : FAT Media byte */
+ fat_media_byte = (int)strtol(optarg, &tmp, 0);
+ if (*tmp) {
+ printf("Bad number for media descriptor : %s\n", optarg);
+ usage(1);
+ }
+ if (fat_media_byte != 0xf0 && (fat_media_byte < 0xf8 || fat_media_byte > 0xff)) {
+ printf("FAT Media byte must either be between 0xF8 and 0xFF or be 0xF0 : %s\n", optarg);
+ usage(1);
+ }
+ break;
+
case 'n': /* n : Volume name */
sprintf(volume_name, "%-11.11s", optarg);
+ for (i = 0; volume_name[i] && i < 11; i++)
+ /* don't know if here should be more strict !uppercase(label[i]) */
+ if (islower(volume_name[i])) {
+ fprintf(stderr,
+ "mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows\n");
+ break;
+ }
+
break;
case 'r': /* r : Root directory entries */
root_dir_entries = (int)strtol(optarg, &tmp, 0);
if (*tmp || root_dir_entries < 16 || root_dir_entries > 32768) {
printf("Bad number of root directory entries : %s\n", optarg);
- usage();
+ usage(1);
}
break;
@@ -1581,7 +1594,7 @@ int main(int argc, char **argv)
reserved_sectors = (int)strtol(optarg, &tmp, 0);
if (*tmp || reserved_sectors < 1 || reserved_sectors > 0xffff) {
printf("Bad number of reserved sectors : %s\n", optarg);
- usage();
+ usage(1);
}
break;
@@ -1594,7 +1607,7 @@ int main(int argc, char **argv)
&& sectors_per_cluster != 64
&& sectors_per_cluster != 128)) {
printf("Bad number of sectors per cluster : %s\n", optarg);
- usage();
+ usage(1);
}
break;
@@ -1605,7 +1618,7 @@ int main(int argc, char **argv)
sector_size != 8192 && sector_size != 16384 &&
sector_size != 32768)) {
printf("Bad logical sector size : %s\n", optarg);
- usage();
+ usage(1);
}
sector_size_set = 1;
break;
@@ -1614,16 +1627,26 @@ int main(int argc, char **argv)
++verbose;
break;
+ case OPT_HELP:
+ usage(0);
+ break;
+
+ case OPT_INVARIANT:
+ invariant = 1;
+ volume_id = 0x1234abcd;
+ create_time = 1426325213;
+ break;
+
default:
printf("Unknown option: %c\n", c);
- usage();
+ usage(1);
}
if (optind < argc) {
device_name = argv[optind]; /* Determine the number of blocks in the FS */
if (!device_name) {
printf("No device specified.\n");
- usage();
+ usage(1);
}
if (!create)
@@ -1633,20 +1656,21 @@ int main(int argc, char **argv)
blocks = strtoull(argv[optind + 1], &tmp, 0);
if (!create && blocks != cblocks) {
fprintf(stderr, "Warning: block count mismatch: ");
- fprintf(stderr, "found %llu but assuming %llu.\n", cblocks, blocks);
+ fprintf(stderr, "found %llu but assuming %llu.\n", (unsigned long long)cblocks, (unsigned long long)blocks);
}
+ if (*tmp)
+ bad_block_count = 1;
} else if (optind == argc - 1) { /* Or use value found */
if (create)
die("Need intended size with -C.");
blocks = cblocks;
- tmp = "";
} else {
fprintf(stderr, "No device specified!\n");
- usage();
+ usage(1);
}
- if (*tmp) {
+ if (bad_block_count) {
printf("Bad block count : %s\n", argv[optind + 1]);
- usage();
+ usage(1);
}
if (check && listfile) /* Auto and specified bad block handling are mutually */
@@ -1661,20 +1685,17 @@ int main(int argc, char **argv)
exit(1); /* The error exit code is 1! */
}
} else {
- loff_t offset = blocks * BLOCK_SIZE - 1;
- char null = 0;
/* create the file */
- dev = open(device_name, O_EXCL | O_RDWR | O_CREAT | O_TRUNC, 0666);
- if (dev < 0)
- die("unable to create %s");
- /* seek to the intended end-1, and write one byte. this creates a
- * sparse-as-possible file of appropriate size. */
- if (llseek(dev, offset, SEEK_SET) != offset)
- die("seek failed");
- if (write(dev, &null, 1) < 0)
- die("write failed");
- if (llseek(dev, 0, SEEK_SET) != 0)
- die("seek failed");
+ dev = open(device_name, O_EXCL | O_RDWR | O_CREAT, 0666);
+ if (dev < 0) {
+ if (errno == EEXIST)
+ die("file %s already exists");
+ else
+ die("unable to create %s");
+ }
+ /* expand to desired size */
+ if (ftruncate(dev, blocks * BLOCK_SIZE))
+ die("unable to resize %s");
}
if (fstat(dev, &statbuf) < 0)
@@ -1690,10 +1711,10 @@ int main(int argc, char **argv)
* the 'superfloppy' format. As I don't know how to find out if
* this is a MO disk I introduce a -I (ignore) switch. -Joey
*/
- if (!ignore_full_disk && ((statbuf.st_rdev & 0xff3f) == 0x0300 || /* hda, hdb */
- (statbuf.st_rdev & 0xff0f) == 0x0800 || /* sd */
- (statbuf.st_rdev & 0xff3f) == 0x0d00 || /* xd */
- (statbuf.st_rdev & 0xff3f) == 0x1600) /* hdc, hdd */
+ if (!ignore_full_disk && ((statbuf.st_rdev & 0xffffff3f) == 0x0300 || /* hda, hdb */
+ (statbuf.st_rdev & 0xffffff0f) == 0x0800 || /* sd */
+ (statbuf.st_rdev & 0xffffff3f) == 0x0d00 || /* xd */
+ (statbuf.st_rdev & 0xffffff3f) == 0x1600) /* hdc, hdd */
)
die("Device partition expected, not making filesystem on entire device '%s' (use -I to override)");
@@ -1720,14 +1741,14 @@ int main(int argc, char **argv)
establish_params(statbuf.st_rdev, statbuf.st_size);
/* Establish the media parameters */
- setup_tables(); /* Establish the file system tables */
+ setup_tables(); /* Establish the filesystem tables */
if (check) /* Determine any bad block locations and mark them */
check_blocks();
else if (listfile)
get_list_blocks(listfile);
- write_tables(); /* Write the file system tables away! */
+ write_tables(); /* Write the filesystem tables away! */
exit(0); /* Terminate with no errors! */
}
diff --git a/dosfstools/src/msdos_fs.h b/dosfstools/src/msdos_fs.h
new file mode 100644
index 000000000..54b2a3446
--- /dev/null
+++ b/dosfstools/src/msdos_fs.h
@@ -0,0 +1,61 @@
+/* msdos_fs.h - MS-DOS filesystem constants/structures
+
+ 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 3 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, see <http://www.gnu.org/licenses/>.
+
+ The complete text of the GNU General Public License
+ can be found in /usr/share/common-licenses/GPL-3 file.
+*/
+
+#ifndef _MSDOS_FS_H
+#define _MSDOS_FS_H
+
+#include <stdint.h>
+
+#define SECTOR_SIZE 512 /* sector size (bytes) */
+#define MSDOS_DPS (SECTOR_SIZE / sizeof(struct msdos_dir_entry))
+#define MSDOS_DPS_BITS 4 /* log2(MSDOS_DPS) */
+#define MSDOS_DIR_BITS 5 /* log2(sizeof(struct msdos_dir_entry)) */
+
+#define ATTR_NONE 0 /* no attribute bits */
+#define ATTR_RO 1 /* read-only */
+#define ATTR_HIDDEN 2 /* hidden */
+#define ATTR_SYS 4 /* system */
+#define ATTR_VOLUME 8 /* volume label */
+#define ATTR_DIR 16 /* directory */
+#define ATTR_ARCH 32 /* archived */
+
+/* attribute bits that are copied "as is" */
+#define ATTR_UNUSED (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN)
+
+#define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */
+#define IS_FREE(n) (!*(n) || *(n) == DELETED_FLAG)
+
+#define MSDOS_NAME 11 /* maximum name length */
+#define MSDOS_DOT ". " /* ".", padded to MSDOS_NAME chars */
+#define MSDOS_DOTDOT ".. " /* "..", padded to MSDOS_NAME chars */
+
+struct msdos_dir_entry {
+ uint8_t name[8], ext[3]; /* name and extension */
+ uint8_t attr; /* attribute bits */
+ uint8_t lcase; /* Case for base and extension */
+ uint8_t ctime_cs; /* Creation time, centiseconds (0-199) */
+ uint16_t ctime; /* Creation time */
+ uint16_t cdate; /* Creation date */
+ uint16_t adate; /* Last access date */
+ uint16_t starthi; /* High 16 bits of cluster in FAT32 */
+ uint16_t time, date, start; /* time, date and first cluster */
+ uint32_t size; /* file size (in bytes) */
+} __attribute__ ((packed));
+
+#endif /* _MSDOS_FS_H */
diff --git a/dosfstools/src/version.h b/dosfstools/src/version.h
index 6379103b6..f0716d346 100644
--- a/dosfstools/src/version.h
+++ b/dosfstools/src/version.h
@@ -1,6 +1,7 @@
/* version.h
Copyright (C) 1998-2005 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
+ Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
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
@@ -15,14 +16,14 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
- On Debian systems, the complete text of the GNU General Public License
+ The complete text of the GNU General Public License
can be found in /usr/share/common-licenses/GPL-3 file.
*/
#ifndef _version_h
#define _version_h
-#define VERSION "3.0.12"
-#define VERSION_DATE "29 Oct 2011"
+#define VERSION "3.0.28"
+#define VERSION_DATE "2015-05-16"
#endif
diff --git a/gui/action.cpp b/gui/action.cpp
index c48c390f9..46f4575d7 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -863,7 +863,7 @@ int GUIAction::getpartitiondetails(std::string arg __unused)
DataManager::SetValue("tw_partition_can_resize", 1);
else
DataManager::SetValue("tw_partition_can_resize", 0);
- if (TWFunc::Path_Exists("/sbin/mkdosfs"))
+ if (TWFunc::Path_Exists("/sbin/mkfs.fat"))
DataManager::SetValue("tw_partition_vfat", 1);
else
DataManager::SetValue("tw_partition_vfat", 0);
diff --git a/partition.cpp b/partition.cpp
index 5058e1d5b..918ba3ce0 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -1215,7 +1215,7 @@ bool TWPartition::Wipe_AndSec(void) {
bool TWPartition::Can_Repair() {
if (Mount_Read_Only)
return false;
- if (Current_File_System == "vfat" && TWFunc::Path_Exists("/sbin/dosfsck"))
+ if (Current_File_System == "vfat" && TWFunc::Path_Exists("/sbin/fsck.fat"))
return true;
else if ((Current_File_System == "ext2" || Current_File_System == "ext3" || Current_File_System == "ext4") && TWFunc::Path_Exists("/sbin/e2fsck"))
return true;
@@ -1232,15 +1232,15 @@ bool TWPartition::Repair() {
string command;
if (Current_File_System == "vfat") {
- if (!TWFunc::Path_Exists("/sbin/dosfsck")) {
- gui_print("dosfsck does not exist! Cannot repair!\n");
+ if (!TWFunc::Path_Exists("/sbin/fsck.fat")) {
+ gui_print("fsck.fat does not exist! Cannot repair!\n");
return false;
}
if (!UnMount(true))
return false;
- gui_print("Repairing %s using dosfsck...\n", Display_Name.c_str());
+ gui_print("Repairing %s using fsck.fat...\n", Display_Name.c_str());
Find_Actual_Block_Device();
- command = "/sbin/dosfsck -y " + Actual_Block_Device;
+ command = "/sbin/fsck.fat -y " + Actual_Block_Device;
LOGINFO("Repair command: %s\n", command.c_str());
if (TWFunc::Exec_Cmd(command) == 0) {
gui_print("Done.\n");
@@ -1726,13 +1726,13 @@ bool TWPartition::Wipe_EXT4() {
bool TWPartition::Wipe_FAT() {
string command;
- if (TWFunc::Path_Exists("/sbin/mkdosfs")) {
+ if (TWFunc::Path_Exists("/sbin/mkfs.fat")) {
if (!UnMount(true))
return false;
- gui_print("Formatting %s using mkdosfs...\n", Display_Name.c_str());
+ gui_print("Formatting %s using mkfs.fat...\n", Display_Name.c_str());
Find_Actual_Block_Device();
- command = "mkdosfs " + Actual_Block_Device;
+ command = "mkfs.fat " + Actual_Block_Device;
if (TWFunc::Exec_Cmd(command) == 0) {
Current_File_System = "vfat";
Recreate_AndSec_Folder();
diff --git a/partitions.hpp b/partitions.hpp
index afcd47431..4b6d37160 100644
--- a/partitions.hpp
+++ b/partitions.hpp
@@ -103,7 +103,7 @@ private:
unsigned long long Get_Size_Via_du(string Path, bool Display_Error); // Uses du to get sizes
bool Wipe_EXT23(string File_System); // Formats as ext3 or ext2
bool Wipe_EXT4(); // Formats using ext4, uses make_ext4fs when present
- bool Wipe_FAT(); // Formats as FAT if mkdosfs exits otherwise rm -rf wipe
+ bool Wipe_FAT(); // Formats as FAT if mkfs.fat exits otherwise rm -rf wipe
bool Wipe_EXFAT(); // Formats as EXFAT
bool Wipe_MTD(); // Formats as yaffs2 for MTD memory types
bool Wipe_RMRF(); // Uses rm -rf to wipe
diff --git a/prebuilt/Android.mk b/prebuilt/Android.mk
index 7b7551166..668dacf76 100644
--- a/prebuilt/Android.mk
+++ b/prebuilt/Android.mk
@@ -23,9 +23,9 @@ else
endif
endif
RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/pigz
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dosfsck
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/dosfslabel
-RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkdosfs
+RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fsck.fat
+RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/fatlabel
+RELINK_SOURCE_FILES += $(TARGET_RECOVERY_ROOT_OUT)/sbin/mkfs.fat
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/e2fsck
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/mke2fs
RELINK_SOURCE_FILES += $(TARGET_OUT_EXECUTABLES)/tune2fs