Handle process arguments
This commit is contained in:
@ -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;
|
||||
|
@ -4,6 +4,6 @@
|
||||
#include <stdint.h>
|
||||
#include "syscall.h"
|
||||
|
||||
int32_t SYSCALL3(sys_processctl, pid1, cmd1, arg1);
|
||||
int32_t SYSCALL5(sys_processctl, pid1, cmd1, arg1, arg2, arg3);
|
||||
|
||||
#endif // SYSCALL_PROCESSCTL_H_
|
||||
|
Reference in New Issue
Block a user