fuse-exfatfs: Make mkfs.exfat work on NetBSD

Include the disk sizing code from NetBSD's newfs, allowing the mkfs to
succeed.
This commit is contained in:
perseant 2022-10-06 00:51:49 +00:00
parent 0d941f2e7c
commit a13bafe7e3
8 changed files with 343 additions and 6 deletions

View file

@ -1,4 +1,4 @@
$NetBSD: CHANGES-2022,v 1.4868 2022/10/05 22:09:52 gutteridge Exp $
$NetBSD: CHANGES-2022,v 1.4869 2022/10/06 00:51:49 perseant Exp $
Changes to the packages collection and infrastructure in 2022:
@ -7357,3 +7357,4 @@ Changes to the packages collection and infrastructure in 2022:
Updated math/py-scipy to 1.9.1 [adam 2022-10-05]
Updated devel/py-types-setuptools to 65.4.0.0 [adam 2022-10-05]
Updated time/p5-DateTime-TimeZone to 2.54 [gutteridge 2022-10-05]
Updated filesystems/fuse-exfat to 1.3.0nb1 [perseant 2022-10-05]

View file

@ -1,10 +1,11 @@
# $NetBSD: Makefile,v 1.2 2020/11/24 15:03:22 ryoon Exp $
# $NetBSD: Makefile,v 1.3 2022/10/06 00:51:49 perseant Exp $
GITHUB_PROJECT= exfat
GITHUB_TAG= v${PKGVERSION_NOREV}
DISTNAME= fuse-exfat-1.3.0
PKGREVISION= 1
CATEGORIES= filesystems
MASTER_SITES= ${MASTER_SITE_GITHUB:=relan/}
GITHUB_PROJECT= exfat
GITHUB_TAG= v${PKGVERSION_NOREV}
MAINTAINER= pkgsrc-users@NetBSD.org
HOMEPAGE= https://github.com/relan/exfat
@ -16,7 +17,7 @@ USE_LANGUAGES= c c++
GNU_CONFIGURE= yes
USE_TOOLS+= autoheader automake autoreconf gmake pkg-config
post-extract:
post-patch:
cd ${WRKSRC} && autoreconf -fiv
.include "../../mk/fuse.buildlink3.mk"

View file

@ -1,5 +1,10 @@
$NetBSD: distinfo,v 1.3 2021/10/26 10:25:27 nia Exp $
$NetBSD: distinfo,v 1.4 2022/10/06 00:51:49 perseant Exp $
BLAKE2s (fuse-exfat-1.3.0.tar.gz) = cc38c87a3c600539f3a31d546da4ea743164e6d8aab91939222c6761e7ce39fe
SHA512 (fuse-exfat-1.3.0.tar.gz) = fa3951e16889db65685e1fb71b0c75fc7014a8025c3442bf6164b94ddd51d282a8ae5e891c46195be53d2a10d62444e2fa1bb3fa3de59c2c3411c6dac363b488
Size (fuse-exfat-1.3.0.tar.gz) = 57846 bytes
SHA1 (patch-configure.ac) = 4cf96cdf651c49bc01751d38427a9451b02aeeea
SHA1 (patch-libexfat__Makefile.am) = a1a4a6c83eac6364fef0ad4fe1fa788feececf91
SHA1 (patch-libexfat__io.c) = e03d4bf8ae18cb08cab041dce115ffae00d17918
SHA1 (patch-libexfat__nbpartutil.c) = 24b4062543afc864230e28cd667ada06a3a35052
SHA1 (patch-libexfat__nbpartutil.h) = 0e87652c054314eabeafc1cbed76cbe0a933735e

View file

@ -0,0 +1,15 @@
$NetBSD: patch-configure.ac,v 1.1 2022/10/06 00:51:49 perseant Exp $
Supply -lutil and -lprop, required for the NetBSD disk size routine.
--- configure.ac 2018-09-14 22:03:24.000000000 -0700
+++ configure.ac 2022-09-27 08:59:46.680435126 -0700
@@ -38,6 +38,8 @@
[Define if block devices are not supported.])
], [:])
PKG_CHECK_MODULES([FUSE], [fuse])
+AC_CHECK_LIB(util, opendisk)
+AC_CHECK_LIB(prop, prop_dictionary_get_int64)
AC_CONFIG_HEADERS([libexfat/config.h])
AC_CONFIG_FILES([
libexfat/Makefile

View file

@ -0,0 +1,14 @@
$NetBSD: patch-libexfat__Makefile.am,v 1.1 2022/10/06 00:51:49 perseant Exp $
Add new file containing NetBSD disk sizing routine.
--- libexfat/Makefile.am 2022-09-27 10:01:50.915736384 -0700
+++ libexfat/Makefile.am 2022-09-27 10:02:11.320568581 -0700
@@ -32,6 +32,7 @@
lookup.c \
mount.c \
node.c \
+ nbpartutil.c \
platform.h \
repair.c \
time.c \

View file

@ -0,0 +1,46 @@
$NetBSD: patch-libexfat__io.c,v 1.1 2022/10/06 00:51:49 perseant Exp $
Add working NetBSD disk sizing.
--- libexfat/io.c 2018-09-14 22:03:24.000000000 -0700
+++ libexfat/io.c 2022-09-27 09:23:55.645533399 -0700
@@ -35,6 +35,10 @@
#include <sys/disklabel.h>
#include <sys/dkio.h>
#include <sys/ioctl.h>
+#elif defined(__NetBSD__)
+#include <sys/param.h>
+#include <util.h>
+#include "nbpartutil.h"
#elif __linux__
#include <sys/mount.h>
#endif
@@ -226,6 +230,28 @@
"you can fix this with fdisk(8)");
}
else
+#elif defined(__NetBSD__)
+ if (!S_ISREG(stbuf.st_mode))
+ {
+ if (stbuf.st_size != 0) {
+ dev->size = stbuf.st_size;
+ } else {
+ char device[MAXPATHLEN];
+ u_int secsize;
+ off_t dksize;
+
+ /* mkexfatfs can only use the block device, but */
+ /* getdisksize() needs the raw device name */
+ getdiskrawname(device, sizeof(device), spec);
+ getdisksize(device, &secsize, &dksize);
+ dev->size = secsize * dksize;
+ }
+ if (dev->size <= 0) {
+ exfat_error("Unable to determine file system size");
+ return NULL;
+ }
+ }
+ else
#endif
{
/* works for Linux, FreeBSD, Solaris */

View file

@ -0,0 +1,205 @@
$NetBSD: patch-libexfat__nbpartutil.c,v 1.1 2022/10/06 00:51:49 perseant Exp $
Supply the partition utility code from NetBSD newfs.
Only compiled if __NetBSD__ is defined.
--- libexfat/nbpartutil.c 2022-09-27 10:20:12.769075968 -0700
+++ libexfat/nbpartutil.c 2022-09-27 10:09:39.285740643 -0700
@@ -0,0 +1,197 @@
+#ifdef __NetBSD__
+/* NetBSD: partutil.c,v 1.15.18.2 2021/01/09 19:30:14 martin Exp */
+
+/*-
+ * Copyright (c) 2006 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 THE FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+
+#include <sys/cdefs.h>
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/disklabel.h>
+#include <sys/disk.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+
+
+#include <disktab.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <util.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <prop/proplib.h>
+
+#include "nbpartutil.h"
+
+/*
+ * Convert disklabel geometry info to disk_geom.
+ */
+static void
+label2geom(struct disk_geom *geo, const struct disklabel *lp)
+{
+ geo->dg_secperunit = lp->d_secperunit;
+ geo->dg_secsize = lp->d_secsize;
+ geo->dg_nsectors = lp->d_nsectors;
+ geo->dg_ntracks = lp->d_ntracks;
+ geo->dg_ncylinders = lp->d_ncylinders;
+ geo->dg_secpercyl = lp->d_secpercyl;
+ geo->dg_pcylinders = lp->d_ncylinders;
+ geo->dg_sparespertrack = lp->d_sparespertrack;
+ geo->dg_sparespercyl = lp->d_sparespercyl;
+ geo->dg_acylinders = lp->d_acylinders;
+}
+
+/*
+ * Set what we need to know about disk geometry.
+ */
+static void
+dict2geom(struct disk_geom *geo, prop_dictionary_t dict)
+{
+ (void)memset(geo, 0, sizeof(struct disk_geom));
+ prop_dictionary_get_int64(dict, "sectors-per-unit",
+ &geo->dg_secperunit);
+ prop_dictionary_get_uint32(dict, "sector-size", &geo->dg_secsize);
+ prop_dictionary_get_uint32(dict, "sectors-per-track",
+ &geo->dg_nsectors);
+ prop_dictionary_get_uint32(dict, "tracks-per-cylinder",
+ &geo->dg_ntracks);
+ prop_dictionary_get_uint32(dict, "cylinders-per-unit",
+ &geo->dg_ncylinders);
+}
+
+
+int
+getdiskinfo(const char *s, int fd, const char *dt, struct disk_geom *geo,
+ struct dkwedge_info *dkw)
+{
+ struct disklabel lab;
+ struct disklabel *lp = &lab;
+ prop_dictionary_t disk_dict, geom_dict;
+ struct stat sb;
+ const struct partition *pp;
+ int ptn, error;
+
+ if (dt) {
+ lp = getdiskbyname(dt);
+ if (lp == NULL)
+ errx(1, "unknown disk type `%s'", dt);
+ }
+
+ /* Get disk description dictionary */
+ disk_dict = NULL;
+ error = prop_dictionary_recv_ioctl(fd, DIOCGDISKINFO, &disk_dict);
+
+ /* fail quickly if the device does not exist at all */
+ if (error == ENXIO)
+ return -1;
+
+ if (error) {
+ /*
+ * Ask for disklabel if DIOCGDISKINFO failed. This is
+ * compatibility call and can be removed when all devices
+ * will support DIOCGDISKINFO.
+ * cgd, ccd pseudo disk drives doesn't support DIOCGDDISKINFO
+ */
+ if (ioctl(fd, DIOCGDINFO, lp) == -1) {
+ if (errno != ENXIO)
+ warn("DIOCGDINFO on %s failed", s);
+ return -1;
+ }
+ label2geom(geo, lp);
+ } else {
+ geom_dict = prop_dictionary_get(disk_dict, "geometry");
+ dict2geom(geo, geom_dict);
+ }
+ if (disk_dict != NULL)
+ prop_object_release(disk_dict);
+
+ if (dkw == NULL)
+ return 0;
+
+ /* Get info about partition/wedge */
+ if (ioctl(fd, DIOCGWEDGEINFO, dkw) != -1) {
+ /* DIOCGWEDGEINFO didn't fail, we're done */
+ return 0;
+ }
+
+ if (ioctl(fd, DIOCGDINFO, lp) == -1) {
+ err(1, "Please implement DIOCGWEDGEINFO or "
+ "DIOCGDINFO for disk device %s", s);
+ }
+
+ /* DIOCGDINFO didn't fail */
+ (void)memset(dkw, 0, sizeof(*dkw));
+
+ if (stat(s, &sb) == -1)
+ return 0;
+
+ ptn = strchr(s, '\0')[-1] - 'a';
+ if ((unsigned)ptn >= lp->d_npartitions ||
+ (devminor_t)ptn != DISKPART(sb.st_rdev))
+ return 0;
+
+ pp = &lp->d_partitions[ptn];
+ if (ptn != getrawpartition()) {
+ dkw->dkw_offset = pp->p_offset;
+ dkw->dkw_size = pp->p_size;
+ } else {
+ dkw->dkw_offset = 0;
+ dkw->dkw_size = geo->dg_secperunit;
+ }
+ dkw->dkw_parent[0] = '*';
+ strlcpy(dkw->dkw_ptype, getfstypename(pp->p_fstype),
+ sizeof(dkw->dkw_ptype));
+
+ return 0;
+}
+
+int
+getdisksize(const char *name, u_int *secsize, off_t *mediasize)
+{
+ char buf[MAXPATHLEN];
+ struct disk_geom geo;
+ int fd, error;
+
+ if ((fd = opendisk(name, O_RDONLY, buf, sizeof(buf), 0)) == -1)
+ return -1;
+
+ error = getdiskinfo(name, fd, NULL, &geo, NULL);
+ close(fd);
+ if (error)
+ return error;
+
+ *secsize = geo.dg_secsize;
+ *mediasize = geo.dg_secsize * geo.dg_secperunit;
+ return 0;
+}
+#endif /* __NetBSD__ */

View file

@ -0,0 +1,50 @@
$NetBSD: patch-libexfat__nbpartutil.h,v 1.1 2022/10/06 00:51:49 perseant Exp $
Supply the partition utility code from NetBSD newfs.
Only compiled if __NetBSD__ is defined.
--- libexfat/nbpartutil.h 2022-09-27 10:20:12.769075968 -0700
+++ libexfat/nbpartutil.h 2022-09-27 10:09:39.310695167 -0700
@@ -0,0 +1,42 @@
+/* NetBSD: partutil.h,v 1.3 2014/12/29 16:27:43 christos Exp */
+
+/*-
+ * Copyright (c) 2006 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``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 THE FOUNDATION OR CONTRIBUTORS
+ * 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.
+ */
+#ifndef _PARTUTIL_H_
+#define _PARTUTIL_H_
+
+__BEGIN_DECLS
+struct dkwedge_info;
+struct disk_geom;
+int getdiskinfo(const char *, int, const char *,
+ struct disk_geom *, struct dkwedge_info *);
+int getdisksize(const char *, u_int *, off_t *);
+__END_DECLS
+
+#endif /* _PARTUTIL_H_ */