insmod: Support passing arguments to modules
This commit is contained in:
parent
c366ea2dfd
commit
32c3bf1825
@ -12,16 +12,13 @@
|
|||||||
|
|
||||||
int main(int argc, char * argv[]) {
|
int main(int argc, char * argv[]) {
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
fprintf(stderr, "Usage: %s <modulepath>\n", argv[0]);
|
fprintf(stderr, "Usage: %s <modulepath> [ARGS...]\n", argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
int ret = 0;
|
int status = sysfunc(TOARU_SYS_FUNC_INSMOD, &argv[1]);
|
||||||
for (int i = 1; i < argc; ++i) {
|
if (status != 0) {
|
||||||
int status = sysfunc(TOARU_SYS_FUNC_INSMOD, &argv[i]);
|
fprintf(stderr, "%s: %s: %s\n", argv[0], argv[1], strerror(errno));
|
||||||
if (status < 0) {
|
return status;
|
||||||
fprintf(stderr, "%s: %s: %s\n", argv[0], argv[i], strerror(errno));
|
|
||||||
ret = 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -27,10 +27,10 @@ hashmap_t * modules_get_list(void) {
|
|||||||
return _modules_table;
|
return _modules_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
int elf_module(const char * path) {
|
int elf_module(char ** args) {
|
||||||
Elf64_Header header;
|
Elf64_Header header;
|
||||||
|
|
||||||
fs_node_t * file = kopen(path,0);
|
fs_node_t * file = kopen(args[0],0);
|
||||||
|
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
@ -169,7 +169,11 @@ int elf_module(const char * path) {
|
|||||||
|
|
||||||
hashmap_set(_modules_table, moduleData->name, loadedData);
|
hashmap_set(_modules_table, moduleData->name, loadedData);
|
||||||
|
|
||||||
return moduleData->init(0,NULL);
|
/* Count arguments */
|
||||||
|
int argc = 0;
|
||||||
|
for (char ** aa = args; *aa; ++aa) ++argc;
|
||||||
|
|
||||||
|
return moduleData->init(argc, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
int elf_exec(const char * path, fs_node_t * file, int argc, const char *const argv[], const char *const env[], int interp) {
|
int elf_exec(const char * path, fs_node_t * file, int argc, const char *const argv[], const char *const env[], int interp) {
|
||||||
|
@ -58,7 +58,7 @@ static long sys_sbrk(ssize_t size) {
|
|||||||
return (long)out;
|
return (long)out;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int elf_module(const char * path);
|
extern int elf_module(char ** args);
|
||||||
|
|
||||||
static long sys_sysfunc(long fn, char ** args) {
|
static long sys_sysfunc(long fn, char ** args) {
|
||||||
/* FIXME: Most of these should be top-level, many are hacks/broken in Misaka */
|
/* FIXME: Most of these should be top-level, many are hacks/broken in Misaka */
|
||||||
@ -93,7 +93,8 @@ static long sys_sysfunc(long fn, char ** args) {
|
|||||||
if (!args) return -EFAULT;
|
if (!args) return -EFAULT;
|
||||||
PTR_VALIDATE(args[0]);
|
PTR_VALIDATE(args[0]);
|
||||||
if (!args[0]) return -EFAULT;
|
if (!args[0]) return -EFAULT;
|
||||||
return elf_module(args[0]);
|
for (char ** aa = args; *aa; ++aa) { PTR_VALIDATE(*aa); }
|
||||||
|
return elf_module(args);
|
||||||
|
|
||||||
case TOARU_SYS_FUNC_SETHEAP: {
|
case TOARU_SYS_FUNC_SETHEAP: {
|
||||||
/* I'm not really sure how this should be done...
|
/* I'm not really sure how this should be done...
|
||||||
|
@ -1,9 +1,22 @@
|
|||||||
#include <kernel/printf.h>
|
#include <kernel/printf.h>
|
||||||
#include <kernel/module.h>
|
#include <kernel/module.h>
|
||||||
|
#include <kernel/assert.h>
|
||||||
|
#include <kernel/misc.h>
|
||||||
|
|
||||||
static int init(int argc, char * argv[]) {
|
static int init(int argc, char * argv[]) {
|
||||||
printf("Hello, modules.\n");
|
dprintf("Hello, modules.\n");
|
||||||
*(volatile int*)0x60000000 = 42;
|
dprintf("Received %d arguments.\n", argc);
|
||||||
|
|
||||||
|
if (argc > 1 && !strcmp(argv[1], "--traceback")) {
|
||||||
|
arch_dump_traceback();
|
||||||
|
} else if (argc > 1 && !strcmp(argv[1], "--fail")) {
|
||||||
|
return 1;
|
||||||
|
} else if (argc > 1 && !strcmp(argv[1], "--crash")) {
|
||||||
|
*(volatile int*)0x60000000 = 42;
|
||||||
|
} else if (argc > 1 && !strcmp(argv[1], "--assert")) {
|
||||||
|
assert(0 && "Intentional failure.");
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user