summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>1999-01-09 02:36:19 +0000
committermsmith <msmith@FreeBSD.org>1999-01-09 02:36:19 +0000
commit6ed8cbf4677cc5ba7c60b9affa2584d39a3ee105 (patch)
tree31542de653bd72ad8a3ce518b46b56f2965f872c /sys
parent4077891a70eb30bfeb2b64cd01182dffa502331e (diff)
downloadFreeBSD-src-6ed8cbf4677cc5ba7c60b9affa2584d39a3ee105.zip
FreeBSD-src-6ed8cbf4677cc5ba7c60b9affa2584d39a3ee105.tar.gz
Extend bd_print() so that it displays slices and partitions on disks.
Diffstat (limited to 'sys')
-rw-r--r--sys/boot/i386/libi386/biosdisk.c89
1 files changed, 82 insertions, 7 deletions
diff --git a/sys/boot/i386/libi386/biosdisk.c b/sys/boot/i386/libi386/biosdisk.c
index cae6883..8858d7b 100644
--- a/sys/boot/i386/libi386/biosdisk.c
+++ b/sys/boot/i386/libi386/biosdisk.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: biosdisk.c,v 1.17 1998/11/02 23:28:11 msmith Exp $
+ * $Id: biosdisk.c,v 1.18 1998/11/13 23:40:02 msmith Exp $
*/
/*
@@ -101,6 +101,8 @@ static int bd_read(struct open_disk *od, daddr_t dblk, int blks, caddr_t dest);
static int bd_int13probe(struct bdinfo *bd);
+static void bd_printslice(struct open_disk *od, int offset, char *prefix);
+
static int bd_init(void);
static int bd_strategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize);
static int bd_realstrategy(void *devdata, int flag, daddr_t dblk, size_t size, void *buf, size_t *rsize);
@@ -208,18 +210,85 @@ bd_int13probe(struct bdinfo *bd)
static void
bd_print(int verbose)
{
- int i;
- char line[80];
+ int i, j;
+ char line[80];
+ struct i386_devdesc dev;
+ struct open_disk *od;
+ struct dos_partition *dptr;
for (i = 0; i < nbdinfo; i++) {
- sprintf(line, " disk%d: BIOS drive %c:", i,
+ sprintf(line, " disk%d: BIOS drive %c:\n", i,
(bdinfo[i].bd_unit < 0x80) ? ('A' + bdinfo[i].bd_unit) : ('C' + bdinfo[i].bd_unit - 0x80));
pager_output(line);
- /* XXX more detail? */
- pager_output("\n");
+
+ /* try to open the whole disk */
+ dev.d_kind.biosdisk.unit = i;
+ dev.d_kind.biosdisk.slice = -1;
+ dev.d_kind.biosdisk.partition = -1;
+
+ if (!bd_opendisk(&od, &dev)) {
+
+ /* Do we have a partition table? */
+ if (od->od_flags & BD_PARTTABOK) {
+ dptr = &od->od_parttab[0];
+
+ /* Check for a "truly dedicated" disk */
+ if ((dptr[3].dp_typ == DOSPTYP_386BSD) &&
+ (dptr[3].dp_start == 0) &&
+ (dptr[3].dp_size == 50000)) {
+ sprintf(line, " disk%d", i);
+ bd_printslice(od, 0, line);
+ } else {
+ for (j = 0; j < NDOSPART; j++) {
+ switch(dptr[j].dp_typ) {
+ case DOSPTYP_386BSD:
+ sprintf(line, " disk%ds%d", i, j + 1);
+ bd_printslice(od, dptr[j].dp_start, line);
+ break;
+ default:
+ }
+ }
+
+ }
+ }
+ bd_closedisk(od);
+ }
}
}
+static void
+bd_printslice(struct open_disk *od, int offset, char *prefix)
+{
+ char line[80];
+ u_char buf[BIOSDISK_SECSIZE];
+ struct disklabel *lp;
+ int i;
+
+ /* read disklabel */
+ if (bd_read(od, offset + LABELSECTOR, 1, buf))
+ return;
+ lp =(struct disklabel *)(&buf[0]);
+ if (lp->d_magic != DISKMAGIC) {
+ sprintf(line, "%s: bad disklabel\n");
+ pager_output(line);
+ return;
+ }
+
+ /* Print partitions */
+ for (i = 0; i < lp->d_npartitions; i++) {
+ if ((lp->d_partitions[i].p_fstype == FS_BSDFFS) || (lp->d_partitions[i].p_fstype == FS_SWAP) ||
+ ((lp->d_partitions[i].p_fstype == FS_UNUSED) &&
+ (od->od_flags & BD_FLOPPY) && (i == 0))) { /* Floppies often have bogus fstype, print 'a' */
+ sprintf(line, " %s%c: %s %.6dMB (%d - %d)\n", prefix, 'a' + i,
+ (lp->d_partitions[i].p_fstype == FS_SWAP) ? "swap" : "FFS",
+ lp->d_partitions[i].p_size / 2048, /* 512-byte sector assumption */
+ lp->d_partitions[i].p_offset, lp->d_partitions[i].p_offset + lp->d_partitions[i].p_size);
+ pager_output(line);
+ }
+ }
+}
+
+
/*
* Attempt to open the disk described by (dev) for use by (f).
*
@@ -323,8 +392,14 @@ bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev)
dptr = &od->od_parttab[0];
od->od_flags |= BD_PARTTABOK;
+ /* Is this a request for the whole disk? */
+ if (dev->d_kind.biosdisk.slice == -1) {
+ sector == 0;
+ goto unsliced;
+ }
+
/* Try to auto-detect the best slice; this should always give a slice number */
- if (dev->d_kind.biosdisk.slice < 1)
+ if (dev->d_kind.biosdisk.slice == 0)
dev->d_kind.biosdisk.slice = bd_bestslice(dptr);
switch (dev->d_kind.biosdisk.slice) {
OpenPOWER on IntegriCloud