blob: 5a684663dafc976abdcdef0c5d9e7dde6fef7833 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#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;
}
}
|