diff options
Diffstat (limited to 'initrd.c')
-rw-r--r-- | initrd.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/initrd.c b/initrd.c new file mode 100644 index 0000000..3f36cd9 --- /dev/null +++ b/initrd.c @@ -0,0 +1,42 @@ +#include <stdint.h> +#include <string.h> + +extern uint8_t *initrd_start; +extern uint32_t initrd_size; + +char *getfile(uint32_t offset) +{ + char *ptr = initrd_start; + for (uint32_t i = 0; i < offset; i++) { + uint32_t len = *((uint32_t *)ptr); + uint32_t datalen = *((uint32_t *)(ptr + 4 + len)); + ptr += len + datalen + 8; + if (ptr >= (char *)(initrd_start + initrd_size)) + return 0; + } + + return ptr; +} + +char *readfile(const char *name) +{ + char *ptr; + for (uint32_t i = 0; ptr = getfile(i), ptr != 0; i++) { + uint32_t len = *((uint32_t *)ptr); + if (!strncmp(name, ptr + 4, len)) + return ptr + len + 8; + } + return 0; +} + +uint32_t filesize(const char *name) +{ + char *ptr; + for (uint32_t i = 0; ptr = getfile(i), ptr != 0; i++) { + uint32_t len = *((uint32_t *)ptr); + if (!strncmp(name, ptr + 4, len)) + return *((uint32_t *)ptr + len + 4); + } + return 0; +} + |