aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/fs/iso9660/iso9660.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/fs/iso9660/iso9660.c')
-rw-r--r--src/kernel/fs/iso9660/iso9660.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/kernel/fs/iso9660/iso9660.c b/src/kernel/fs/iso9660/iso9660.c
new file mode 100644
index 0000000..728d3cb
--- /dev/null
+++ b/src/kernel/fs/iso9660/iso9660.c
@@ -0,0 +1,60 @@
+#include <stdint.h>
+#include <kernel/lib/lib.h>
+#include <kernel/fs/atapi_pio.h>
+#include <kernel/fs/iso9660/iso9660.h>
+#include <kernel/lib/alloc.h>
+
+struct ISO9660_entity *ISO9660_get(char **dirs, uint8_t dirs_sz) {
+ ATAPI_read(1, 0x10);
+ uint32_t last_len = *(uint32_t *) (
+ ATAPI_PIO_BUFFER +
+ ISO9660_ROOT_RECORD_OFFSET +
+ ISO9660_DIR_EAR_LENGTH
+ );
+ uint32_t last_LBA = *(uint32_t *) (
+ ATAPI_PIO_BUFFER +
+ ISO9660_ROOT_RECORD_OFFSET +
+ ISO9660_DIR_EAR_LBA
+ );
+
+ for (uint8_t dirs_i = 0; dirs_i < dirs_sz; dirs_i++) {
+ ATAPI_read((last_len % 2048 != 0) + (last_len / 2048), last_LBA);
+
+ uint8_t found = 0;
+ for (uint32_t i = 0; i < last_len && !found;) {
+ if (!*(uint8_t *) (ATAPI_PIO_BUFFER + i + ISO9660_DIR_RECORD_LENGTH))
+ break;
+
+ char *filename = (char *) (ATAPI_PIO_BUFFER + i + ISO9660_DIR_FILENAME);
+
+ for (uint32_t j = 0; j < ISO9660_DIR_FILENAME_LENGTH; j++) {
+ if (filename[j] == ';') {
+ filename[j] = 0;
+ break;
+ }
+ }
+
+ if (strcmp(dirs[dirs_i], filename) == 0) {
+ found = 1;
+ last_LBA = *(uint32_t *) (ATAPI_PIO_BUFFER + i + ISO9660_DIR_EAR_LBA);
+ last_len = *(uint32_t *) (ATAPI_PIO_BUFFER + i + ISO9660_DIR_EAR_LENGTH);
+ } else {
+ i += *(uint8_t *) (ATAPI_PIO_BUFFER + i + ISO9660_DIR_RECORD_LENGTH);
+ }
+ }
+
+ if (!found) {
+ return (struct ISO9660_entity *) 0;
+ }
+ }
+
+ struct ISO9660_entity *ret = (struct ISO9660_entity *) kmalloc(sizeof(struct ISO9660_entity));
+ ret->LBA = last_LBA;
+ ret->length = last_len;
+ return ret;
+}
+
+uint8_t *ISO9660_read(struct ISO9660_entity *entity) {
+ ATAPI_read((entity->length % 2048 != 0) + (entity->length / 2048), entity->LBA);
+ return (uint8_t *) ATAPI_PIO_BUFFER;
+} \ No newline at end of file