Date: Sat, 9 Mar 2002 08:26:08 -0800 From: Luigi Rizzo <rizzo@icir.org> To: arch@FreeBSD.ORG Subject: Re: For review: machdep.bootdev sysctl (for i386) Message-ID: <20020309082607.I21016@iguana.icir.org> In-Reply-To: <20020309042728.A21016@iguana.icir.org> References: <20020309042728.A21016@iguana.icir.org>
next in thread | previous in thread | raw e-mail | index | archive | help
And as a followup, attached is a patch for sysctl(8) to parse
the information. Again it can be cleaned up a little bit
by making machdep.bootdev opaque, but that is purely
a stylistic issue -- in the end, finding the proper
parsing routine always involves a string comparison.
Note that this is only valid for the i386 so I will make
this code conditionally compiled if it ever gets committed.
cheers
luigi
On Sat, Mar 09, 2002 at 04:27:28AM -0800, Luigi Rizzo wrote:
> Looking at a way to determine the boot device from userland,
> I have come to the conclusion that the most reasonable way is to
> export to userland whatever information the kernel has (and this
> is machine dependent, sorry!), and let some userland program
...
Index: sysctl.c
===================================================================
RCS file: /home/ncvs/src/sbin/sysctl/sysctl.c,v
retrieving revision 1.41
diff -u -r1.41 sysctl.c
--- sysctl.c 25 Feb 2002 03:36:06 -0000 1.41
+++ sysctl.c 9 Mar 2002 15:20:52 -0000
@@ -404,6 +404,55 @@
}
/*
+ * code to map a bootdev into a suitable string.
+ * Major numbers are mapped into names as in boot2.c
+ */
+struct _foo {
+ int majdev;
+ char *name;
+} maj2name[] = {
+ 30, "ad",
+ 0, "wd",
+ 1, "wfd",
+ 2, "fd",
+ 4, "da",
+ -1, NULL /* terminator */
+};
+
+#include <sys/diskslice.h>
+#include <sys/reboot.h>
+static int
+machdep_bootdev(u_long value)
+{
+ int majdev, unit, slice, part;
+ struct _foo *p;
+
+ if (value & B_MAGICMASK != B_DEVMAGIC) {
+ printf("invalid (0x%08x)", value);
+ return 0;
+ }
+ majdev = B_TYPE(value);
+ unit = B_UNIT(value);
+ slice = B_SLICE(value);
+ part = B_PARTITION(value);
+ if (majdev == 2) { /* floppy, as known to the boot block... */
+ printf("/dev/fd%d", unit);
+ return 0;
+ }
+ for (p = maj2name; p->name != NULL && p->majdev != majdev ; p++) ;
+ if (p->name != NULL) { /* found */
+ if (slice == WHOLE_DISK_SLICE)
+ printf("/dev/%s%d%c", p->name, unit, part);
+ else
+ printf("/dev/%s%ds%d%c",
+ p->name, unit, slice - BASE_SLICE + 1, part + 'a');
+ } else
+ printf("unknown (major %d unit %d slice %d part %d)",
+ majdev, unit, slice, part);
+ return 0;
+}
+
+/*
* This formats and outputs the value of one variable
*
* Returns zero if anything was actually output.
@@ -496,6 +545,8 @@
if (!nflag)
printf("%s%s", name, sep);
fmt++;
+ if (!strcmp(name, "machdep.bootdev"))
+ return machdep_bootdev(*(unsigned long *)p);
val = "";
while (len >= sizeof(long)) {
if(*fmt == 'U')
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-arch" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020309082607.I21016>
