diff options
| author | mlelstv <mlelstv@NetBSD.org> | 2016-01-30 09:59:27 +0000 |
|---|---|---|
| committer | mlelstv <mlelstv@NetBSD.org> | 2016-01-30 09:59:27 +0000 |
| commit | ffdc44f9ef5a459b3ff73b4f957f2dff18366365 (patch) | |
| tree | f9e35316627e2a0634711f7c480e4354c6b74f6d /usr.sbin/makefs | |
| parent | c516e5f56c72913052add7992b29b7a811a9575a (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.c | 43 | ||||
| -rw-r--r-- | usr.sbin/makefs/msdos/msdosfs_vfsops.c | 8 | ||||
| -rw-r--r-- | usr.sbin/makefs/msdos/msdosfs_vnops.c | 11 |
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; } |
