summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
diff options
context:
space:
mode:
authorMichal Idziorek <m.i@gmx.at>2014-12-04 00:21:20 +0100
committerMichal Idziorek <m.i@gmx.at>2014-12-04 00:21:20 +0100
commit427613498108fda93f7cbfcb3a9417da50a23958 (patch)
treee6bbe4f4cf597b2d96d9adf99e254fe263ddd5df /kernel/syscalls.c
parentb5d9da88991592d35d39dcae3829d2498b4e47e4 (diff)
finally hacked env and argv!
Diffstat (limited to 'kernel/syscalls.c')
-rw-r--r--kernel/syscalls.c93
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));