diff options
Diffstat (limited to 'src/kernel/iso9660.c')
-rw-r--r-- | src/kernel/iso9660.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/kernel/iso9660.c b/src/kernel/iso9660.c index a1821e8..742b34b 100644 --- a/src/kernel/iso9660.c +++ b/src/kernel/iso9660.c @@ -18,7 +18,40 @@ OF THIS SOFTWARE. */ #include "iso9660.h" +#include "diskio.h" +#include "files.h" +#include "mem.h" -bool iso_9660_parse_ph(uint8_t dn, uint32_t sector, uint8_t *buffer) { - //TODO +bool iso_9660_parse_ph(uint8_t dn, uint8_t pn, uint32_t sector, uint8_t *buffer) { + uint32_t s = sector + 64; + do { + read_sectors(dn, s, 4, buffer); + if ((*buffer == 255) || (*(uint32_t *)&buffer[1] != 0x30304443) || + (buffer[5] != (uint8_t)'1')) + return false; + s += 4; + } while (*buffer != PRIM_VOLUME); + part_info[dn].partition_types[pn] = ISO_9660; + part_info[dn].partition_offsets[pn] = sector; + struct iso_9660_cache *cache = allocate_block(sizeof(struct iso_9660_cache), KERNEL); + struct iso_9660_primary_vd *as_vd = (struct iso_9660_primary_vd *)buffer; + part_info[dn].partition_cache[pn] = cache; + if ((cache->block_size = as_vd->block_size) & ~0x01ff) { + part_info[dn].partition_sizes[pn] = + (as_vd->block_size >> 9) * as_vd->size; + cache->path_table_sector = + (as_vd->block_size >> 9) * as_vd->path_table_block; + cache->optional_path_table_sector = + (as_vd->block_size >> 9) * as_vd->optional_path_table_block; + } + else { + part_info[dn].partition_sizes[pn] = + (as_vd->block_size * as_vd->size) >> 9; + cache->path_table_sector = + (as_vd->block_size * as_vd->path_table_block) >> 9; + cache->optional_path_table_sector = + (as_vd->block_size * as_vd->optional_path_table_block) >> 9; + } + cache->path_table_size = as_vd->path_table_size; + return true; }
\ No newline at end of file |