+/**\r
+ * \fn void CallCommand(char **Args)\r
+ */\r
+void CallCommand(char **Args)\r
+{\r
+ t_sysFInfo info;\r
+ int pid = -1;\r
+ int fd = 0;\r
+ char sTmpBuffer[1024];\r
+ char *exefile = Args[0];\r
+ \r
+ if(exefile[0] == '/'\r
+ || (exefile[0] == '.' && exefile[1] == '/')\r
+ || (exefile[0] == '.' && exefile[1] == '.' && exefile[2] == '/')\r
+ )\r
+ {\r
+ GeneratePath(exefile, gsCurrentDirectory, sTmpBuffer);\r
+ // Check file existence\r
+ fd = open(sTmpBuffer, OPENFLAG_EXEC);\r
+ if(fd == -1) {\r
+ Print("Unknown Command: `");Print(Args[0]);Print("'\n"); // Error Message\r
+ return ;\r
+ }\r
+ \r
+ // Get File info and close file\r
+ finfo( fd, &info, 0 );\r
+ close( fd );\r
+ \r
+ // Check if the file is a directory\r
+ if(info.flags & FILEFLAG_DIRECTORY) {\r
+ Print("`");Print(sTmpBuffer); // Error Message\r
+ Print("' is a directory.\n");\r
+ return ;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ int i;\r
+ \r
+ // Check all components of $PATH\r
+ for( i = 0; i < giNumPathDirs; i++ )\r
+ {\r
+ GeneratePath(exefile, gasPathDirs[i], sTmpBuffer);\r
+ fd = open(sTmpBuffer, OPENFLAG_EXEC);\r
+ if(fd == -1) continue;\r
+ finfo( fd, &info, 0 );\r
+ close( fd );\r
+ if(info.flags & FILEFLAG_DIRECTORY) continue;\r
+ // Woohoo! We found a valid command\r
+ break;\r
+ }\r
+ \r
+ // Exhausted path directories\r
+ if( i == giNumPathDirs ) {\r
+ Print("Unknown Command: `");Print(exefile);Print("'\n");\r
+ return ;\r
+ }\r
+ }\r
+ \r
+ // Create new process\r
+ pid = clone(CLONE_VM, 0);\r
+ // Start Task\r
+ if(pid == 0)\r
+ execve(sTmpBuffer, Args, gasEnvironment);\r
+ if(pid <= 0) {\r
+ Print("Unablt to create process: `");Print(sTmpBuffer);Print("'\n"); // Error Message\r
+ }\r
+ else {\r
+ int status;\r
+ waittid(pid, &status);\r
+ }\r
+}\r
+\r
+/**\r
+ * \fn void Command_Logout(int argc, char **argv)\r
+ * \brief Exit the shell, logging the user out\r
+ */\r
+void Command_Logout(int argc, char **argv)\r
+{\r
+ exit(0);\r
+}\r
+\r
+/**\r
+ * \fn void Command_Clear(int argc, char **argv)\r
+ * \brief Clear the screen\r
+ */\r
+void Command_Clear(int argc, char **argv)\r
+{\r
+ write(_stdout, 4, "\x1B[2J"); //Clear Screen\r
+}\r
+\r