26#define MODULE_FMT "/usr/lib/modules/%s.o"
28extern void pedigree_module_load(
char* file);
29extern int pedigree_module_is_loaded(
char* name);
30int load_module(
char* name);
32int load_module(
char* name) {
34 char* file = (
char*)malloc(strlen(name) + strlen(MODULE_FMT) -
36 sprintf(file, MODULE_FMT, name);
38 FILE* fp = fopen(file,
"r");
40 printf(
"Module file %s not found!\n", file);
43 fseek(fp, 0, SEEK_END);
44 size_t len = ftell(fp);
45 fseek(fp, 0, SEEK_SET);
47 uint8_t* buffer = (uint8_t*)malloc(len);
48 fread(buffer, len, 1, fp);
51 Elf_t* elf = elf_create(buffer, len);
59 ElfSymbol_t *name_sym = elf_get_symbol(elf,
"g_pModuleName"),
60 *deps_sym = elf_get_symbol(elf,
"g_pDepends");
62 printf(
"g_pModuleName symbol not found!\n");
66 printf(
"g_pDepends symbols not found!\n");
70 char* modname = (
char*)elf_relptr(elf, name_sym, *SYM_PTR(elf, name_sym));
71 if (pedigree_module_is_loaded(modname)) {
72 printf(
"Module %s is already loaded!\n", modname);
76 printf(
"Module %s being loaded...\n", modname);
77 uint32_t* deps = SYM_PTR(elf, deps_sym);
78 for (
size_t i = 0; deps[i]; i++) {
79 char* depname = (
char*)elf_relptr(elf, deps_sym, deps[i]);
80 if (pedigree_module_is_loaded(depname))
82 if (!load_module(depname) && pedigree_module_is_loaded(depname))
84 printf(
"Dependency %s of %s couldn't been loaded!\n", depname, modname);
89 pedigree_module_load(file);
90 if (pedigree_module_is_loaded(modname))
92 printf(
"Module %s couldn't been loaded\n", modname);
96int main(
int argc,
char** argv) {
98 printf(
"Usage: %s <module name>\n", argv[0]);
101 return load_module(argv[1]);