Page MenuHomeFreeBSD

D14915.diff
No OneTemporary

D14915.diff

Index: head/stand/common/disk.c
===================================================================
--- head/stand/common/disk.c
+++ head/stand/common/disk.c
@@ -270,6 +270,9 @@
dev->d_offset = part.start;
od->entrysize = part.end - part.start + 1;
}
+ } else if (ptable_gettype(od->table) == PTABLE_ISO9660) {
+ dev->d_offset = 0;
+ od->entrysize = mediasize;
} else if (slice >= 0) {
/* Try to get information about partition */
if (slice == 0)
Index: head/stand/common/part.h
===================================================================
--- head/stand/common/part.h
+++ head/stand/common/part.h
@@ -36,7 +36,8 @@
PTABLE_BSD,
PTABLE_MBR,
PTABLE_GPT,
- PTABLE_VTOC8
+ PTABLE_VTOC8,
+ PTABLE_ISO9660
};
enum partition_type {
@@ -52,6 +53,7 @@
PART_LINUX,
PART_LINUX_SWAP,
PART_DOS,
+ PART_ISO9660
};
struct ptable_entry {
Index: head/stand/common/part.c
===================================================================
--- head/stand/common/part.c
+++ head/stand/common/part.c
@@ -37,6 +37,8 @@
#include <sys/queue.h>
#include <sys/vtoc.h>
+#include <fs/cd9660/iso.h>
+
#include <crc32.h>
#include <part.h>
#include <uuid.h>
@@ -97,6 +99,7 @@
{ PART_LINUX, "Linux" },
{ PART_LINUX_SWAP, "Linux swap" },
{ PART_DOS, "DOS/Windows" },
+ { PART_ISO9660, "ISO9660" },
};
const char *
@@ -603,6 +606,45 @@
}
#endif /* LOADER_VTOC8_SUPPORT */
+#define cdb2devb(bno) ((bno) * ISO_DEFAULT_BLOCK_SIZE / table->sectorsize)
+
+static struct ptable *
+ptable_iso9660read(struct ptable *table, void *dev, diskread_t dread)
+{
+ uint8_t *buf;
+ struct iso_primary_descriptor *vd;
+ struct pentry *entry;
+
+ buf = malloc(table->sectorsize);
+ if (buf == NULL)
+ return (table);
+
+ if (dread(dev, buf, 1, cdb2devb(16)) != 0) {
+ DEBUG("read failed");
+ ptable_close(table);
+ table = NULL;
+ goto out;
+ }
+ vd = (struct iso_primary_descriptor *)buf;
+ if (bcmp(vd->id, ISO_STANDARD_ID, sizeof vd->id) != 0)
+ goto out;
+
+ entry = malloc(sizeof(*entry));
+ if (entry == NULL)
+ goto out;
+ entry->part.start = 0;
+ entry->part.end = table->sectors;
+ entry->part.type = PART_ISO9660;
+ entry->part.index = 0;
+ STAILQ_INSERT_TAIL(&table->entries, entry, entry);
+
+ table->type = PTABLE_ISO9660;
+
+out:
+ free(buf);
+ return (table);
+}
+
struct ptable *
ptable_open(void *dev, uint64_t sectors, uint16_t sectorsize,
diskread_t *dread)
@@ -633,6 +675,11 @@
table->sectorsize = sectorsize;
table->type = PTABLE_NONE;
STAILQ_INIT(&table->entries);
+
+ if (ptable_iso9660read(table, dev, dread) != NULL) {
+ if (table->type == PTABLE_ISO9660)
+ goto out;
+ }
#ifdef LOADER_VTOC8_SUPPORT
if (be16dec(buf + offsetof(struct vtoc8, magic)) == VTOC_MAGIC) {

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 17, 8:44 PM (21 h, 11 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14684165
Default Alt Text
D14915.diff (2 KB)

Event Timeline