#include #include #include #include extern char **environ; // 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.4 (Compiled on " __DATE__ " at " __TIME__ "\n" "------------------------------------------------------------------\n\n" "Please type 'help' anytime, to show shell \"built-ins\" or execute \n" "user programms that are in you $PATH directory by simply typing \n" "their filenames. You can get additional information for many commands\n" "by invking them with the --help or -h flag (e.g. ls --help) \n" ); printf("Your $PATH is currently set to: %s\n\n",getenv("PATH")); } void prompt() { printf("%s%s",getenv("PWD"),getenv("PS1")); } int main(int argc, char **argv) { bool silent=false; for(int i=0;i\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/setenv [var] [val]', 'env' 'cd [dir]'"); } else if(!strcmp(command,"cd")) { char *dir=getenv("PWD"); char buf[256]; if(token[1][0]!='/') { sprintf(buf,"%s%s%s",dir,dir[0]=='/'&&dir[1]==0?"":"/",token[1]); } else { sprintf(buf,"%s",token[1]); } char token[10]; //adjust pwd (resolve '..' and '.') //// printf("adjusting pwd: '%s'\n",buf); int left=1; int right=0; do{ int t=0; do { right++; token[t]=buf[right]; t++; } while(buf[right]!=0&&buf[right]!='/'); token[t-1]=0; // printf("path token: '%s'\n",token); if(!strcmp(token,"..")) { left--; while(buf[left]!='/')left--; } else if(!strcmp(token,".")) { } else { int i=0; if(left!=1)buf[left++]='/'; do{buf[left++]=token[i++];}while(token[i]!=0); } }while(buf[right]!=0); buf[left]=0; // printf("adjusted: '%s'\n",buf); setenv("PWD",buf,1); } 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("(0x%08X) get: '%s' = '%s'(0x%08X) \n",environ,token[1],getenv(token[1]),getenv(token[1])); } else if(!strcmp(command,"putenv")||!strcmp(command,"setenv")) { char buf[256]; sprintf(buf,"%s=%s",token[1],token[2]); putenv(buf); printf("(0x%08X) set: '%s' = '%s' \n",environ,token[1],getenv(token[1])); } else if(!strcmp(command,"env")) { int i=0; printf("env: 0x%08X\n",environ); while(environ[i]!=NULL) { printf("envvar %s (0x%08X)\n" ,environ[i],environ[i]); i++; } } else { char buf[256]; sprintf(buf,"%s/%s",getenv("PATH"),token[0]); asm("mov $0x05bff,%esp"); // set stack pointer execve(buf,token,environ); asm("mov $0x07000,%esp"); // set stack pointer puts("foolshell: command not found"); asm("mov $0x05bff,%esp"); // set stack pointer static char *argv[]={"shell","--silent",NULL}; execve("/bin/foolshell",argv,environ); // start shell } return 0; }