X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2FCLIShell_src%2Fmain.c;h=4fe8a4a2331cb3f154c563d5099b310dafc7b88a;hb=1a96e0dd77d6922078edd703fc7c2e809b9499b8;hp=f4d703cfee76058aa9e12ba59818c5b1c73ba483;hpb=386155834910b925daedf25b8d35c14ab655fbaa;p=tpg%2Facess2.git diff --git a/Usermode/Applications/CLIShell_src/main.c b/Usermode/Applications/CLIShell_src/main.c index f4d703cf..4fe8a4a2 100644 --- a/Usermode/Applications/CLIShell_src/main.c +++ b/Usermode/Applications/CLIShell_src/main.c @@ -13,6 +13,7 @@ // ==== PROTOTYPES ==== char *ReadCommandLine(int *Length); void Parse_Args(char *str, char **dest); +void CallCommand(char **Args); void Command_Colour(int argc, char **argv); void Command_Clear(int argc, char **argv); void Command_Cd(int argc, char **argv); @@ -27,12 +28,15 @@ struct { {"colour", Command_Colour}, {"clear", Command_Clear}, {"cd", Command_Cd}, {"dir", Command_Dir} }; +static char *cDEFAULT_PATH[] = {"/Acess"}; #define BUILTIN_COUNT (sizeof(cBUILTINS)/sizeof(cBUILTINS[0])) // ==== LOCAL VARIABLES ==== + int giNumPathDirs = 1; +char **gasPathDirs = cDEFAULT_PATH; +char **gasEnvironment; char gsCommandBuffer[1024]; -char *gsCurrentDirectory = "/"; -char gsTmpBuffer[1024]; +char *gsCurrentDirectory = NULL; char **gasCommandHistory; int giLastCommand = 0; int giCommandSpace = 0; @@ -43,15 +47,26 @@ int main(int argc, char *argv[], char *envp[]) char *sCommandStr; char *saArgs[32]; int length = 0; - int pid = -1; + int i; int iArgCount = 0; int bCached = 1; - t_sysFInfo info; - //Command_Clear(0, NULL); + gasEnvironment = envp; + + Command_Clear(0, NULL); - write(_stdout, 1, "\n"); - write(_stdout, 36, "Acess Shell Version 3\n"); + { + char *tmp = getenv("CWD"); + if(tmp) { + gsCurrentDirectory = malloc(strlen(tmp)+1); + strcpy(gsCurrentDirectory, tmp); + } else { + gsCurrentDirectory = malloc(2); + strcpy(gsCurrentDirectory, "/"); + } + } + + write(_stdout, 22, "Acess Shell Version 3\n"); write(_stdout, 2, "\n"); for(;;) { @@ -65,6 +80,11 @@ int main(int argc, char *argv[], char *envp[]) // Read Command line sCommandStr = ReadCommandLine( &length ); + if(!sCommandStr) { + write(_stdout, 25, "PANIC: Out of heap space\n"); + return -1; + } + // Check if the command should be cached if(gasCommandHistory == NULL || strcmp(sCommandStr, gasCommandHistory[giLastCommand]) != 0) { @@ -88,46 +108,18 @@ int main(int argc, char *argv[], char *envp[]) if(saArgs[1][0] == '\0') continue; // Check Built-In Commands - // [HACK] Mem Usage - Use Length in place of `i' - for(length=0;length []\n"); Print("Valid Colours are "); for(fg=0;fg<8;fg++) { @@ -288,6 +374,10 @@ usage: return; } +/** + * \fn void Command_Clear(int argc, char **argv) + * \brief Clear the screen + */ void Command_Clear(int argc, char **argv) { write(_stdout, 4, "\x1B[2J"); //Clear Screen @@ -324,7 +414,12 @@ void Command_Cd(int argc, char **argv) return; } + free(gsCurrentDirectory); + gsCurrentDirectory = malloc(strlen(tmpPath)+1); strcpy(gsCurrentDirectory, tmpPath); + + // Register change with kernel + chdir( gsCurrentDirectory ); } /** @@ -398,8 +493,12 @@ void Command_Dir(int argc, char **argv) // Get File Stats finfo(fp, &info, 0); - //Print Mode - //#if 0 + if(info.flags & FILEFLAG_DIRECTORY) + write(_stdout, 1, "d"); + else + write(_stdout, 1, "-"); + + // Print Mode acl.group = 0; acl.id = info.uid; _SysGetACL(fp, &acl); if(acl.perms & 1) modeStr[0] = 'r'; else modeStr[0] = '-'; @@ -416,16 +515,16 @@ void Command_Dir(int argc, char **argv) if(acl.perms & 1) modeStr[7] = 'w'; else modeStr[7] = '-'; if(acl.perms & 1) modeStr[8] = 'x'; else modeStr[8] = '-'; write(_stdout, 10, modeStr); - //#endif close(fp); // Colour Code if(info.flags & FILEFLAG_DIRECTORY) // Directory: Green write(_stdout, 6, "\x1B[32m"); - else - write(_stdout, 6, "\x1B[37m"); // Default: White + // Default: White + // Print Name write(_stdout, strlen(fileName), fileName); + // Print slash if applicable if(info.flags & FILEFLAG_DIRECTORY) write(_stdout, 1, "/"); @@ -433,10 +532,8 @@ void Command_Dir(int argc, char **argv) // Revert Colour write(_stdout, 6, "\x1B[37m"); - // Put Size - printf("\n", info.size); - - //write(_stdout, 1, "\n"); + // Newline! + write(_stdout, 1, "\n"); } // Close Directory close(dp);