summaryrefslogblamecommitdiffstats
path: root/boot/cmdline.c
blob: 5a684663dafc976abdcdef0c5d9e7dde6fef7833 (plain) (tree)
1
2
3
4
5
6
7
8
9



                        
                 

                   
 
                                 



                            

                                                        






                                  
                                         









                                                                 
                                                                        



                                    
                                    





                                                                       
                                        

                                                                      

                                                                   


                          
#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;
    }
}