summaryrefslogtreecommitdiff
path: root/usr.sbin/makefs
diff options
context:
space:
mode:
authormlelstv <mlelstv@NetBSD.org>2016-01-30 09:59:27 +0000
committermlelstv <mlelstv@NetBSD.org>2016-01-30 09:59:27 +0000
commitffdc44f9ef5a459b3ff73b4f957f2dff18366365 (patch)
treef9e35316627e2a0634711f7c480e4354c6b74f6d /usr.sbin/makefs
parentc516e5f56c72913052add7992b29b7a811a9575a (diff)
Add support to msdosfs and makefs to generate correct Unicode (UCS-2) directory
entries from UTF8 encoded file names.
Diffstat (limited to 'usr.sbin/makefs')
-rw-r--r--usr.sbin/makefs/msdos.c43
-rw-r--r--usr.sbin/makefs/msdos/msdosfs_vfsops.c8
-rw-r--r--usr.sbin/makefs/msdos/msdosfs_vnops.c11
3 files changed, 42 insertions, 20 deletions
diff --git a/usr.sbin/makefs/msdos.c b/usr.sbin/makefs/msdos.c
index a445f43c2f3..150e6c26011 100644
--- a/usr.sbin/makefs/msdos.c
+++ b/usr.sbin/makefs/msdos.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msdos.c,v 1.15 2015/10/16 16:40:02 christos Exp $ */
+/* $NetBSD: msdos.c,v 1.16 2016/01/30 09:59:27 mlelstv Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: msdos.c,v 1.15 2015/10/16 16:40:02 christos Exp $");
+__RCSID("$NetBSD: msdos.c,v 1.16 2016/01/30 09:59:27 mlelstv Exp $");
#endif /* !__lint */
#include <sys/param.h>
@@ -55,7 +55,9 @@ __RCSID("$NetBSD: msdos.c,v 1.15 2015/10/16 16:40:02 christos Exp $");
#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"
@@ -63,10 +65,15 @@ __RCSID("$NetBSD: msdos.c,v 1.15 2015/10/16 16:40:02 christos Exp $");
static int msdos_populate_dir(const char *, struct denode *, fsnode *,
fsnode *, fsinfo_t *);
+struct msdos_options_ex {
+ struct msdos_options options;
+ bool utf8;
+};
+
void
msdos_prep_opts(fsinfo_t *fsopts)
{
- struct msdos_options *msdos_opt = ecalloc(1, sizeof(*msdos_opt));
+ struct msdos_options_ex *msdos_opt = ecalloc(1, sizeof(*msdos_opt));
const option_t msdos_options[] = {
#define AOPT(_opt, _type, _name, _min, _desc) { \
.letter = _opt, \
@@ -76,7 +83,7 @@ msdos_prep_opts(fsinfo_t *fsopts)
(sizeof(_type) == 1 ? OPT_INT8 : \
(sizeof(_type) == 2 ? OPT_INT16 : \
(sizeof(_type) == 4 ? OPT_INT32 : OPT_INT64)))), \
- .value = &msdos_opt->_name, \
+ .value = &msdos_opt->options._name, \
.minimum = _min, \
.maximum = sizeof(_type) == 1 ? 0xff : \
(sizeof(_type) == 2 ? 0xffff : \
@@ -85,6 +92,8 @@ msdos_prep_opts(fsinfo_t *fsopts)
},
ALLOPTS
#undef AOPT
+ { 'U', "utf8", &msdos_opt->utf8, OPT_BOOL,
+ 0, 1, "Use UTF8 names" },
{ .name = NULL }
};
@@ -131,10 +140,11 @@ msdos_parse_opts(const char *option, fsinfo_t *fsopts)
void
msdos_makefs(const char *image, const char *dir, fsnode *root, fsinfo_t *fsopts)
{
- struct msdos_options *msdos_opt = fsopts->fs_specific;
+ struct msdos_options_ex *msdos_opt = fsopts->fs_specific;
struct vnode vp, rootvp;
struct timeval start;
struct msdosfsmount *pmp;
+ uint32_t flags;
assert(image != NULL);
assert(dir != NULL);
@@ -145,31 +155,36 @@ msdos_makefs(const char *image, const char *dir, fsnode *root, fsinfo_t *fsopts)
* XXX: pick up other options from the msdos specific ones?
* Is minsize right here?
*/
- msdos_opt->create_size = MAX(msdos_opt->create_size, fsopts->minsize);
- msdos_opt->offset = fsopts->offset;
- if (msdos_opt->bytes_per_sector == 0) {
+ msdos_opt->options.create_size = MAX(msdos_opt->options.create_size,
+ fsopts->minsize);
+ msdos_opt->options.offset = fsopts->offset;
+ if (msdos_opt->options.bytes_per_sector == 0) {
if (fsopts->sectorsize == -1)
fsopts->sectorsize = 512;
- msdos_opt->bytes_per_sector = fsopts->sectorsize;
+ msdos_opt->options.bytes_per_sector = fsopts->sectorsize;
} else if (fsopts->sectorsize == -1) {
- fsopts->sectorsize = msdos_opt->bytes_per_sector;
- } else if (fsopts->sectorsize != msdos_opt->bytes_per_sector) {
+ fsopts->sectorsize = msdos_opt->options.bytes_per_sector;
+ } else if (fsopts->sectorsize != msdos_opt->options.bytes_per_sector) {
err(1, "inconsistent sectorsize -S %u"
"!= -o bytes_per_sector %u",
- fsopts->sectorsize, msdos_opt->bytes_per_sector);
+ fsopts->sectorsize, msdos_opt->options.bytes_per_sector);
}
/* create image */
printf("Creating `%s'\n", image);
TIMER_START(start);
- if (mkfs_msdos(image, NULL, msdos_opt) == -1)
+ if (mkfs_msdos(image, NULL, &msdos_opt->options) == -1)
return;
TIMER_RESULTS(start, "mkfs_msdos");
fsopts->fd = open(image, O_RDWR);
vp.fs = fsopts;
- if ((pmp = msdosfs_mount(&vp, 0)) == NULL)
+ flags = 0;
+ if (msdos_opt->utf8)
+ flags |= MSDOSFSMNT_UTF8;
+
+ if ((pmp = msdosfs_mount(&vp, flags)) == NULL)
err(1, "msdosfs_mount");
if (msdosfs_root(pmp, &rootvp) != 0)
diff --git a/usr.sbin/makefs/msdos/msdosfs_vfsops.c b/usr.sbin/makefs/msdos/msdosfs_vfsops.c
index 48f82206405..4253e2f238b 100644
--- a/usr.sbin/makefs/msdos/msdosfs_vfsops.c
+++ b/usr.sbin/makefs/msdos/msdosfs_vfsops.c
@@ -50,7 +50,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.9 2015/03/29 05:52:59 agc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vfsops.c,v 1.10 2016/01/30 09:59:27 mlelstv Exp $");
#include <sys/param.h>
@@ -152,6 +152,12 @@ msdosfs_mount(struct vnode *devvp, int flags)
}
}
+ pmp->pm_flags = flags & MSDOSFSMNT_MNTOPT;
+ if (pmp->pm_flags & MSDOSFSMNT_GEMDOSFS)
+ pmp->pm_flags |= MSDOSFSMNT_NOWIN95;
+ if (pmp->pm_flags & MSDOSFSMNT_NOWIN95)
+ pmp->pm_flags |= MSDOSFSMNT_SHORTNAME;
+
if (pmp->pm_Sectors == 0) {
pmp->pm_HiddenSects = getulong(b50->bpbHiddenSecs);
pmp->pm_HugeSectors = getulong(b50->bpbHugeSectors);
diff --git a/usr.sbin/makefs/msdos/msdosfs_vnops.c b/usr.sbin/makefs/msdos/msdosfs_vnops.c
index 4cd73b94128..8ed4839185d 100644
--- a/usr.sbin/makefs/msdos/msdosfs_vnops.c
+++ b/usr.sbin/makefs/msdos/msdosfs_vnops.c
@@ -1,4 +1,4 @@
-/* $NetBSD: msdosfs_vnops.c,v 1.16 2015/03/29 05:52:59 agc Exp $ */
+/* $NetBSD: msdosfs_vnops.c,v 1.17 2016/01/30 09:59:27 mlelstv Exp $ */
/*-
* Copyright (C) 1994, 1995, 1997 Wolfgang Solfrank.
@@ -51,7 +51,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.16 2015/03/29 05:52:59 agc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: msdosfs_vnops.c,v 1.17 2016/01/30 09:59:27 mlelstv Exp $");
#include <sys/param.h>
#include <sys/mman.h>
@@ -154,12 +154,12 @@ msdosfs_findslot(struct denode *dp, struct componentname *cnp)
break;
case 2:
wincnt = winSlotCnt((const u_char *)cnp->cn_nameptr,
- cnp->cn_namelen) + 1;
+ cnp->cn_namelen, pmp->pm_flags & MSDOSFSMNT_UTF8) + 1;
break;
case 3:
olddos = 0;
wincnt = winSlotCnt((const u_char *)cnp->cn_nameptr,
- cnp->cn_namelen) + 1;
+ cnp->cn_namelen, pmp->pm_flags & MSDOSFSMNT_UTF8) + 1;
break;
}
@@ -243,7 +243,8 @@ msdosfs_findslot(struct denode *dp, struct componentname *cnp)
chksum = winChkName((const u_char *)cnp->cn_nameptr,
cnp->cn_namelen,
(struct winentry *)dep,
- chksum);
+ chksum,
+ pmp->pm_flags & MSDOSFSMNT_UTF8);
continue;
}