aboutsummaryrefslogtreecommitdiff
path: root/sbin/bsdlabel
diff options
context:
space:
mode:
authorJoerg Wunsch <joerg@FreeBSD.org>1996-02-03 21:14:09 +0000
committerJoerg Wunsch <joerg@FreeBSD.org>1996-02-03 21:14:09 +0000
commitd70e4e53de079ac077f74cdec1cca0ee19b9dc7c (patch)
tree3e242a1ab8c0d4f21666a97084c49520fb6183e3 /sbin/bsdlabel
parent017ef5fdc22eb6b3693ad00f1e7e0c22884ee7e0 (diff)
Notes
Diffstat (limited to 'sbin/bsdlabel')
-rw-r--r--sbin/bsdlabel/bsdlabel.820
-rw-r--r--sbin/bsdlabel/bsdlabel.c27
2 files changed, 47 insertions, 0 deletions
diff --git a/sbin/bsdlabel/bsdlabel.8 b/sbin/bsdlabel/bsdlabel.8
index 1cc33abe7affd..ce1b1689fb375 100644
--- a/sbin/bsdlabel/bsdlabel.8
+++ b/sbin/bsdlabel/bsdlabel.8
@@ -362,3 +362,23 @@ will not install bootstrap code that overlaps it.
When a disk name is given without a full pathname,
the constructed device name uses the ``a'' partition on the tahoe,
the ``c'' partition on all others.
+.Pp
+For the i386 architecture, the primary bootstrap sector contains
+an embedded
+.Em fdisk
+table.
+.Nm Disklabel
+takes care to not clobber it when installing a bootstrap only
+.Pq Fl B ,
+or when editing an existing label
+.Pq Fl e ,
+but it unconditionally writes the primary bootstrap program onto
+the disk for
+.Fl w
+or
+.Fl R ,
+thus replacing the
+.Em fdisk
+table by the dummy one in the bootstrap program. This is only of
+concern if the disk is fully dedicated, so that the BSD disklabel
+starts at absolute block 0 on the disk.
diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c
index cf93fc4373ff1..3de7004e0f41c 100644
--- a/sbin/bsdlabel/bsdlabel.c
+++ b/sbin/bsdlabel/bsdlabel.c
@@ -547,6 +547,10 @@ makebootarea(boot, dp, f)
#if NUMBOOT == 1
struct stat sb;
#endif
+#ifdef __i386__
+ char *tmpbuf;
+ int i, found;
+#endif /* i386 */
#endif
/* XXX */
@@ -628,9 +632,32 @@ makebootarea(boot, dp, f)
if (b < 0)
Perror(xxboot);
#if NUMBOOT > 1
+#ifdef __i386__
+ /*
+ * XXX Botch alert.
+ * The i386 has the so-called fdisk table embedded into the
+ * primary bootstrap. We take care to not clobber it, but
+ * only if it does already contain some data. (Otherwise,
+ * the xxboot provides a template.)
+ */
+ if ((tmpbuf = (char *)malloc((int)dp->d_secsize)) == 0)
+ Perror(xxboot);
+ memcpy((void *)tmpbuf, (void *)boot, (int)dp->d_secsize);
+#endif /* i386 */
if (read(b, boot, (int)dp->d_secsize) < 0)
Perror(xxboot);
(void)close(b);
+#ifdef __i386__
+ for (i = DOSPARTOFF, found = 0;
+ !found && i < DOSPARTOFF + NDOSPART*sizeof(struct dos_partition);
+ i++)
+ found = tmpbuf[i] != 0;
+ if (found)
+ memcpy((void *)&boot[DOSPARTOFF],
+ (void *)&tmpbuf[DOSPARTOFF],
+ NDOSPART * sizeof(struct dos_partition));
+ free(tmpbuf);
+#endif /* i386 */
b = open(bootxx, O_RDONLY);
if (b < 0)
Perror(bootxx);