diff --git a/limine.cfg b/limine.cfg index 7d503d1c..590685c6 100644 --- a/limine.cfg +++ b/limine.cfg @@ -7,4 +7,5 @@ TIMEOUT=5 PROTOCOL=limine KERNEL_PATH=boot:///kernel MODULE_PATH=boot:///initrd +KERNEL_CMDLINE= COMMENT="The Astral operating system" diff --git a/src/arch/x86_64/main.c b/src/arch/x86_64/main.c index df12db5b..b8371112 100644 --- a/src/arch/x86_64/main.c +++ b/src/arch/x86_64/main.c @@ -39,6 +39,10 @@ void kmain(){ liminetty_setcontext(arch_getcls()->context); alloc_init(); + + env_init(); + + cmdline_parse(); acpi_init(); diff --git a/src/include/kernel/cmdline.h b/src/include/kernel/cmdline.h new file mode 100644 index 00000000..ececc4d5 --- /dev/null +++ b/src/include/kernel/cmdline.h @@ -0,0 +1,6 @@ +#ifndef _CMDLINE_H_INCLUDE +#define _CMDLINE_H_INCLUDE + +void cmdline_parse(); + +#endif diff --git a/src/sys/cmdline.c b/src/sys/cmdline.c new file mode 100644 index 00000000..8f802af8 --- /dev/null +++ b/src/sys/cmdline.c @@ -0,0 +1,68 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +static volatile struct limine_kernel_file_request kfreq = { + .id = LIMINE_KERNEL_FILE_REQUEST, + .revision = 0 +}; + +// takes a "EXAMPLE=EXAMPLE" pair, turns the '=' into a NULL and returns the start of the second token. returns NULL if there is no '=' + +static char* pair(char* s){ + size_t len = strlen(s); + + for(uintmax_t i = 0; i < len; ++i){ + if(s[i] == '='){ + s[i] = '\0'; + return s + i + 1; + } + } + + + return NULL; +} + +void cmdline_parse(){ + + char* ptr = kfreq.response->kernel_file->cmdline; + size_t count = *ptr == '\0' ? 0 : 1; + char* it = ptr; + + char** tokens = alloc(sizeof(char*)); + + if(tokens == NULL) + _panic("Out of memory!\n", NULL); + + *tokens = ptr; + + while(*it != '\0'){ + + if(*it == ' '){ + *it = '\0'; + ++count; + tokens = realloc(tokens, sizeof(char*) * count); + if(tokens == NULL) + _panic("Out of memory!\n", NULL); + tokens[count-1] = it+1; + } + + ++it; + } + + for(uintmax_t i = 0; i < count; ++i){ + char* second = pair(tokens[i]); + if(env_set(tokens[i], second)) + _panic("Out of memory!", NULL); + } + + printf("cmdline: %lu envs\n", count); + + free(tokens); + +}