diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-12-04 00:21:20 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-12-04 00:21:20 +0100 |
| commit | 427613498108fda93f7cbfcb3a9417da50a23958 (patch) | |
| tree | e6bbe4f4cf597b2d96d9adf99e254fe263ddd5df /kernel/syscalls.c | |
| parent | b5d9da88991592d35d39dcae3829d2498b4e47e4 (diff) | |
finally hacked env and argv!
Diffstat (limited to 'kernel/syscalls.c')
| -rw-r--r-- | kernel/syscalls.c | 93 |
1 files changed, 77 insertions, 16 deletions
diff --git a/kernel/syscalls.c b/kernel/syscalls.c index ed895b2..3ec4cfa 100644 --- a/kernel/syscalls.c +++ b/kernel/syscalls.c @@ -119,9 +119,54 @@ int syscall_readdir(const char *name,fs_dirent *dirs,int max) return fs_readdir(name,dirs,max); } + int syscall_execve(char *name, char **argv1, char **env1) { + int temp=0x1; + + char *force_argv[]={"",NULL}; + char *force_env[]={"PS1=$","PWD=/home/miguel","PATH=/bin",NULL}; + if(argv1==NULL)argv1=force_argv; + if(env1==NULL)env1=force_env; + + int env_count=0; + do{env_count++;}while(env1[env_count]!=NULL); + + int arg_count=0; + do{arg_count++;}while(argv1[arg_count]!=NULL); + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d %d", env_count, arg_count); + char **env=temp; + temp+=sizeof(char **)*(env_count+1); + char **argv=temp; + temp+=sizeof(char **)*(arg_count+1); + + int i=0; + do{ + int l=strlen(env1[i]); + char *env_var=temp; + temp+=sizeof(char *)*(l+1); + memcpy(env_var,env1[i],l+1); + env[i]=env_var; + i++; + }while(env1[i]!=NULL); + env[i]=NULL; + + i=0; + do{ + int l=strlen(argv1[i]); + char *arg_var=temp; + temp+=sizeof(char *)*(l+1); + memcpy(arg_var,argv1[i],l+1); + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg_var: 0x%08X",arg_var); + argv[i]=arg_var; + i++; + }while(argv1[i]!=NULL); + argv[i]=NULL; + + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"%d %d", env_count, arg_count); + #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"execve (name=0x%08X(%s), argvs=0x%08X, env=0x%08X)", name,name,argv1,env1); #endif @@ -137,32 +182,48 @@ int syscall_execve(char *name, char **argv1, char **env1) return -1; // errror loading } - asm("mov $0x08248000,%esp"); // set stack pointer // 2 mb over start. - - char *argv[]={"/bin/foolshell",NULL}; - char *env[]={"PATH=/bin","TERM=xterm","PWD=/home/miguel","PS1=$ ",NULL}; - int i=0; + // TODO: avoid code duplication for argv and env!! + char **env_new=alloc; + alloc+=sizeof(char **)*(env_count+1); + + i=0; do{ - #ifdef LOG_SYSCALLS +// #ifdef LOG_SYSCALLS log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"envr %d : 0x%08X : %s" ,i,env[i],env[i]); - #endif + // #endif + int l=strlen(env[i]); + char *env_var=alloc; + alloc+=sizeof(char)*l+1; + memcpy(env_var,env[i],l+1); + env_new[i]=env_var; i++; }while(env[i]!=NULL); + env_new[i]=NULL; - int argc=0; + char **argv_new=alloc; + alloc+=sizeof(char **)*(arg_count+1); + i=0; do{ - #ifdef LOG_SYSCALLS - log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,argc,argv[argc],argv[argc]); - #endif - argc++; - }while(argv[argc]!=NULL); + int l=strlen(argv[i]); + char *arg_var=alloc; + alloc+=sizeof(char)*l+1; + memcpy(arg_var,argv[i],l+1); + argv_new[i]=arg_var; +// #ifdef LOG_SYSCALLS + log(FOOLOS_MODULE_NAME,FOOLOS_LOG_INFO,"arg %d : 0x%08X : %s" ,i,argv_new[i],argv_new[i]); + // #endif + i++; + }while(argv[i]!=NULL); task_set_brk(alloc); - asm("push %0" :: "r" (argv)); - asm("push %0" :: "r" (argc)); - asm("push %0" :: "r" (env)); + // TODO: why can i not put it ~0x48000 bytes higher!? + asm("mov $0x8800000,%esp"); // set stack at high end of process image + + asm("push %0" :: "r" (argv_new)); + asm("push %0" :: "r" (arg_count)); + asm("push %0" :: "r" (env_new)); // push addr and return to it asm("push %0"::"r"(entry)); |
