Redesign fs_dev, raw_dev, introducing device_partition and switch_fs.

In theory, one could mount an encrypted FAT partition itself coming from a disk image, etc.
This commit is contained in:
TuxSH
2018-05-13 19:53:55 +02:00
parent 396a646fa3
commit 4f50d412f5
18 changed files with 878 additions and 674 deletions

View File

@@ -2,7 +2,7 @@
#include <errno.h>
#include "gpt.h"
int gpt_get_header(efi_header_t *out, FILE *disk) {
int gpt_get_header(efi_header_t *out, FILE *disk, size_t sector_size) {
union {
uint8_t sector[512];
efi_header_t hdr;
@@ -17,6 +17,10 @@ int gpt_get_header(efi_header_t *out, FILE *disk) {
if (fread(d.sector, 512, 1, disk) == 0) {
return -1;
}
if (fseek(disk, sector_size - 512, SEEK_CUR) != 0) {
return -1;
}
if (d.sector[0x1FE] != 0x55 || d.sector[0x1FF] != 0xAA) {
errno = EILSEQ;
return -1;
@@ -26,6 +30,9 @@ int gpt_get_header(efi_header_t *out, FILE *disk) {
if (fread(d.sector, 512, 1, disk) == 0) {
return -1;
}
if (fseek(disk, sector_size - 512, SEEK_CUR) != 0) {
return -1;
}
/* Check for "EFI PART". */
if (memcmp(d.hdr.magic, "EFI PART", 8) != 0) {
errno = EILSEQ;
@@ -41,7 +48,7 @@ int gpt_get_header(efi_header_t *out, FILE *disk) {
return -1;
}
/* Some more checks: */
if(d.hdr.header_size > 512 || d.hdr.revision != 0x10000) {
if(d.hdr.header_size > sector_size || d.hdr.revision != 0x10000) {
errno = ENOTSUP;
return -1;
}
@@ -51,32 +58,33 @@ int gpt_get_header(efi_header_t *out, FILE *disk) {
return 0;
}
int gpt_iterate_through_entries(FILE *disk, gpt_entry_iterator_t callback) {
int gpt_iterate_through_entries(FILE *disk, size_t sector_size, gpt_entry_iterator_t callback, void *param) {
efi_header_t hdr;
efi_entry_t entry;
size_t offset = 2 * 512; /* Sector #2. */
size_t delta;
/* Get the header. */
if (gpt_get_header(&hdr, disk) == -1) {
if (gpt_get_header(&hdr, disk, sector_size) == -1) {
return -1;
}
/* Seek to the entry table. */
if (fseek(disk, 512 * hdr.entries_first_lba - offset, SEEK_CUR) != 0) {
if (fseek(disk, sector_size * hdr.entries_first_lba - offset, SEEK_CUR) != 0) {
return -1;
}
offset = 512 * hdr.entries_first_lba;
offset = sector_size * hdr.entries_first_lba;
delta = hdr.entry_size - sizeof(efi_entry_t);
/* Iterate through the entries. */
for (uint32_t i = 0; i < hdr.entry_count; i++) {
printf("%lu/%lu\n", i, hdr.entry_count);
if (fread(&entry, sizeof(efi_entry_t), 1, disk) == 0) {
return -1;
}
if (callback(&entry, offset, disk) != 0) {
if (callback(&entry, param, offset, disk) != 0) {
return -1;
}