Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Sep 2019 17:32:40 +0000 (UTC)
From:      Ed Maste <emaste@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r352079 - in stable/12/usr.sbin/makefs: . ffs msdos
Message-ID:  <201909091732.x89HWeTr083276@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: emaste
Date: Mon Sep  9 17:32:40 2019
New Revision: 352079
URL: https://svnweb.freebsd.org/changeset/base/352079

Log:
  makefs: add msdosfs (FAT) support
  
  MFC r351232: makefs.8: expand description of image size
  
  Submitted by:	ryan_freqlabs.com, Siva Mahadevan
  
  MFC r351273: makefs: add msdosfs (FAT) support
  
  Add FAT support to makefs by copying some files from sys/fs/msdosfs/ and
  updating others with changes from NetBSD.
  
  The six files copied from sys/fs/msdosfs at r348251 and modified are:
  denode.h direntry.h fat.h msdosfs_fat.c msdosfs_lookup.c msdosfsmount.h
  
  I would prefer to avoid the duplication, but reluctance to doing so was
  expressed in a previous review (D11197); for now copy the files and
  revisit in the future.
  
  Submitted by:	Siva Mahadevan
  
  MFC r351275: makefs: avoid "dereferencing 'void *' pointer" warnings
  
  On GCC 4.2.1 archs
  
  MFC r351302: makefs.8: update history
  
  - ported to FreeBSD and first appeared in 8.0
  - Christos Zoulas added the FAT support that I imported
  
  MFC r351319: makefs: use `char *` not `void *` for buf b_data, drop casts in msdos
  
  (The kernel uses caddr_t.)
  
  Suggested by:	cem
  
  MFC r351415 (delphij): Properly update FSInfo block after generation.
  
  After populating the filesystem, write a FSInfo block with
  proper information.
  
  Sponsored by:	The FreeBSD Foundation

Added:
  stable/12/usr.sbin/makefs/msdos/Makefile.inc
     - copied unchanged from r351273, head/usr.sbin/makefs/msdos/Makefile.inc
  stable/12/usr.sbin/makefs/msdos/denode.h
     - copied unchanged from r351273, head/usr.sbin/makefs/msdos/denode.h
  stable/12/usr.sbin/makefs/msdos/direntry.h
     - copied unchanged from r351273, head/usr.sbin/makefs/msdos/direntry.h
  stable/12/usr.sbin/makefs/msdos/fat.h
     - copied unchanged from r351273, head/usr.sbin/makefs/msdos/fat.h
  stable/12/usr.sbin/makefs/msdos/msdosfs_conv.c
     - copied unchanged from r351273, head/usr.sbin/makefs/msdos/msdosfs_conv.c
  stable/12/usr.sbin/makefs/msdos/msdosfs_fat.c
     - copied, changed from r351273, head/usr.sbin/makefs/msdos/msdosfs_fat.c
  stable/12/usr.sbin/makefs/msdos/msdosfs_lookup.c
     - copied unchanged from r351273, head/usr.sbin/makefs/msdos/msdosfs_lookup.c
  stable/12/usr.sbin/makefs/msdos/msdosfsmount.h
     - copied unchanged from r351273, head/usr.sbin/makefs/msdos/msdosfsmount.h
Modified:
  stable/12/usr.sbin/makefs/Makefile
  stable/12/usr.sbin/makefs/ffs/buf.h
  stable/12/usr.sbin/makefs/makefs.8
  stable/12/usr.sbin/makefs/makefs.c
  stable/12/usr.sbin/makefs/makefs.h
  stable/12/usr.sbin/makefs/msdos.c
  stable/12/usr.sbin/makefs/msdos.h
  stable/12/usr.sbin/makefs/msdos/msdosfs_denode.c
  stable/12/usr.sbin/makefs/msdos/msdosfs_vfsops.c
  stable/12/usr.sbin/makefs/msdos/msdosfs_vnops.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/usr.sbin/makefs/Makefile
==============================================================================
--- stable/12/usr.sbin/makefs/Makefile	Mon Sep  9 17:24:24 2019	(r352078)
+++ stable/12/usr.sbin/makefs/Makefile	Mon Sep  9 17:32:40 2019	(r352079)
@@ -8,8 +8,10 @@ PROG=	makefs
 
 CFLAGS+=-I${SRCDIR}
 
-SRCS=	cd9660.c ffs.c \
+SRCS=	cd9660.c \
+	ffs.c \
 	makefs.c \
+	msdos.c \
 	mtree.c \
 	walk.c
 MAN=	makefs.8
@@ -18,6 +20,7 @@ WARNS?=	2
 
 .include "${SRCDIR}/cd9660/Makefile.inc"
 .include "${SRCDIR}/ffs/Makefile.inc"
+.include "${SRCDIR}/msdos/Makefile.inc"
 
 CFLAGS+=-DHAVE_STRUCT_STAT_ST_FLAGS=1
 

Modified: stable/12/usr.sbin/makefs/ffs/buf.h
==============================================================================
--- stable/12/usr.sbin/makefs/ffs/buf.h	Mon Sep  9 17:24:24 2019	(r352078)
+++ stable/12/usr.sbin/makefs/ffs/buf.h	Mon Sep  9 17:32:40 2019	(r352079)
@@ -54,7 +54,7 @@ struct vnode {
 };
 
 struct buf {
-	void *		b_data;
+	char *		b_data;
 	long		b_bufsize;
 	long		b_bcount;
 	daddr_t		b_blkno;

Modified: stable/12/usr.sbin/makefs/makefs.8
==============================================================================
--- stable/12/usr.sbin/makefs/makefs.8	Mon Sep  9 17:24:24 2019	(r352078)
+++ stable/12/usr.sbin/makefs/makefs.8	Mon Sep  9 17:32:40 2019	(r352079)
@@ -35,7 +35,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 30, 2018
+.Dd August 20, 2019
 .Dt MAKEFS 8
 .Os
 .Sh NAME
@@ -198,7 +198,9 @@ and
 Instead of creating the filesystem at the beginning of the file, start
 at offset.
 Valid only for
-.Sy ffs .
+.Sy ffs
+and
+.Sy msdos .
 .It Fl o Ar fs-options
 Set file system specific options.
 .Ar fs-options
@@ -225,6 +227,21 @@ Defaults to 512.
 .It Fl s Ar image-size
 Set the size of the file system image to
 .Ar image-size .
+This is equivalent to setting both the minimum
+.Fl ( M )
+and the maximum
+.Fl ( m )
+sizes to the same value.
+For
+.Sy ffs
+and
+.Sy msdos
+the
+.Ar image-size
+does not include the
+.Ar offset .
+.Ar offset
+is not included in that size.
 .It Fl T Ar timestamp
 Specify a timestamp to be set for all filesystem files and directories
 created so that repeatable builds are possible.
@@ -247,6 +264,8 @@ The following file system types are supported:
 BSD fast file system (default).
 .It Sy cd9660
 ISO 9660 file system.
+.It Sy msdos
+FAT12, FAT16, or FAT32 file system.
 .El
 .It Fl x
 Exclude file system nodes not explicitly listed in the specfile.
@@ -410,6 +429,67 @@ Turns on verbose output.
 .It Sy volumeid
 Volume set identifier of the image.
 .El
+.Ss msdos-specific options
+.Sy msdos
+images have MS-DOS-specific optional parameters that may be
+provided.
+The arguments consist of a keyword, an equal sign
+.Pq Ql = ,
+and a value.
+The following keywords are supported (see
+.Xr newfs_msdos 8
+for more details):
+.Pp
+.Bl -tag -width omit-trailing-period -offset indent -compact
+.It Cm backup_sector
+Location of the backup boot sector.
+.It Cm block_size
+Block size.
+.It Cm bootstrap
+Bootstrap file.
+.It Cm bytes_per_sector
+Bytes per sector.
+.It Cm create_size
+Create file size.
+.It Cm directory_entries
+Directory entries.
+.It Cm drive_heads
+Drive heads.
+.It Cm fat_type
+FAT type (12, 16, or 32).
+.It Cm floppy
+Preset drive parameters for standard format floppy disks
+(160, 180, 320, 360, 640, 720, 1200, 1232, 1440, or 2880).
+.It Cm hidden_sectors
+Hidden sectors.
+.It Cm info_sector
+Location of the info sector.
+.It Cm media_descriptor
+Media descriptor.
+.It Cm num_FAT
+Number of FATs.
+.It Cm OEM_string
+OEM string.
+.It Cm offset
+Offset in device.
+This option will be ignored if
+.Fl O
+is set to a positive number.
+.It Cm reserved_sectors
+Reserved sectors.
+.It Cm sectors_per_cluster
+Sectors per cluster.
+.It Cm sectors_per_fat
+Sectors per FAT.
+.It Cm sectors_per_track
+Sectors per track.
+.It Cm size
+File System size.
+.It Cm volume_id
+Volume ID.
+.It Cm volume_label
+Volume Label.
+.El
 .Sh SEE ALSO
 .Xr mtree 5 ,
 .Xr mtree 8 ,
@@ -419,6 +499,10 @@ The
 .Nm
 utility appeared in
 .Nx 1.6 .
+It was ported to
+.Fx
+and first appeared in
+.Fx 8.0 .
 .Sh AUTHORS
 .An Luke Mewburn
 .Aq Mt lukem@NetBSD.org
@@ -428,4 +512,6 @@ utility appeared in
 .An Ryan Gabrys ,
 .An Alan Perez-Rathke ,
 .An Ram Vedam
-(cd9660 support)
+(cd9660 support),
+.An Christos Zoulas
+(msdos support).

Modified: stable/12/usr.sbin/makefs/makefs.c
==============================================================================
--- stable/12/usr.sbin/makefs/makefs.c	Mon Sep  9 17:24:24 2019	(r352078)
+++ stable/12/usr.sbin/makefs/makefs.c	Mon Sep  9 17:32:40 2019	(r352079)
@@ -74,8 +74,9 @@ static fstype_t fstypes[] = {
 	# name, name ## _prep_opts, name ## _parse_opts, \
 	name ## _cleanup_opts, name ## _makefs  \
 }
-	ENTRY(ffs),
 	ENTRY(cd9660),
+	ENTRY(ffs),
+	ENTRY(msdos),
 	{ .type = NULL	},
 };
 

Modified: stable/12/usr.sbin/makefs/makefs.h
==============================================================================
--- stable/12/usr.sbin/makefs/makefs.h	Mon Sep  9 17:24:24 2019	(r352078)
+++ stable/12/usr.sbin/makefs/makefs.h	Mon Sep  9 17:32:40 2019	(r352079)
@@ -183,8 +183,9 @@ int		fs ## _parse_opts(const char *, fsinfo_t *);		\
 void		fs ## _cleanup_opts(fsinfo_t *);			\
 void		fs ## _makefs(const char *, const char *, fsnode *, fsinfo_t *)
 
-DECLARE_FUN(ffs);
 DECLARE_FUN(cd9660);
+DECLARE_FUN(ffs);
+DECLARE_FUN(msdos);
 
 extern	u_int		debug;
 extern	int		dupsok;
@@ -225,6 +226,7 @@ extern	struct stat stampst;
 #define	DEBUG_APPLY_SPECFILE		0x04000000
 #define	DEBUG_APPLY_SPECENTRY		0x08000000
 #define	DEBUG_APPLY_SPECONLY		0x10000000
+#define	DEBUG_MSDOSFS			0x20000000
 
 
 #define	TIMER_START(x)				\

Modified: stable/12/usr.sbin/makefs/msdos.c
==============================================================================
--- stable/12/usr.sbin/makefs/msdos.c	Mon Sep  9 17:24:24 2019	(r352078)
+++ stable/12/usr.sbin/makefs/msdos.c	Mon Sep  9 17:32:40 2019	(r352079)
@@ -50,24 +50,28 @@ __FBSDID("$FreeBSD$");
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdint.h>
 #include <unistd.h>
 #include <dirent.h>
 #include <util.h>
 
-#include <ffs/buf.h>
-#include <fs/msdosfs/bpb.h>
-#include <fs/msdosfs/denode.h>
-#include <fs/msdosfs/msdosfsmount.h>
 #include "makefs.h"
 #include "msdos.h"
-#include "mkfs_msdos.h"
 
+#include <mkfs_msdos.h>
+#include <fs/msdosfs/bpb.h>
+
+#include "ffs/buf.h"
+
+#include "msdos/msdosfsmount.h"
+#include "msdos/direntry.h"
+#include "msdos/denode.h"
+
 static int msdos_populate_dir(const char *, struct denode *, fsnode *,
     fsnode *, fsinfo_t *);
 
 struct msdos_options_ex {
 	struct msdos_options options;
-	bool utf8;
 };
 
 void
@@ -85,15 +89,13 @@ msdos_prep_opts(fsinfo_t *fsopts)
 	    (sizeof(_type) == 4 ? OPT_INT32 : OPT_INT64)))),		\
 	.value = &msdos_opt->options._name,				\
 	.minimum = _min,						\
-	.maximum = sizeof(_type) == 1 ? 0xff :				\
-	    (sizeof(_type) == 2 ? 0xffff :				\
-	    (sizeof(_type) == 4 ? 0xffffffff : 0xffffffffffffffffLL)),	\
-	.desc = _desc,						\
+	.maximum = sizeof(_type) == 1 ? UINT8_MAX :			\
+	    (sizeof(_type) == 2 ? UINT16_MAX :				\
+	    (sizeof(_type) == 4 ? UINT32_MAX : INT64_MAX)),		\
+	.desc = _desc,							\
 },
 ALLOPTS
 #undef AOPT
-		{ 'U', "utf8", &msdos_opt->utf8, OPT_BOOL,
-		  0, 1, "Use UTF8 names" },
 		{ .name = NULL }
 	};
 
@@ -113,7 +115,6 @@ msdos_parse_opts(const char *option, fsinfo_t *fsopts)
 {
 	struct msdos_options *msdos_opt = fsopts->fs_specific;
 	option_t *msdos_options = fsopts->fs_options;
-
 	int rv;
 
 	assert(option != NULL);
@@ -148,7 +149,7 @@ msdos_makefs(const char *image, const char *dir, fsnod
 {
 	struct msdos_options_ex *msdos_opt = fsopts->fs_specific;
 	struct vnode vp, rootvp;
-	struct timeval	start;
+	struct timeval start;
 	struct msdosfsmount *pmp;
 	uint32_t flags;
 
@@ -160,7 +161,8 @@ msdos_makefs(const char *image, const char *dir, fsnod
 	fsopts->size = fsopts->maxsize;
 	msdos_opt->options.create_size = MAX(msdos_opt->options.create_size,
 	    fsopts->offset + fsopts->size);
-	msdos_opt->options.offset = fsopts->offset;
+	if (fsopts->offset > 0)
+		msdos_opt->options.offset = fsopts->offset;
 	if (msdos_opt->options.bytes_per_sector == 0) {
 		if (fsopts->sectorsize == -1)
 			fsopts->sectorsize = 512;
@@ -173,7 +175,7 @@ msdos_makefs(const char *image, const char *dir, fsnod
 		    fsopts->sectorsize, msdos_opt->options.bytes_per_sector);
 	}
 
-		/* create image */
+	/* create image */
 	printf("Creating `%s'\n", image);
 	TIMER_START(start);
 	if (mkfs_msdos(image, NULL, &msdos_opt->options) == -1)
@@ -184,10 +186,7 @@ msdos_makefs(const char *image, const char *dir, fsnod
 	vp.fs = fsopts;
 
 	flags = 0;
-	if (msdos_opt->utf8)
-		flags |= MSDOSFSMNT_UTF8;
-
-	if ((pmp = msdosfs_mount(&vp, flags)) == NULL)
+	if ((pmp = msdosfs_mount(&vp)) == NULL)
 		err(1, "msdosfs_mount");
 
 	if (msdosfs_root(pmp, &rootvp) != 0)
@@ -197,17 +196,19 @@ msdos_makefs(const char *image, const char *dir, fsnod
 		printf("msdos_makefs: image %s directory %s root %p\n",
 		    image, dir, root);
 
-		/* populate image */
+	/* populate image */
 	printf("Populating `%s'\n", image);
 	TIMER_START(start);
 	if (msdos_populate_dir(dir, VTODE(&rootvp), root, root, fsopts) == -1)
 		errx(1, "Image file `%s' not created.", image);
 	TIMER_RESULTS(start, "msdos_populate_dir");
 
+	if (msdosfs_fsiflush(pmp) != 0)
+		errx(1, "Unable to update FSInfo block.");
 	if (debug & DEBUG_FS_MAKEFS)
 		putchar('\n');
 
-		/* ensure no outstanding buffers remain */
+	/* ensure no outstanding buffers remain */
 	if (debug & DEBUG_FS_MAKEFS)
 		bcleanup();
 

Modified: stable/12/usr.sbin/makefs/msdos.h
==============================================================================
--- stable/12/usr.sbin/makefs/msdos.h	Mon Sep  9 17:24:24 2019	(r352078)
+++ stable/12/usr.sbin/makefs/msdos.h	Mon Sep  9 17:32:40 2019	(r352079)
@@ -30,11 +30,32 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 
+#ifndef _MAKEFS_MSDOS_H
+#define _MAKEFS_MSDOS_H
+
+#define NOCRED NULL
+
+#define MSDOSFS_DPRINTF(args) do {	\
+	if (debug & DEBUG_MSDOSFS)	\
+		printf args;		\
+} while (0);
+
+
 struct vnode;
 struct denode;
+struct fsnode;
+struct msdosfsmount;
 
-struct msdosfsmount *msdosfs_mount(struct vnode *, int);
+struct componentname {
+	char *cn_nameptr;
+	size_t cn_namelen;
+};
+
+int msdosfs_fsiflush(struct msdosfsmount *);
+struct msdosfsmount *msdosfs_mount(struct vnode *);
 int msdosfs_root(struct msdosfsmount *, struct vnode *);
 
 struct denode *msdosfs_mkfile(const char *, struct denode *, fsnode *);
 struct denode *msdosfs_mkdire(const char *, struct denode *, fsnode *);
+
+#endif

Copied: stable/12/usr.sbin/makefs/msdos/Makefile.inc (from r351273, head/usr.sbin/makefs/msdos/Makefile.inc)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.sbin/makefs/msdos/Makefile.inc	Mon Sep  9 17:32:40 2019	(r352079, copy of r351273, head/usr.sbin/makefs/msdos/Makefile.inc)
@@ -0,0 +1,13 @@
+#	$FreeBSD$
+#
+
+MSDOS=		${SRCTOP}/sys/fs/msdosfs
+MSDOS_NEWFS=	${SRCTOP}/sbin/newfs_msdos
+
+.PATH:	${SRCDIR}/msdos ${MSDOS} ${MSDOS_NEWFS}
+
+CFLAGS+= -I${MSDOS} -I${MSDOS_NEWFS}
+
+SRCS+= mkfs_msdos.c
+SRCS+= msdosfs_conv.c msdosfs_denode.c msdosfs_fat.c msdosfs_lookup.c
+SRCS+= msdosfs_vnops.c msdosfs_vfsops.c

Copied: stable/12/usr.sbin/makefs/msdos/denode.h (from r351273, head/usr.sbin/makefs/msdos/denode.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.sbin/makefs/msdos/denode.h	Mon Sep  9 17:32:40 2019	(r352079, copy of r351273, head/usr.sbin/makefs/msdos/denode.h)
@@ -0,0 +1,237 @@
+/* $FreeBSD$ */
+/*	$NetBSD: denode.h,v 1.25 1997/11/17 15:36:28 ws Exp $	*/
+
+/*-
+ * SPDX-License-Identifier: BSD-4-Clause
+ *
+ * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
+ * Copyright (C) 1994, 1995, 1997 TooLs GmbH.
+ * All rights reserved.
+ * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*-
+ * Written by Paul Popelka (paulp@uts.amdahl.com)
+ *
+ * You can do anything you want with this software, just don't say you wrote
+ * it, and don't remove this notice.
+ *
+ * This software is provided "as is".
+ *
+ * The author supplies this software to be publicly redistributed on the
+ * understanding that the author is not responsible for the correct
+ * functioning of this software in any circumstances and is not liable for
+ * any damages caused by this software.
+ *
+ * October 1992
+ */
+#ifndef _FS_MSDOSFS_DENODE_H_
+#define	_FS_MSDOSFS_DENODE_H_
+
+/*
+ * This is the pc filesystem specific portion of the vnode structure.
+ *
+ * To describe a file uniquely the de_dirclust, de_diroffset, and
+ * de_StartCluster fields are used.
+ *
+ * de_dirclust contains the cluster number of the directory cluster
+ *	containing the entry for a file or directory.
+ * de_diroffset is the index into the cluster for the entry describing
+ *	a file or directory.
+ * de_StartCluster is the number of the first cluster of the file or directory.
+ *
+ * Now to describe the quirks of the pc filesystem.
+ * - Clusters 0 and 1 are reserved.
+ * - The first allocatable cluster is 2.
+ * - The root directory is of fixed size and all blocks that make it up
+ *   are contiguous.
+ * - Cluster 0 refers to the root directory when it is found in the
+ *   startcluster field of a directory entry that points to another directory.
+ * - Cluster 0 implies a 0 length file when found in the start cluster field
+ *   of a directory entry that points to a file.
+ * - You can't use the cluster number 0 to derive the address of the root
+ *   directory.
+ * - Multiple directory entries can point to a directory. The entry in the
+ *   parent directory points to a child directory.  Any directories in the
+ *   child directory contain a ".." entry that points back to the parent.
+ *   The child directory itself contains a "." entry that points to itself.
+ * - The root directory does not contain a "." or ".." entry.
+ * - Directory entries for directories are never changed once they are created
+ *   (except when removed).  The size stays 0, and the last modification time
+ *   is never changed.  This is because so many directory entries can point to
+ *   the physical clusters that make up a directory.  It would lead to an
+ *   update nightmare.
+ * - The length field in a directory entry pointing to a directory contains 0
+ *   (always).  The only way to find the end of a directory is to follow the
+ *   cluster chain until the "last cluster" marker is found.
+ *
+ * My extensions to make this house of cards work.  These apply only to the in
+ * memory copy of the directory entry.
+ * - A reference count for each denode will be kept since dos doesn't keep such
+ *   things.
+ */
+
+/*
+ * Internal pseudo-offset for (nonexistent) directory entry for the root
+ * dir in the root dir
+ */
+#define	MSDOSFSROOT_OFS	0x1fffffff
+
+/*
+ * The FAT cache structure. fc_fsrcn is the filesystem relative cluster
+ * number that corresponds to the file relative cluster number in this
+ * structure (fc_frcn).
+ */
+struct fatcache {
+	u_long fc_frcn;		/* file relative cluster number */
+	u_long fc_fsrcn;	/* filesystem relative cluster number */
+};
+
+/*
+ * The FAT entry cache as it stands helps make extending files a "quick"
+ * operation by avoiding having to scan the FAT to discover the last
+ * cluster of the file. The cache also helps sequential reads by
+ * remembering the last cluster read from the file.  This also prevents us
+ * from having to rescan the FAT to find the next cluster to read.  This
+ * cache is probably pretty worthless if a file is opened by multiple
+ * processes.
+ */
+#define	FC_SIZE		3	/* number of entries in the cache */
+#define	FC_LASTMAP	0	/* entry the last call to pcbmap() resolved
+				 * to */
+#define	FC_LASTFC	1	/* entry for the last cluster in the file */
+#define	FC_NEXTTOLASTFC	2	/* entry for a close to the last cluster in
+				 * the file */
+
+#define	FCE_EMPTY	0xffffffff	/* doesn't represent an actual cluster # */
+
+/*
+ * Set a slot in the FAT cache.
+ */
+#define	fc_setcache(dep, slot, frcn, fsrcn) \
+	(dep)->de_fc[(slot)].fc_frcn = (frcn); \
+	(dep)->de_fc[(slot)].fc_fsrcn = (fsrcn);
+
+/*
+ * This is the in memory variant of a dos directory entry.  It is usually
+ * contained within a vnode.
+ */
+struct denode {
+	struct vnode *de_vnode;	/* addr of vnode we are part of */
+	u_long de_flag;		/* flag bits */
+	u_long de_dirclust;	/* cluster of the directory file containing this entry */
+	u_long de_diroffset;	/* offset of this entry in the directory cluster */
+	u_long de_fndoffset;	/* offset of found dir entry */
+	int de_fndcnt;		/* number of slots before de_fndoffset */
+	long de_refcnt;		/* reference count */
+	struct msdosfsmount *de_pmp;	/* addr of our mount struct */
+	u_char de_Name[12];	/* name, from DOS directory entry */
+	u_char de_Attributes;	/* attributes, from directory entry */
+	u_char de_LowerCase;	/* NT VFAT lower case flags */
+	u_char de_CHun;		/* Hundredth of second of CTime*/
+	u_short de_CTime;	/* creation time */
+	u_short de_CDate;	/* creation date */
+	u_short de_ADate;	/* access date */
+	u_short de_MTime;	/* modification time */
+	u_short de_MDate;	/* modification date */
+	u_long de_StartCluster; /* starting cluster of file */
+	u_long de_FileSize;	/* size of file in bytes */
+	struct fatcache de_fc[FC_SIZE];	/* FAT cache */
+	uint64_t de_inode;	/* Inode number (really byte offset of direntry) */
+};
+
+/*
+ * Values for the de_flag field of the denode.
+ */
+#define	DE_UPDATE	0x0004	/* Modification time update request */
+#define	DE_CREATE	0x0008	/* Creation time update */
+#define	DE_ACCESS	0x0010	/* Access time update */
+#define	DE_MODIFIED	0x0020	/* Denode has been modified */
+#define	DE_RENAME	0x0040	/* Denode is in the process of being renamed */
+
+/* Maximum size of a file on a FAT filesystem */
+#define MSDOSFS_FILESIZE_MAX	0xFFFFFFFFLL
+
+/*
+ * Transfer directory entries between internal and external form.
+ * dep is a struct denode * (internal form),
+ * dp is a struct direntry * (external form).
+ */
+#define DE_INTERNALIZE32(dep, dp)			\
+	 ((dep)->de_StartCluster |= getushort((dp)->deHighClust) << 16)
+#define DE_INTERNALIZE(dep, dp)				\
+	(memcpy((dep)->de_Name, (dp)->deName, 11),	\
+	 (dep)->de_Attributes = (dp)->deAttributes,	\
+	 (dep)->de_LowerCase = (dp)->deLowerCase,	\
+	 (dep)->de_CHun = (dp)->deCHundredth,		\
+	 (dep)->de_CTime = getushort((dp)->deCTime),	\
+	 (dep)->de_CDate = getushort((dp)->deCDate),	\
+	 (dep)->de_ADate = getushort((dp)->deADate),	\
+	 (dep)->de_MTime = getushort((dp)->deMTime),	\
+	 (dep)->de_MDate = getushort((dp)->deMDate),	\
+	 (dep)->de_StartCluster = getushort((dp)->deStartCluster), \
+	 (dep)->de_FileSize = getulong((dp)->deFileSize), \
+	 (FAT32((dep)->de_pmp) ? DE_INTERNALIZE32((dep), (dp)) : 0))
+
+#define DE_EXTERNALIZE(dp, dep)				\
+	(memcpy((dp)->deName, (dep)->de_Name, 11),	\
+	 (dp)->deAttributes = (dep)->de_Attributes,	\
+	 (dp)->deLowerCase = (dep)->de_LowerCase,	\
+	 (dp)->deCHundredth = (dep)->de_CHun,		\
+	 putushort((dp)->deCTime, (dep)->de_CTime),	\
+	 putushort((dp)->deCDate, (dep)->de_CDate),	\
+	 putushort((dp)->deADate, (dep)->de_ADate),	\
+	 putushort((dp)->deMTime, (dep)->de_MTime),	\
+	 putushort((dp)->deMDate, (dep)->de_MDate),	\
+	 putushort((dp)->deStartCluster, (dep)->de_StartCluster), \
+	 putulong((dp)->deFileSize,			\
+	     ((dep)->de_Attributes & ATTR_DIRECTORY) ? 0 : (dep)->de_FileSize), \
+	 putushort((dp)->deHighClust, (dep)->de_StartCluster >> 16))
+
+#define	VTODE(vp)	((struct denode *)(vp)->v_data)
+#define	DETOV(de)	((de)->de_vnode)
+
+struct buf;
+struct msdosfsmount;
+struct direntry;
+struct componentname;
+struct denode;
+
+/*
+ * Internal service routine prototypes.
+ */
+int deget(struct msdosfsmount *, u_long, u_long, struct denode **);
+int uniqdosname(struct denode *, struct componentname *, u_char *);
+
+int readep(struct msdosfsmount *pmp, u_long dirclu, u_long dirofs,  struct buf **bpp, struct direntry **epp);
+int readde(struct denode *dep, struct buf **bpp, struct direntry **epp);
+int deextend(struct denode *dep, u_long length);
+int fillinusemap(struct msdosfsmount *pmp);
+int createde(struct denode *dep, struct denode *ddep, struct denode **depp, struct componentname *cnp);
+int removede(struct denode *pdep, struct denode *dep);
+int detrunc(struct denode *dep, u_long length, int flags);
+#endif	/* !_FS_MSDOSFS_DENODE_H_ */

Copied: stable/12/usr.sbin/makefs/msdos/direntry.h (from r351273, head/usr.sbin/makefs/msdos/direntry.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.sbin/makefs/msdos/direntry.h	Mon Sep  9 17:32:40 2019	(r352079, copy of r351273, head/usr.sbin/makefs/msdos/direntry.h)
@@ -0,0 +1,146 @@
+/* $FreeBSD$ */
+/*	$NetBSD: direntry.h,v 1.14 1997/11/17 15:36:32 ws Exp $	*/
+
+/*-
+ * SPDX-License-Identifier: BSD-4-Clause
+ *
+ * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
+ * Copyright (C) 1994, 1995, 1997 TooLs GmbH.
+ * All rights reserved.
+ * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*-
+ * Written by Paul Popelka (paulp@uts.amdahl.com)
+ *
+ * You can do anything you want with this software, just don't say you wrote
+ * it, and don't remove this notice.
+ *
+ * This software is provided "as is".
+ *
+ * The author supplies this software to be publicly redistributed on the
+ * understanding that the author is not responsible for the correct
+ * functioning of this software in any circumstances and is not liable for
+ * any damages caused by this software.
+ *
+ * October 1992
+ */
+#ifndef _FS_MSDOSFS_DIRENTRY_H_
+#define	_FS_MSDOSFS_DIRENTRY_H_
+
+/*
+ * Structure of a dos directory entry.
+ */
+struct direntry {
+	uint8_t		deName[11];	/* filename, blank filled */
+#define	SLOT_EMPTY	0x00		/* slot has never been used */
+#define	SLOT_E5		0x05		/* the real value is 0xe5 */
+#define	SLOT_DELETED	0xe5		/* file in this slot deleted */
+	uint8_t		deAttributes;	/* file attributes */
+#define	ATTR_NORMAL	0x00		/* normal file */
+#define	ATTR_READONLY	0x01		/* file is readonly */
+#define	ATTR_HIDDEN	0x02		/* file is hidden */
+#define	ATTR_SYSTEM	0x04		/* file is a system file */
+#define	ATTR_VOLUME	0x08		/* entry is a volume label */
+#define	ATTR_DIRECTORY	0x10		/* entry is a directory name */
+#define	ATTR_ARCHIVE	0x20		/* file is new or modified */
+	uint8_t		deLowerCase;	/* NT VFAT lower case flags */
+#define	LCASE_BASE	0x08		/* filename base in lower case */
+#define	LCASE_EXT	0x10		/* filename extension in lower case */
+	uint8_t		deCHundredth;	/* hundredth of seconds in CTime */
+	uint8_t		deCTime[2];	/* create time */
+	uint8_t		deCDate[2];	/* create date */
+	uint8_t		deADate[2];	/* access date */
+	uint8_t		deHighClust[2];	/* high bytes of cluster number */
+	uint8_t		deMTime[2];	/* last update time */
+	uint8_t		deMDate[2];	/* last update date */
+	uint8_t		deStartCluster[2]; /* starting cluster of file */
+	uint8_t		deFileSize[4];	/* size of file in bytes */
+};
+
+/*
+ * Structure of a Win95 long name directory entry
+ */
+struct winentry {
+	uint8_t		weCnt;
+#define	WIN_LAST	0x40
+#define	WIN_CNT		0x3f
+	uint8_t		wePart1[10];
+	uint8_t		weAttributes;
+#define	ATTR_WIN95	0x0f
+	uint8_t		weReserved1;
+	uint8_t		weChksum;
+	uint8_t		wePart2[12];
+	uint16_t	weReserved2;
+	uint8_t		wePart3[4];
+};
+#define	WIN_CHARS	13	/* Number of chars per winentry */
+
+/*
+ * Maximum number of winentries for a filename.
+ */
+#define	WIN_MAXSUBENTRIES 20
+
+/*
+ * Maximum filename length in Win95
+ * Note: Must be < sizeof(dirent.d_name)
+ */
+#define	WIN_MAXLEN	255
+
+/*
+ * This is the format of the contents of the deTime field in the direntry
+ * structure.
+ * We don't use bitfields because we don't know how compilers for
+ * arbitrary machines will lay them out.
+ */
+#define DT_2SECONDS_MASK	0x1F	/* seconds divided by 2 */
+#define DT_2SECONDS_SHIFT	0
+#define DT_MINUTES_MASK		0x7E0	/* minutes */
+#define DT_MINUTES_SHIFT	5
+#define DT_HOURS_MASK		0xF800	/* hours */
+#define DT_HOURS_SHIFT		11
+
+/*
+ * This is the format of the contents of the deDate field in the direntry
+ * structure.
+ */
+#define DD_DAY_MASK		0x1F	/* day of month */
+#define DD_DAY_SHIFT		0
+#define DD_MONTH_MASK		0x1E0	/* month */
+#define DD_MONTH_SHIFT		5
+#define DD_YEAR_MASK		0xFE00	/* year - 1980 */
+#define DD_YEAR_SHIFT		9
+
+uint8_t winChksum(uint8_t *name);
+int winSlotCnt(const u_char *un, size_t unlen);
+int unix2dosfn(const u_char *un, u_char dn[12], size_t unlen, u_int gen);
+int winChkName(const u_char *un, size_t unlen, struct winentry *wep,
+    int chksum);
+int unix2winfn(const u_char *un, size_t unlen, struct winentry *wep, int cnt,
+    int chksum);
+
+#endif	/* !_FS_MSDOSFS_DIRENTRY_H_ */

Copied: stable/12/usr.sbin/makefs/msdos/fat.h (from r351273, head/usr.sbin/makefs/msdos/fat.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.sbin/makefs/msdos/fat.h	Mon Sep  9 17:32:40 2019	(r352079, copy of r351273, head/usr.sbin/makefs/msdos/fat.h)
@@ -0,0 +1,110 @@
+/* $FreeBSD$ */
+/*	$NetBSD: fat.h,v 1.12 1997/11/17 15:36:36 ws Exp $	*/
+
+/*-
+ * SPDX-License-Identifier: BSD-4-Clause
+ *
+ * Copyright (C) 1994, 1997 Wolfgang Solfrank.
+ * Copyright (C) 1994, 1997 TooLs GmbH.
+ * All rights reserved.
+ * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*-
+ * Written by Paul Popelka (paulp@uts.amdahl.com)
+ *
+ * You can do anything you want with this software, just don't say you wrote
+ * it, and don't remove this notice.
+ *
+ * This software is provided "as is".
+ *
+ * The author supplies this software to be publicly redistributed on the
+ * understanding that the author is not responsible for the correct
+ * functioning of this software in any circumstances and is not liable for
+ * any damages caused by this software.
+ *
+ * October 1992
+ */
+
+#ifndef _FS_MSDOSFS_FAT_H_
+#define	_FS_MSDOSFS_FAT_H_
+/*
+ * Some useful cluster numbers.
+ */
+#define	MSDOSFSROOT	0		/* cluster 0 means the root dir */
+#define	CLUST_FREE	0		/* cluster 0 also means a free cluster */
+#define	MSDOSFSFREE	CLUST_FREE
+#define	CLUST_FIRST	2		/* first legal cluster number */
+#define	CLUST_RSRVD	0xfffffff6	/* reserved cluster range */
+#define	CLUST_BAD	0xfffffff7	/* a cluster with a defect */
+#define	CLUST_EOFS	0xfffffff8	/* start of eof cluster range */
+#define	CLUST_EOFE	0xffffffff	/* end of eof cluster range */
+
+#define	FAT12_MASK	0x00000fff	/* mask for 12 bit cluster numbers */
+#define	FAT16_MASK	0x0000ffff	/* mask for 16 bit cluster numbers */
+#define	FAT32_MASK	0x0fffffff	/* mask for FAT32 cluster numbers */
+
+/*
+ * MSDOSFS:
+ * Return true if filesystem uses 12 bit FATs. Microsoft Programmer's
+ * Reference says if the maximum cluster number in a filesystem is greater
+ * than 4084 ((CLUST_RSRVD - CLUST_FIRST) & FAT12_MASK) then we've got a
+ * 16 bit FAT filesystem. While mounting, the result of this test is stored
+ * in pm_fatentrysize.
+ */
+#define	FAT12(pmp)	(pmp->pm_fatmask == FAT12_MASK)
+#define	FAT16(pmp)	(pmp->pm_fatmask == FAT16_MASK)
+#define	FAT32(pmp)	(pmp->pm_fatmask == FAT32_MASK)
+
+#define	MSDOSFSEOF(pmp, cn)	((((cn) | ~(pmp)->pm_fatmask) & CLUST_EOFS) == CLUST_EOFS)
+
+/*
+ * These are the values for the function argument to the function
+ * fatentry().
+ */
+#define	FAT_GET		0x0001	/* get a FAT entry */
+#define	FAT_SET		0x0002	/* set a FAT entry */
+#define	FAT_GET_AND_SET	(FAT_GET | FAT_SET)
+
+/*
+ * Flags to extendfile:
+ */
+#define	DE_CLEAR	1	/* Zero out the blocks allocated */
+
+struct buf;
+struct denode;
+struct msdosfsmount;
+
+int pcbmap(struct denode *dep, u_long findcn, daddr_t *bnp, u_long *cnp, int* sp);
+int clusterfree(struct msdosfsmount *pmp, u_long cn, u_long *oldcnp);
+int clusteralloc(struct msdosfsmount *pmp, u_long start, u_long count, u_long fillwith, u_long *retcluster, u_long *got);
+int fatentry(int function, struct msdosfsmount *pmp, u_long cluster, u_long *oldcontents, u_long newcontents);
+int freeclusterchain(struct msdosfsmount *pmp, u_long startchain);
+int extendfile(struct denode *dep, u_long count, struct buf **bpp, u_long *ncp, int flags);
+void fc_purge(struct denode *dep, u_int frcn);
+
+#endif	/* !_FS_MSDOSFS_FAT_H_ */

Copied: stable/12/usr.sbin/makefs/msdos/msdosfs_conv.c (from r351273, head/usr.sbin/makefs/msdos/msdosfs_conv.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.sbin/makefs/msdos/msdosfs_conv.c	Mon Sep  9 17:32:40 2019	(r352079, copy of r351273, head/usr.sbin/makefs/msdos/msdosfs_conv.c)
@@ -0,0 +1,508 @@
+/*-
+ * Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
+ * Copyright (C) 1994, 1995, 1997 TooLs GmbH.
+ * All rights reserved.
+ * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by TooLs GmbH.
+ * 4. The name of TooLs GmbH may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+/*
+ * Written by Paul Popelka (paulp@uts.amdahl.com)
+ *
+ * You can do anything you want with this software, just don't say you wrote
+ * it, and don't remove this notice.
+ *
+ * This software is provided "as is".
+ *
+ * The author supplies this software to be publicly redistributed on the
+ * understanding that the author is not responsible for the correct
+ * functioning of this software in any circumstances and is not liable for
+ * any damages caused by this software.
+ *
+ * October 1992
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/endian.h>
+
+#include <dirent.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <fs/msdosfs/bpb.h>
+
+#include "makefs.h"
+#include "msdos.h"
+
+#include "msdos/denode.h"
+#include "msdos/direntry.h"
+#include "msdos/fat.h"
+#include "msdos/msdosfsmount.h"
+
+static int char8ucs2str(const uint8_t *in, int n, uint16_t *out, int m);
+static void ucs2pad(uint16_t *buf, int len, int size);
+static int char8match(uint16_t *w1, uint16_t *w2, int n);
+
+static const u_char unix2dos[256] = {
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 00-07 */
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 08-0f */
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 10-17 */
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 18-1f */
+	0,    '!',  0,    '#',  '$',  '%',  '&',  '\'',	/* 20-27 */
+	'(',  ')',  0,    '+',  0,    '-',  0,    0,	/* 28-2f */
+	'0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',	/* 30-37 */
+	'8',  '9',  0,    0,    0,    0,    0,    0,	/* 38-3f */
+	'@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',	/* 40-47 */
+	'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',	/* 48-4f */
+	'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',	/* 50-57 */
+	'X',  'Y',  'Z',  0,    0,    0,    '^',  '_',	/* 58-5f */
+	'`',  'A',  'B',  'C',  'D',  'E',  'F',  'G',	/* 60-67 */
+	'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',	/* 68-6f */
+	'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',	/* 70-77 */
+	'X',  'Y',  'Z',  '{',  0,    '}',  '~',  0,	/* 78-7f */
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 80-87 */
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 88-8f */
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 90-97 */
+	0,    0,    0,    0,    0,    0,    0,    0,	/* 98-9f */
+	0,    0xad, 0xbd, 0x9c, 0xcf, 0xbe, 0xdd, 0xf5,	/* a0-a7 */
+	0xf9, 0xb8, 0xa6, 0xae, 0xaa, 0xf0, 0xa9, 0xee,	/* a8-af */
+	0xf8, 0xf1, 0xfd, 0xfc, 0xef, 0xe6, 0xf4, 0xfa,	/* b0-b7 */
+	0xf7, 0xfb, 0xa7, 0xaf, 0xac, 0xab, 0xf3, 0xa8,	/* b8-bf */
+	0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80,	/* c0-c7 */
+	0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8,	/* c8-cf */
+	0xd1, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0x9e,	/* d0-d7 */
+	0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0xed, 0xe8, 0xe1,	/* d8-df */
+	0xb7, 0xb5, 0xb6, 0xc7, 0x8e, 0x8f, 0x92, 0x80,	/* e0-e7 */
+	0xd4, 0x90, 0xd2, 0xd3, 0xde, 0xd6, 0xd7, 0xd8,	/* e8-ef */
+	0xd1, 0xa5, 0xe3, 0xe0, 0xe2, 0xe5, 0x99, 0xf6,	/* f0-f7 */
+	0x9d, 0xeb, 0xe9, 0xea, 0x9a, 0xed, 0xe8, 0x98,	/* f8-ff */
+};
+
+static const u_char u2l[256] = {
+	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 00-07 */
+	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* 08-0f */

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201909091732.x89HWeTr083276>