Module Name: src
Committed By: matt
Date: Fri May 3 16:05:12 UTC 2013
Modified Files:
src/sbin/disklabel: Makefile bswap.c bswap.h dkcksum.c dkcksum.h
extern.h interact.c main.c
src/share/mk: bsd.own.mk
src/sys/sys: disklabel.h
src/tools/disklabel: Makefile
Log Message:
Make disklabel a MI tool. It will use MACHINE/MACHINE_ARCH to determine
the disklabel params as well as allowing command-line options of -M <machine>
and -B {le,be} to specify MACHINE and byteorder to be used.
To generate a diff of this commit:
cvs rdiff -u -r1.69 -r1.70 src/sbin/disklabel/Makefile
cvs rdiff -u -r1.1 -r1.2 src/sbin/disklabel/bswap.c \
src/sbin/disklabel/bswap.h
cvs rdiff -u -r1.13 -r1.14 src/sbin/disklabel/dkcksum.c
cvs rdiff -u -r1.5 -r1.6 src/sbin/disklabel/dkcksum.h
cvs rdiff -u -r1.12 -r1.13 src/sbin/disklabel/extern.h
cvs rdiff -u -r1.37 -r1.38 src/sbin/disklabel/interact.c
cvs rdiff -u -r1.28 -r1.29 src/sbin/disklabel/main.c
cvs rdiff -u -r1.729 -r1.730 src/share/mk/bsd.own.mk
cvs rdiff -u -r1.113 -r1.114 src/sys/sys/disklabel.h
cvs rdiff -u -r1.5 -r1.6 src/tools/disklabel/Makefile
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/disklabel/Makefile
diff -u src/sbin/disklabel/Makefile:1.69 src/sbin/disklabel/Makefile:1.70
--- src/sbin/disklabel/Makefile:1.69 Tue Aug 30 12:39:52 2011
+++ src/sbin/disklabel/Makefile Fri May 3 16:05:12 2013
@@ -1,8 +1,8 @@
-# $NetBSD: Makefile,v 1.69 2011/08/30 12:39:52 bouyer Exp $
+# $NetBSD: Makefile,v 1.70 2013/05/03 16:05:12 matt Exp $
# @(#)Makefile 8.2 (Berkeley) 3/17/94
PROG= disklabel
-SRCS= main.c dkcksum.c interact.c printlabel.c
+SRCS= main.c dkcksum.c interact.c printlabel.c bswap.c
MAN= disklabel.5 disklabel.8
.if (${HOSTPROG:U} == "")
DPADD+= ${LIBUTIL}
Index: src/sbin/disklabel/bswap.c
diff -u src/sbin/disklabel/bswap.c:1.1 src/sbin/disklabel/bswap.c:1.2
--- src/sbin/disklabel/bswap.c:1.1 Tue Jan 5 15:45:26 2010
+++ src/sbin/disklabel/bswap.c Fri May 3 16:05:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: bswap.c,v 1.1 2010/01/05 15:45:26 tsutsui Exp $ */
+/* $NetBSD: bswap.c,v 1.2 2013/05/03 16:05:12 matt Exp $ */
/*-
* Copyright (c) 2009 Izumi Tsutsui. All rights reserved.
@@ -59,6 +59,8 @@
#include "nbtool_config.h"
#endif
+#include <string.h>
+
#include <sys/types.h>
#if HAVE_NBTOOL_CONFIG_H
#include <nbinclude/sys/disklabel.h>
@@ -69,11 +71,8 @@
#include "bswap.h"
#include "dkcksum.h"
-#if TARGET_BYTE_ORDER != BYTE_ORDER
-static void bswaplabel(struct disklabel *nlp, struct disklabel *olp);
-
-void
-bswaplabel(struct disklabel *nlp, struct disklabel *olp)
+static void
+bswaplabel(struct disklabel *nlp, const struct disklabel *olp)
{
int i;
@@ -137,31 +136,37 @@ bswaplabel(struct disklabel *nlp, struct
}
void
-targettohlabel(struct disklabel *hlp, struct disklabel *tlp)
+targettohlabel(struct disklabel *hlp, const struct disklabel *tlp)
{
- bswaplabel(hlp, tlp);
+ if (bswap32(tlp->d_magic) == DISKMAGIC)
+ bswaplabel(hlp, tlp);
+ else
+ *hlp = *tlp;
/* update checksum in host endian */
hlp->d_checksum = 0;
hlp->d_checksum = dkcksum(hlp);
}
void
-htotargetlabel(struct disklabel *tlp, struct disklabel *hlp)
+htotargetlabel(struct disklabel *tlp, const struct disklabel *hlp)
{
- bswaplabel(tlp, hlp);
+ if (bswap_p)
+ bswaplabel(tlp, hlp);
+ else
+ *tlp = *hlp;
+
/* update checksum in target endian */
tlp->d_checksum = 0;
- tlp->d_checksum = dkcksum_re(tlp);
+ tlp->d_checksum = dkcksum_target(tlp);
}
uint16_t
-dkcksum_re(struct disklabel *lp)
+dkcksum_target(struct disklabel *lp)
{
uint16_t npartitions;
- /* we can assume lp is reversed, but check it again for sanity */
if (lp->d_magic == DISKMAGIC)
npartitions = lp->d_npartitions;
else if (bswap32(lp->d_magic) == DISKMAGIC)
@@ -169,9 +174,8 @@ dkcksum_re(struct disklabel *lp)
else
npartitions = 0;
- if (npartitions > MAXPARTITIONS)
+ if (npartitions > maxpartitions)
npartitions = 0;
return dkcksum_sized(lp, npartitions);
}
-#endif
Index: src/sbin/disklabel/bswap.h
diff -u src/sbin/disklabel/bswap.h:1.1 src/sbin/disklabel/bswap.h:1.2
--- src/sbin/disklabel/bswap.h:1.1 Tue Jan 5 15:45:26 2010
+++ src/sbin/disklabel/bswap.h Fri May 3 16:05:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: bswap.h,v 1.1 2010/01/05 15:45:26 tsutsui Exp $ */
+/* $NetBSD: bswap.h,v 1.2 2013/05/03 16:05:12 matt Exp $ */
/*-
* Copyright (c) 2009 Izumi Tsutsui. All rights reserved.
@@ -34,31 +34,18 @@
#define BYTE_ORDER LITTLE_ENDIAN
#endif
#endif
+#else
+#include <sys/endian.h>
#endif
-#ifndef TARGET_BYTE_ORDER
-#define TARGET_BYTE_ORDER BYTE_ORDER
-#endif
-
-#if TARGET_BYTE_ORDER != BYTE_ORDER
-#define htotarget16(x) bswap16(x)
-#define target16toh(x) bswap16(x)
-#define htotarget32(x) bswap32(x)
-#define target32toh(x) bswap32(x)
-#define dkcksum_target(lp) dkcksum_re(lp)
-
-void htotargetlabel(struct disklabel *, struct disklabel *);
-void targettohlabel(struct disklabel *, struct disklabel *);
-uint16_t dkcksum_re(struct disklabel *);
+extern int bswap_p;
+extern u_int maxpartitions;
-#else
-#define htotarget16(x) (x)
-#define target16toh(x) (x)
-#define htotarget32(x) (x)
-#define target32toh(x) (x)
-#define dkcksum_target(lp) dkcksum(lp)
-#define htotargetlabel(tlp, hlp) \
- do {*(tlp) = *(hlp);} while (/* CONSTCOND */0)
-#define targettohlabel(hlp, tlp) \
- do {*(hlp) = *(tlp);} while (/* CONSTCOND */0)
-#endif
+#define htotarget16(x) (bswap_p ? bswap16(x) : (x))
+#define target16toh(x) (bswap_p ? bswap16(x) : (x))
+#define htotarget32(x) (bswap_p ? bswap32(x) : (x))
+#define target32toh(x) (bswap_p ? bswap32(x) : (x))
+
+void htotargetlabel(struct disklabel *, const struct disklabel *);
+void targettohlabel(struct disklabel *, const struct disklabel *);
+uint16_t dkcksum_target(struct disklabel *);
Index: src/sbin/disklabel/dkcksum.c
diff -u src/sbin/disklabel/dkcksum.c:1.13 src/sbin/disklabel/dkcksum.c:1.14
--- src/sbin/disklabel/dkcksum.c:1.13 Tue Jan 5 15:45:26 2010
+++ src/sbin/disklabel/dkcksum.c Fri May 3 16:05:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: dkcksum.c,v 1.13 2010/01/05 15:45:26 tsutsui Exp $ */
+/* $NetBSD: dkcksum.c,v 1.14 2013/05/03 16:05:12 matt Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)dkcksum.c 8.1 (Berkeley) 6/5/93";
#else
-__RCSID("$NetBSD: dkcksum.c,v 1.13 2010/01/05 15:45:26 tsutsui Exp $");
+__RCSID("$NetBSD: dkcksum.c,v 1.14 2013/05/03 16:05:12 matt Exp $");
#endif
#endif /* not lint */
@@ -51,22 +51,23 @@ __RCSID("$NetBSD: dkcksum.c,v 1.13 2010/
#include "dkcksum.h"
uint16_t
-dkcksum(struct disklabel *lp)
+dkcksum(const struct disklabel *lp)
{
return dkcksum_sized(lp, lp->d_npartitions);
}
uint16_t
-dkcksum_sized(struct disklabel *lp, size_t npartitions)
+dkcksum_sized(const struct disklabel *lp, size_t npartitions)
{
- uint16_t *start, *end;
+ const uint16_t *start, *end;
uint16_t sum;
sum = 0;
- start = (uint16_t *)lp;
- end = (uint16_t *)&lp->d_partitions[npartitions];
- while (start < end)
+ start = (const uint16_t *)lp;
+ end = (const uint16_t *)&lp->d_partitions[npartitions];
+ while (start < end) {
sum ^= *start++;
+ }
return sum;
}
Index: src/sbin/disklabel/dkcksum.h
diff -u src/sbin/disklabel/dkcksum.h:1.5 src/sbin/disklabel/dkcksum.h:1.6
--- src/sbin/disklabel/dkcksum.h:1.5 Tue Jan 5 15:45:26 2010
+++ src/sbin/disklabel/dkcksum.h Fri May 3 16:05:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: dkcksum.h,v 1.5 2010/01/05 15:45:26 tsutsui Exp $ */
+/* $NetBSD: dkcksum.h,v 1.6 2013/05/03 16:05:12 matt Exp $ */
-uint16_t dkcksum(struct disklabel *);
-uint16_t dkcksum_sized(struct disklabel *, size_t);
+uint16_t dkcksum(const struct disklabel *);
+uint16_t dkcksum_sized(const struct disklabel *, size_t);
Index: src/sbin/disklabel/extern.h
diff -u src/sbin/disklabel/extern.h:1.12 src/sbin/disklabel/extern.h:1.13
--- src/sbin/disklabel/extern.h:1.12 Thu Jan 17 18:33:58 2013
+++ src/sbin/disklabel/extern.h Fri May 3 16:05:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: extern.h,v 1.12 2013/01/17 18:33:58 christos Exp $ */
+/* $NetBSD: extern.h,v 1.13 2013/05/03 16:05:12 matt Exp $ */
/*
* Copyright (c) 1997 Christos Zoulas. All rights reserved.
@@ -32,17 +32,12 @@ void showpartition(FILE *, struct diskla
void interact(struct disklabel *, int);
int list_fs_types(void);
+extern u_int maxpartitions;
extern char specname[];
extern int Cflag;
#ifdef HAVE_NBTOOL_CONFIG_H
-static int
-dk_ioctl(int f, void *arg)
-{
- errno = ENOTTY;
- return -1;
-}
-# define dk_ioctl(f, cmd, arg) dk_ioctl(f, arg)
+#define dk_ioctl(f, cmd, arg) (errno = ENOTTY, -1)
#else
-# define dk_ioctl(f, cmd, arg) ioctl(f, cmd, arg)
-#endif /* HAVE_NBTOOL_CONFIG_H */
+int dk_ioctl(int, u_long cmd, void *);
+#endif
Index: src/sbin/disklabel/interact.c
diff -u src/sbin/disklabel/interact.c:1.37 src/sbin/disklabel/interact.c:1.38
--- src/sbin/disklabel/interact.c:1.37 Thu Jan 17 18:33:58 2013
+++ src/sbin/disklabel/interact.c Fri May 3 16:05:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: interact.c,v 1.37 2013/01/17 18:33:58 christos Exp $ */
+/* $NetBSD: interact.c,v 1.38 2013/05/03 16:05:12 matt Exp $ */
/*
* Copyright (c) 1997 Christos Zoulas. All rights reserved.
@@ -30,7 +30,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: interact.c,v 1.37 2013/01/17 18:33:58 christos Exp $");
+__RCSID("$NetBSD: interact.c,v 1.38 2013/05/03 16:05:12 matt Exp $");
#endif /* lint */
#include <sys/param.h>
@@ -45,7 +45,7 @@ __RCSID("$NetBSD: interact.c,v 1.37 2013
#include <sys/ioctl.h>
#if HAVE_NBTOOL_CONFIG_H
-#define getmaxpartitions() MAXPARTITIONS
+#define getmaxpartitions() maxpartitions
#include <nbinclude/sys/disklabel.h>
#else
#include <util.h>
Index: src/sbin/disklabel/main.c
diff -u src/sbin/disklabel/main.c:1.28 src/sbin/disklabel/main.c:1.29
--- src/sbin/disklabel/main.c:1.28 Thu Jan 17 18:33:58 2013
+++ src/sbin/disklabel/main.c Fri May 3 16:05:12 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: main.c,v 1.28 2013/01/17 18:33:58 christos Exp $ */
+/* $NetBSD: main.c,v 1.29 2013/05/03 16:05:12 matt Exp $ */
/*
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -76,7 +76,7 @@ __COPYRIGHT("@(#) Copyright (c) 1987, 19
static char sccsid[] = "@(#)disklabel.c 8.4 (Berkeley) 5/4/95";
/* from static char sccsid[] = "@(#)disklabel.c 1.2 (Symmetric) 11/28/85"; */
#else
-__RCSID("$NetBSD: main.c,v 1.28 2013/01/17 18:33:58 christos Exp $");
+__RCSID("$NetBSD: main.c,v 1.29 2013/05/03 16:05:12 matt Exp $");
#endif
#endif /* not lint */
@@ -163,6 +163,7 @@ static int readlabel_direct(int);
static void writelabel_direct(int);
static int update_label(int, u_int, u_int);
static struct disklabel *find_label(int, u_int);
+static void getmachineparams(const char *);
static void makedisktab(FILE *, struct disklabel *);
static void makelabel(const char *, const char *);
@@ -183,15 +184,142 @@ static int getulong(const char *, char
static int set_writable_fd = -1;
-#if HAVE_NBTOOL_CONFIG_H
-#define GETLABELOFFSET() LABELOFFSET
-#define GETLABELSECTOR() LABELSECTOR
-#define GETLABELUSESMBR() LABELUSESMBR
-#else /* HAVE_NBTOOL_CONFIG_H */
-#define GETLABELOFFSET() getlabeloffset()
-#define GETLABELSECTOR() getlabelsector()
-#define GETLABELUSESMBR() getlabelusesmbr()
+static u_int labeloffset;
+static u_int labelsector;
+static int labelusesmbr;
+u_int maxpartitions;
+static int byteorder;
+
+static int biendian_p;
+#ifndef HAVE_NBTOOL_CONFIG_H
+static int native_p = 1;
#endif
+int bswap_p;
+
+static const struct disklabel_params {
+ const char *machine;
+ int labelusesmbr;
+ u_int labelsector;
+ u_int labeloffset;
+ u_int maxpartitions;
+ u_int raw_part;
+ u_int oldmaxpartitions;
+ int byteorder;
+} disklabel_params[] = {
+ { "mvme68k", 0, 0, 0, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+ { "next68k", 0, 0, 0, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+
+ { "algor", 0, 0, 64, 8, 2, 0, LITTLE_ENDIAN }, /* mips */
+ { "alpha", 0, 0, 64, 8, 2, 0, LITTLE_ENDIAN }, /* alpha */
+ { "luna68k", 0, 0, 64, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+ { "mac68k", 0, 0, 64, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+ { "news68k", 0, 0, 64, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+ { "newsmips", 0, 0, 64, 8, 2, 0, BIG_ENDIAN }, /* mips */
+ { "pmax", 0, 0, 64, 8, 2, 0, LITTLE_ENDIAN }, /* mips */
+ { "sun2", 0, 0, 64, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+ { "sun68k", 0, 0, 64, 8, 2, 0, BIG_ENDIAN }, /* m68010 */
+ { "x68k", 0, 0, 64, 8, 2, 0, BIG_ENDIAN }, /* m68010 */
+
+ { "vax", 0, 0, 64, 12, 2, 8, LITTLE_ENDIAN }, /* vax */
+
+ { "amiga", 0, 0, 64, 16, 2, 0, BIG_ENDIAN }, /* m68k */
+ { "amigappc", 0, 0, 64, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+ { "evbmips", 0, 0, 64, 16, 2, 0, 0 }, /* mips */
+ { "evbppc", 0, 0, 64, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+
+ { "sparc", 0, 0, 128, 8, 2, 0, BIG_ENDIAN }, /* sun */
+ { "sparc64", 0, 0, 128, 8, 2, 0, BIG_ENDIAN }, /* sun */
+ { "sun3", 0, 0, 128, 8, 2, 0, BIG_ENDIAN }, /* sun */
+
+ { "atari", 0, 0, 516, 16, 2, 0, BIG_ENDIAN }, /* m68k */
+
+ { "mipsco", 0, 1, 0, 8, 2, 0, BIG_ENDIAN }, /* mips */
+ { "mvmeppc", 0, 1, 0, 8, 3, 0, BIG_ENDIAN }, /* powerpc */
+
+ { "bebox", 0, 1, 0, 8, 3, 0, BIG_ENDIAN }, /* powerpc */
+
+ { "emips", 0, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* mips */
+ { "hp700", 0, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* hppa */
+ { "ibmnws", 0, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+ { "ofppc", 0, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+ { "rs6000", 0, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+ { "sandpoint", 0, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+ { "sgimips", 0, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* mips */
+
+ { "sbmips", 0, 1, 0, 16, 3, 0, 0 }, /* mips */
+
+ { "cesfic", 0, 2, 0, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+ { "hp300", 0, 2, 0, 8, 2, 0, BIG_ENDIAN }, /* m68k */
+
+ { "ews4800mips",0, 9, 0, 16, 15, 0, BIG_ENDIAN }, /* mips */
+
+ { "macppc", 1, 0, 64, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+ { "pmon", 1, 0, 64, 16, 2, 0, 0 }, /* evbmips */
+
+ { "prep", 1, 1, 0, 8, 2, 0, BIG_ENDIAN }, /* powerpc */
+
+ { "dreadmcast", 1, 1, 0, 16, 2, 0, LITTLE_ENDIAN }, /* sh3 */
+ { "evbsh3", 1, 1, 0, 16, 2, 0, 0 }, /* sh3 */
+ { "hpcsh", 1, 1, 0, 16, 2, 0, LITTLE_ENDIAN }, /* sh3 */
+ { "evbppc-mbr", 1, 1, 0, 16, 2, 0, BIG_ENDIAN }, /* powerpc */
+ { "mmeye", 1, 1, 0, 16, 2, 0, 0 }, /* sh3 */
+
+ { "acorn26", 1, 1, 0, 16, 2, 8, LITTLE_ENDIAN }, /* arm */
+ { "acorn32", 1, 1, 0, 16, 2, 8, LITTLE_ENDIAN }, /* arm */
+ { "cats", 1, 1, 0, 16, 2, 8, LITTLE_ENDIAN }, /* arm */
+ { "evbarm", 1, 1, 0, 16, 2, 8, 0 }, /* arm */
+ { "iyonix", 1, 1, 0, 16, 2, 8, LITTLE_ENDIAN }, /* arm */
+ { "netwinder", 1, 1, 0, 16, 2, 8, LITTLE_ENDIAN }, /* arm */
+ { "shark", 1, 1, 0, 16, 2, 8, LITTLE_ENDIAN }, /* arm */
+
+ { "amd64", 1, 1, 0, 16, 3, 0, LITTLE_ENDIAN }, /* x86 */
+ { "arc", 1, 1, 0, 16, 3, 0, LITTLE_ENDIAN }, /* mips */
+ { "cobalt", 1, 1, 0, 16, 3, 0, LITTLE_ENDIAN }, /* mips */
+ { "landisk", 1, 1, 0, 16, 3, 0, LITTLE_ENDIAN }, /* sh3 */
+
+ { "epoc32", 1, 1, 0, 16, 3, 8, LITTLE_ENDIAN }, /* arm */
+ { "hpcarm", 1, 1, 0, 16, 3, 8, LITTLE_ENDIAN }, /* arm */
+ { "hpcmips", 1, 1, 0, 16, 3, 8, LITTLE_ENDIAN }, /* mips */
+ { "i386", 1, 1, 0, 16, 3, 8, LITTLE_ENDIAN }, /* x86 */
+ { "ia64", 1, 1, 0, 16, 3, 8, LITTLE_ENDIAN }, /* x86 */
+ { "zaurus", 1, 1, 0, 16, 3, 8, LITTLE_ENDIAN }, /* arm */
+
+ { NULL, 0, 0, 0, 0, 0, 0, 0 }, /* must be last */
+};
+
+#ifndef HAVE_NBTOOL_CONFIG_H
+static struct disklabel_params native_params;
+#endif
+
+static const struct arch_endian {
+ int byteorder;
+ const char *arch;
+} arch_endians[] = {
+ { LITTLE_ENDIAN, "alpha" },
+ { LITTLE_ENDIAN, "arm" },
+ { LITTLE_ENDIAN, "earm" },
+ { LITTLE_ENDIAN, "earmhf" },
+ { LITTLE_ENDIAN, "i386" },
+ { LITTLE_ENDIAN, "ia64" },
+ { LITTLE_ENDIAN, "mipsel" },
+ { LITTLE_ENDIAN, "mips64el" },
+ { LITTLE_ENDIAN, "sh3el" },
+ { LITTLE_ENDIAN, "vax" },
+
+ { BIG_ENDIAN, "armeb" },
+ { BIG_ENDIAN, "earmeb" },
+ { BIG_ENDIAN, "earmhfeb" },
+ { BIG_ENDIAN, "hppa" },
+ { BIG_ENDIAN, "m68k" },
+ { BIG_ENDIAN, "mipseb" },
+ { BIG_ENDIAN, "mips64eb" },
+ { BIG_ENDIAN, "powerpc" },
+ { BIG_ENDIAN, "sh3eb" },
+ { BIG_ENDIAN, "sparc" },
+ { BIG_ENDIAN, "sparc64" },
+
+ { 0, NULL },
+};
/* Default location for label - only used if we don't find one to update */
#define LABEL_OFFSET (dklabel_getlabelsector() * DEV_BSIZE + dklabel_getlabeloffset())
@@ -216,6 +344,55 @@ opendisk(const char *path, int flags, ch
}
#endif /* HAVE_NBTOOL_CONFIG_H */
+static void
+setbyteorder(int new_byteorder)
+{
+ static int set_p;
+
+ if ((!biendian_p || set_p)
+ && byteorder != 0
+ && byteorder != new_byteorder) {
+ warn("changing %s byteorder to %s",
+ byteorder == LITTLE_ENDIAN ? "le" : "be",
+ new_byteorder == LITTLE_ENDIAN ? "le" : "be");
+ }
+ byteorder = new_byteorder;
+ biendian_p = 0;
+ set_p = 1;
+}
+
+static void
+getmachineparams(const char *mach)
+{
+ const struct disklabel_params *dp = disklabel_params;
+ for (; dp->machine != NULL; dp++) {
+ if (!strcmp(mach, dp->machine)) {
+ labelusesmbr = dp->labelusesmbr;
+ labelsector = dp->labelsector;
+ labeloffset = dp->labeloffset;
+ maxpartitions = dp->maxpartitions;
+ biendian_p = (dp->byteorder == 0);
+ if (!biendian_p)
+ setbyteorder(dp->byteorder);
+ return;
+ }
+ }
+ errx(1, "%s: unknown machine type", mach);
+}
+
+static void
+getarchbyteorder(const char *arch)
+{
+ const struct arch_endian *p = arch_endians;
+ for (; p->arch != NULL; p++) {
+ if (!strcmp(arch, p->arch)) {
+ setbyteorder(p->byteorder);
+ return;
+ }
+ }
+ errx(1, "%s: unknown arch", arch);
+}
+
static daddr_t
dklabel_getlabelsector(void)
{
@@ -224,7 +401,7 @@ dklabel_getlabelsector(void)
const char *val;
if ((val = getenv("DISKLABELSECTOR")) == NULL)
- return GETLABELSECTOR();
+ return labelsector;
if ((nval = strtoul(val, &end, 10)) == ULONG_MAX && errno == ERANGE)
err(EXIT_FAILURE, "DISKLABELSECTOR in environment");
return nval;
@@ -238,7 +415,7 @@ dklabel_getlabeloffset(void)
const char *val;
if ((val = getenv("DISKLABELOFFSET")) == NULL)
- return GETLABELOFFSET();
+ return labeloffset;
if ((nval = strtoul(val, &end, 10)) == ULONG_MAX && errno == ERANGE)
err(EXIT_FAILURE, "DISKLABELOFFSET in environment");
return nval;
@@ -257,6 +434,7 @@ main(int argc, char *argv[])
FILE *t;
int ch, f, error;
char *dkname;
+ char *cp;
struct stat sb;
int writable;
enum {
@@ -264,10 +442,30 @@ main(int argc, char *argv[])
WRITE, INTERACT, DELETE
} op = UNSPEC, old_op;
- mflag = GETLABELUSESMBR();
+#ifndef HAVE_NBTOOL_CONFIG_H
+ labeloffset = native_params.labeloffset = getlabeloffset();
+ labelsector = native_params.labelsector = getlabelsector();
+ labelusesmbr = native_params.labelusesmbr = getlabelusesmbr();
+ maxpartitions = native_params.maxpartitions = getmaxpartitions();
+ native_params.byteorder = BYTE_ORDER;
+#endif
+
+ if ((cp = getenv("MACHINE")) != NULL) {
+ getmachineparams(cp);
+ }
+
+ if ((cp = getenv("MACHINE_ARCH")) != NULL) {
+ getarchbyteorder(cp);
+ }
+
+ mflag = labelusesmbr;
if (mflag < 0) {
+#if HAVE_NBTOOL_CONFIG_H
+ warn("getlabelusesmbr() failed");
+#else
warn("getlabelusesmbr() failed");
mflag = LABELUSESMBR;
+#endif
}
#if HAVE_NBTOOL_CONFIG_H
/* We must avoid doing any ioctl requests */
@@ -275,7 +473,7 @@ main(int argc, char *argv[])
#endif
error = 0;
- while ((ch = getopt(argc, argv, "ACDFINRWef:ilmrtvw")) != -1) {
+ while ((ch = getopt(argc, argv, "AB:CDFIM:NRWef:ilmrtvw")) != -1) {
old_op = op;
switch (ch) {
case 'A': /* Action all labels */
@@ -300,6 +498,18 @@ main(int argc, char *argv[])
case 'R': /* Restore label from text file */
op = RESTORE;
break;
+ case 'B': /* byteorder */
+ if (!strcmp(optarg, "be")) {
+ setbyteorder(BIG_ENDIAN);
+ } else if (!strcmp(optarg, "le")) {
+ setbyteorder(LITTLE_ENDIAN);
+ } else {
+ errx(1, "%s: not be or le", optarg);
+ }
+ break;
+ case 'M': /* machine type */
+ getmachineparams(optarg);
+ break;
case 'N': /* Disallow writes to label sector */
op = SETREADONLY;
break;
@@ -341,6 +551,34 @@ main(int argc, char *argv[])
if (old_op != UNSPEC && old_op != op)
usage();
}
+
+ if (maxpartitions == 0) {
+ errx(1, "unknown label: use -M/-B and $MACHINE/$MACHINE_ARCH");
+ }
+ if (byteorder != BIG_ENDIAN && byteorder != LITTLE_ENDIAN) {
+ errx(1, "unknown byteorder");
+ }
+ bswap_p = (byteorder != BYTE_ORDER);
+#ifdef DEBUG
+ printf("labelusesmbr=%d labelsector=%u labeloffset=%u maxparitions=%u\n",
+ labelusesmbr, labelsector, labeloffset, maxpartitions);
+ printf("byteorder=%d bswap_p=%d\n", byteorder, bswap_p);
+#endif
+#ifndef HAVE_NBTOOL_CONFIG_H
+ /*
+ * If the disklabel has the same location as the native disklabel and
+ * fewer or equal paritions, we can use the native ioctls. Otherwise
+ * force file/raw access.
+ */
+ native_p = native_params.labelusesmbr == labelusesmbr
+ && native_params.labelsector == labelsector
+ && native_params.labeloffset == labeloffset
+ && maxparitions <= native_params.maxpartitions
+ && !bswap_p;
+ if (!native_p)
+ Fflag = rflag = 1;
+#endif
+
argc -= optind;
argv += optind;
@@ -937,7 +1175,7 @@ find_label(int f, u_int sector)
is_deleted, offset, sector);
continue;
}
- if (target16toh(disk_lp->d_npartitions) > MAXPARTITIONS ||
+ if (target16toh(disk_lp->d_npartitions) > maxpartitions ||
dkcksum_target(disk_lp) != 0) {
if (verbose > 0)
warnx("corrupt label found at offset %u in "
@@ -1465,9 +1703,9 @@ getasciilabel(FILE *f, struct disklabel
continue;
}
if (sscanf(cp, "%lu partitions", &v) == 1) {
- if (v == 0 || v > MAXPARTITIONS) {
+ if (v == 0 || v > maxpartitions) {
warnx("line %d: bad # of partitions", lineno);
- lp->d_npartitions = MAXPARTITIONS;
+ lp->d_npartitions = maxpartitions;
errors++;
} else
lp->d_npartitions = v;
@@ -1591,7 +1829,7 @@ getasciilabel(FILE *f, struct disklabel
/* We have a partition entry */
part = *cp - 'a';
- if (part >= MAXPARTITIONS) {
+ if (part >= maxpartitions) {
warnx("line %d: bad partition name: %s", lineno, cp);
errors++;
continue;
@@ -1737,12 +1975,12 @@ checklabel(struct disklabel *lp)
errors++;
} else if (lp->d_sbsize % lp->d_secsize)
warnx("warning, super block size %% sector-size != 0");
- if (lp->d_npartitions > MAXPARTITIONS)
+ if (lp->d_npartitions > maxpartitions)
warnx("warning, number of partitions (%" PRIu16 ") > "
"MAXPARTITIONS (%d)",
- lp->d_npartitions, MAXPARTITIONS);
+ lp->d_npartitions, maxpartitions);
else
- for (i = MAXPARTITIONS - 1; i >= lp->d_npartitions; i--) {
+ for (i = maxpartitions - 1; i >= lp->d_npartitions; i--) {
part = 'a' + i;
pp = &lp->d_partitions[i];
if (pp->p_size || pp->p_offset) {
@@ -1800,12 +2038,12 @@ usage(void)
const char *name;
const char *expn;
} usages[] = {
- { "[-ACFrtv] disk", "(to read label)" },
- { "-w [-DFrv] [-f disktab] disk disktype [packid]", "(to write label)" },
- { "-e [-CDFIrv] disk", "(to edit label)" },
- { "-i [-DFIrv] disk", "(to create a label interactively)" },
+ { "[-ABCFMrtv] disk", "(to read label)" },
+ { "-w [-BDFMrv] [-f disktab] disk disktype [packid]", "(to write label)" },
+ { "-e [-BCDFMIrv] disk", "(to edit label)" },
+ { "-i [-BDFMIrv] disk", "(to create a label interactively)" },
{ "-D [-v] disk", "(to delete existing label(s))" },
- { "-R [-DFrv] disk protofile", "(to restore label)" },
+ { "-R [-BDFMrv] disk protofile", "(to restore label)" },
{ "[-NW] disk", "(to write disable/enable label)" },
{ "-l", "(to show all known file system types)" },
{ NULL, NULL }
@@ -1899,3 +2137,15 @@ list_fs_types(void)
return ret;
}
+
+#ifndef HAVE_NBTOOL_CONFIG_H
+int
+dk_ioctl(int f, u_long cmd, void *arg)
+{
+ if (!native_p) {
+ errno = ENOTTY;
+ return -1;
+ }
+ return ioctl(f, cmd, arg);
+}
+#endif
Index: src/share/mk/bsd.own.mk
diff -u src/share/mk/bsd.own.mk:1.729 src/share/mk/bsd.own.mk:1.730
--- src/share/mk/bsd.own.mk:1.729 Fri May 3 15:55:21 2013
+++ src/share/mk/bsd.own.mk Fri May 3 16:05:11 2013
@@ -1,4 +1,4 @@
-# $NetBSD: bsd.own.mk,v 1.729 2013/05/03 15:55:21 matt Exp $
+# $NetBSD: bsd.own.mk,v 1.730 2013/05/03 16:05:11 matt Exp $
# This needs to be before bsd.init.mk
.if defined(BSD_MK_COMPAT_FILE)
@@ -289,7 +289,7 @@ TOOL_CTAGS= ${TOOLDIR}/bin/${_TOOL_PREF
TOOL_CTFCONVERT= ${TOOLDIR}/bin/${_TOOL_PREFIX}ctfconvert
TOOL_CTFMERGE= ${TOOLDIR}/bin/${_TOOL_PREFIX}ctfmerge
TOOL_DB= ${TOOLDIR}/bin/${_TOOL_PREFIX}db
-TOOL_DISKLABEL= ${TOOLDIR}/bin/nbdisklabel-${MAKEWRAPPERMACHINE}
+TOOL_DISKLABEL= ${TOOLDIR}/bin/nbdisklabel
TOOL_EQN= ${TOOLDIR}/bin/${_TOOL_PREFIX}eqn
TOOL_FDISK= ${TOOLDIR}/bin/${MACHINE_GNU_PLATFORM}-fdisk
TOOL_FGEN= ${TOOLDIR}/bin/${_TOOL_PREFIX}fgen
Index: src/sys/sys/disklabel.h
diff -u src/sys/sys/disklabel.h:1.113 src/sys/sys/disklabel.h:1.114
--- src/sys/sys/disklabel.h:1.113 Thu Apr 4 12:52:25 2013
+++ src/sys/sys/disklabel.h Fri May 3 16:05:11 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: disklabel.h,v 1.113 2013/04/04 12:52:25 martin Exp $ */
+/* $NetBSD: disklabel.h,v 1.114 2013/05/03 16:05:11 matt Exp $ */
/*
* Copyright (c) 1987, 1988, 1993
@@ -49,7 +49,7 @@
* paritition are machine dependent.
*/
#if HAVE_NBTOOL_CONFIG_H
-#include <nbinclude/machine/disklabel.h>
+#define MAXPARTITIONS MAXMAXPARTITIONS
#else
#include <machine/disklabel.h>
#endif /* HAVE_NBTOOL_CONFIG_H */
Index: src/tools/disklabel/Makefile
diff -u src/tools/disklabel/Makefile:1.5 src/tools/disklabel/Makefile:1.6
--- src/tools/disklabel/Makefile:1.5 Mon Jun 4 18:53:03 2012
+++ src/tools/disklabel/Makefile Fri May 3 16:05:12 2013
@@ -1,19 +1,11 @@
-# $NetBSD: Makefile,v 1.5 2012/06/04 18:53:03 joerg Exp $
+# $NetBSD: Makefile,v 1.6 2013/05/03 16:05:12 matt Exp $
-HOSTPROGNAME= nbdisklabel-${MAKEWRAPPERMACHINE}
+HOSTPROGNAME= nbdisklabel
HOST_SRCDIR= sbin/disklabel
-HOST_SRCS= disklabel.c bswap.c
+HOST_SRCS= disklabel.c
NOMAN= # defined
-.include <bsd.endian.mk>
-
-.if ${TARGET_ENDIANNESS} == "1234"
-CPPFLAGS+= -DTARGET_BYTE_ORDER=LITTLE_ENDIAN
-.elif ${TARGET_ENDIANNESS} == "4321"
-CPPFLAGS+= -DTARGET_BYTE_ORDER=BIG_ENDIAN
-.endif
-
.include "${.CURDIR}/../Makefile.nbincludes"
.include "${.CURDIR}/../Makefile.host"