#include "commandline.h" #include "klib/hash.h" #include "klib/rbtree.h" #include "string.h" #include "boot.h" #include "memory.h" #include "print.h" static rbtree_t s_cmdline_kernel; const char* cmdline_get(const char *key) { intmax_t hash = string_hash(key); char** value = rbtree_find(&s_cmdline_kernel, hash); if(value == NULL) return NULL; return *value; } void cmdline_kernel_setup(void) { rbtree_new(&s_cmdline_kernel, char*); size_t cmdi = 0; const char *cmdline = boot_kernel_cmdline; if(cmdline == 0) return; while(cmdline[cmdi] != 0) { size_t keyi = cmdi; while(cmdline[keyi] != '=' && cmdline[keyi] != 0) keyi++; if(cmdline[keyi] == 0 || keyi == 0) { kwarnf("kernel cmdline is empty or malformed; skipping.\n"); break; } size_t keylen = keyi - cmdi; char *key = kmalloc(keylen); memcpy(key, &cmdline[cmdi], keylen); size_t valuei = keyi + 1; while(cmdline[valuei] != ' ' && cmdline[valuei] != 0) valuei++; size_t valuelen = (valuei - keyi) - 1; char *value = kmalloc(valuelen); if(valuelen != 0) memcpy(value, &cmdline[keyi + 1], valuelen); kdbgf("%s = %s\n", key, value); rbtree_insert(&s_cmdline_kernel, string_hash(key), &value); cmdi = valuei + 1; } }