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 lu...@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 (pa...@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 (pa...@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 (pa...@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 (pa...@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 (pa...@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 (pa...@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 (pa...@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 (pa...@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 ***
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to