diff --git a/kernel/tasks.c b/kernel/tasks.c index 9d451bee..144026fc 100644 --- a/kernel/tasks.c +++ b/kernel/tasks.c @@ -377,25 +377,43 @@ static int load_task(load_args_t* largs) } // push strings on the stack - offset = DEFAULT_STACK_SIZE-MAX_ARGS-8; + offset = DEFAULT_STACK_SIZE-8; + memset((void*) (stack+offset), 0, 4); + offset -= MAX_ARGS; memcpy((void*) (stack+offset), largs->buffer, MAX_ARGS); idx = offset; // push argv on the stack offset -= largs->argc * sizeof(char*); - i = 0; - while(iargc) { + for(i=0; iargc; i++) { ((char**) (stack+offset))[i] = (char*) (stack+idx); - i++; - while((iargc) && ((char*) stack)[idx] != '\0') + while(((char*) stack)[idx] != '\0') idx++; idx++; } + // push env on the stack + offset -= (largs->envc+1) * sizeof(char*); + for(i=0; ienvc; i++) { + ((char**) (stack+offset))[i] = (char*) (stack+idx); + + while(((char*) stack)[idx] != '\0') + idx++; + idx++; + } + ((char**) (stack+offset))[largs->envc] = NULL; + + // push pointer to env + offset -= sizeof(char**); + if (!(largs->envc)) + *((char***) (stack+offset)) = NULL; + else + *((char***) (stack+offset)) = (char**) (stack + offset + sizeof(char**)); + // push pointer to argv offset -= sizeof(char**); - *((char***) (stack+offset)) = (char**) (stack + offset + sizeof(char**)); + *((char***) (stack+offset)) = (char**) (stack + offset + 2*sizeof(char**) + (largs->envc+1) * sizeof(char*)); // push argc on the stack offset -= sizeof(int); @@ -466,12 +484,13 @@ int sys_execve(const char* fname, char** argv, char** env) load_args_t* load_args = NULL; char *dest, *src; int ret, argc = 0; + int envc = 0; node = findnode_fs((char*) fname); if (!node || !(node->type == FS_FILE)) return -EINVAL; - // determine buffer size of argv + // determine total buffer size of argv and env if (argv) { while (argv[argc]) { buffer_size += (strlen(argv[argc]) + 1); @@ -479,6 +498,13 @@ int sys_execve(const char* fname, char** argv, char** env) } } + if (env) { + while (env[envc]) { + buffer_size += (strlen(env[envc]) + 1); + envc++; + } + } + if (argc <= 0) return -EINVAL; if (buffer_size >= MAX_ARGS) @@ -490,12 +516,16 @@ int sys_execve(const char* fname, char** argv, char** env) load_args->node = node; load_args->argc = argc; - load_args->envc = 0; + load_args->envc = envc; dest = load_args->buffer; for (i=0; ivma_lock)); diff --git a/newlib/examples/hello.c b/newlib/examples/hello.c index 1c6f1f2f..bffa4136 100644 --- a/newlib/examples/hello.c +++ b/newlib/examples/hello.c @@ -28,10 +28,12 @@ extern int errno; int main(int argc, char** argv) { int i; - char str[] = "Hello World!!!\n"; + const char str[] = "Hello World!!!\n"; + for(i=0; environ[i]; i++) + printf("environ[%d] = %s\n", i, environ[i]); for(i=0; i