diff options
| author | Michal Idziorek <m.i@gmx.at> | 2014-11-23 23:26:26 +0100 |
|---|---|---|
| committer | Michal Idziorek <m.i@gmx.at> | 2014-11-23 23:26:26 +0100 |
| commit | ec0ba7bc40854eab6a1cdb41364f41f9c11407e1 (patch) | |
| tree | 88f3896c70ac32bc1b70dcd7ebddbbe595c6608f /userspace/foolshell.c | |
| parent | 50300fa573bf2bc00f9732e812d54ab77cf03dd7 (diff) | |
foolshell and syscalls improvememets
Diffstat (limited to 'userspace/foolshell.c')
| -rw-r--r-- | userspace/foolshell.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/userspace/foolshell.c b/userspace/foolshell.c new file mode 100644 index 0000000..819c5d6 --- /dev/null +++ b/userspace/foolshell.c @@ -0,0 +1,151 @@ +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <string.h> + +// +void hello() +{ + // ascci art: http://patorjk.com/software/taag/#p=testall&f=Cards&t=Fool%20OS + puts( + + " ______ __ ____ _____ \n" + " / ____/___ ____ / / / __ \\/ ___/ \n" + " / /_ / __ \\/ __ \\/ / / / / /\\__ \\ \n" + " / __/ / /_/ / /_/ / / / /_/ /___/ / \n" + " /_/ \\____/\\____/_/ \\____//____/ \n" + " \n" + "Welcome to FoolShell v0.2 (Compiled on " __DATE__ " at " __TIME__ "\n" + "--------------------------------------------------------------------\n\n" + "type 'help' anytime to show shell built-ins\n" + "or execute user programms that are in the '/bin' directory (e.g. ls)\n" + ); +} + +void prompt() +{ + printf( + "$ " + ); +} + +int main(int argc, char **argv) +{ + + bool silent=false; + for(int i=0;i<argc;i++) + { + if(!strcmp(argv[i],"--silent"))silent=true; + } + + if(!silent)hello(); + + char *buf=malloc(256); + + while(1) + { + prompt(); + fgets(buf,255,stdin); + buf[strlen(buf)-1]=0; // remove \n + process(buf); + } + + return 0; +} + +char **tokenize(char *buf) +{ + + char **token; + token=malloc(10*sizeof(char*)); + + int l=strlen(buf); + + int i; + int c=0; + + for(i=0;i<l;i++) + { + // init space for next token + token[c]=malloc(256); + + //skip all the whitespace + while(buf[i]==' '&&i<l)i++; + if(i==l)break; + + //get token + int t=0; + + while(buf[i]!=' '&&i<l) + { + token[c][t]=buf[i]; + t++; + i++; + } + token[c][t]=0; + + + +// printf("token %i : <%s>\n",c, token[c]); + c++; + token[c]=NULL; + + } + + return token; + +} + +int process(char *buf) +{ + + char **token=tokenize(buf); + char *command=token[0]; + // puts(command); + // copied from trottelshell + + if(!strcmp(command,"help")) + { + puts("foolshell: supported built-in commands: 'help', 'echo [string]', 'malloc [bytes]', 'free [address]', 'getenv [var]', 'putenv [var] [val]'"); + } + else if(!strcmp(command,"echo")) + { + printf("\"%s\"\n",token[1]); + + } + else if(!strcmp(command,"malloc")) + { + uint8_t *mall=malloc(atoi(token[1])); + printf("allocated %d bytes at 0x%08X (%i).\n",atoi(token[1]),mall,mall); + } + else if(!strcmp(command,"free")) + { + free(atoi(token[1])); + printf("called free(0x%08X).\n",atoi(token[1])); + } + else if(!strcmp(command,"getenv")) + { + printf("%s = %s \n",token[1],getenv(token[1])); + } + else if(!strcmp(command,"putenv")) + { + char buf[256]; + sprintf(buf,"%s=%s",token[1],token[2]); + putenv(buf); + printf("set: %s = %s \n",token[1],getenv(token[1])); + } + else + { + execve(token[0],token,0); + char buf[256]; + sprintf(buf,"/bin/%s",token[0]); + execve(buf,token,0); + puts("foolshell: command not found"); + } + +} + + + + + |
