diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2018-09-21 09:35:03 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2018-10-05 13:28:27 +0200 |
commit | 14221cd86eadba82255fdc55ed174d401c7a0a04 (patch) | |
tree | 7dc392debe12c18dd1649b63cb02bc4e1a41fc27 /src/cdrom.c | |
parent | bf8e4f902c3608f9e76bba3710812e51560a2ccc (diff) | |
download | seabios-14221cd86eadba82255fdc55ed174d401c7a0a04.tar.gz |
pretty boot menu entry for cdrom drives
Show the volume label of bootable cdroms.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'src/cdrom.c')
-rw-r--r-- | src/cdrom.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/cdrom.c b/src/cdrom.c index 828fb3b8..577d69d8 100644 --- a/src/cdrom.c +++ b/src/cdrom.c @@ -274,3 +274,49 @@ cdrom_boot(struct drive_s *drive) return 0; } + +// check if media is present and the drive is bootable. +// in case it is return the volume label. +char* +cdrom_media_info(struct drive_s *drive) +{ + ASSERT32FLAT(); + + struct disk_op_s dop; + memset(&dop, 0, sizeof(dop)); + dop.drive_fl = drive; + + int ret = scsi_is_ready(&dop); + if (ret) + return NULL; + + // Read the Boot Record Volume Descriptor + u8 buffer[CDROM_SECTOR_SIZE]; + dop.command = CMD_READ; + dop.lba = 0x11; + dop.count = 1; + dop.buf_fl = buffer; + ret = process_op(&dop); + if (ret) + return NULL; + + // Is it bootable? + if (buffer[0]) + return NULL; + if (strcmp((char*)&buffer[1], "CD001\001EL TORITO SPECIFICATION") != 0) + return NULL; + + // Read the Primary Volume Descriptor + dop.command = CMD_READ; + dop.lba = 0x10; + dop.count = 1; + dop.buf_fl = buffer; + ret = process_op(&dop); + if (ret) + return NULL; + + // Read volume id, trim trailing spaces + char *volume = znprintf(30, "%s", buffer + 40); + nullTrailingSpace(volume); + return volume; +} |