Handle process arguments

This commit is contained in:
2025-09-10 23:25:03 +02:00
parent 2f9f4d9397
commit dc3d80d707
13 changed files with 127 additions and 23 deletions

View File

@ -8,11 +8,12 @@
#include "vfs/vfs.h"
#include "path/path.h"
#include "kprintf.h"
#include "dlmalloc/malloc.h"
#define PCTL_MP_MAX 0xff
#define PCTL_PATH_MAX VFS_PATH_MAX
int32_t SYSCALL3(sys_processctl, pid1, cmd1, arg1) {
int32_t SYSCALL5(sys_processctl, pid1, cmd1, arg1, arg2, arg3) {
uint64_t pid = pid1;
uint64_t cmd = cmd1;
int32_t ret = E_OK;
@ -58,6 +59,13 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, arg1) {
ret = E_NOMEMORY;
goto done;
}
size_t argslen = arg3;
char **args = (char **)arg2;
for (size_t i = 0; i < argslen; i++) {
PROC_ARG(newproc, args[i]);
}
proc_register(newproc);
ret = newproc->pid;
} break;
@ -70,6 +78,32 @@ int32_t SYSCALL3(sys_processctl, pid1, cmd1, arg1) {
case PCTL_GETPID: {
ret = proc->pid;
} break;
case PCTL_ARGLEN: {
ret = proc->procargs.len;
} break;
case PCTL_ARGV: {
char **argbuf = (char **)arg1;
if (argbuf == NULL) {
ret = E_INVALIDARGUMENT;
goto done;
}
size_t len = arg2;
ProcArg *arg = proc->procargs.list;
size_t i = 0;
while (arg) {
if (i == len) {
break;
}
if (argbuf[i] == NULL) {
ret = E_INVALIDARGUMENT;
goto done;
}
hal_strcpy(argbuf[i], arg->string);
arg = arg->next;
i++;
}
ret = E_OK;
} break;
default: {
ret = E_INVALIDARGUMENT;
} break;