aboutsummaryrefslogtreecommitdiff
path: root/sbin/disklabel
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/disklabel
parent017ef5fdc22eb6b3693ad00f1e7e0c22884ee7e0 (diff)
downloadsrc-d70e4e53de079ac077f74cdec1cca0ee19b9dc7c.tar.gz
src-d70e4e53de079ac077f74cdec1cca0ee19b9dc7c.zip
Try to preserve the fdisk table in the primary bootstrap, should it
already exist. Mention the cases where this doesn't work in the BUGS section of the man page.
Notes
Notes: svn path=/head/; revision=13892
Diffstat (limited to 'sbin/disklabel')
-rw-r--r--sbin/disklabel/disklabel.820
-rw-r--r--sbin/disklabel/disklabel.c27
2 files changed, 47 insertions, 0 deletions
diff --git a/sbin/disklabel/disklabel.8 b/sbin/disklabel/disklabel.8
index 1cc33abe7aff..ce1b1689fb37 100644
--- a/sbin/disklabel/disklabel.8
+++ b/sbin/disklabel/disklabel.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/disklabel/disklabel.c b/sbin/disklabel/disklabel.c
index cf93fc4373ff..3de7004e0f41 100644
--- a/sbin/disklabel/disklabel.c
+++ b/sbin/disklabel/disklabel.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);