Fixed correctness in stdio, minor changes in ls to handle dirs with negative sizes
[tpg/acess2.git] / Usermode / Applications / CLIShell_src / main.c
index 4fe8a4a..2e51419 100644 (file)
@@ -4,6 +4,7 @@
 #include <acess/sys.h>\r
 #include <stdlib.h>\r
 #include <stdio.h>\r
+#include <string.h>\r
 #include "header.h"\r
 \r
 #define _stdin 0\r
@@ -14,8 +15,9 @@
 char   *ReadCommandLine(int *Length);\r
 void   Parse_Args(char *str, char **dest);\r
 void   CallCommand(char **Args);\r
-void   Command_Colour(int argc, char **argv);\r
+void   Command_Logout(int argc, char **argv);\r
 void   Command_Clear(int argc, char **argv);\r
+void   Command_Colour(int argc, char **argv);\r
 void   Command_Cd(int argc, char **argv);\r
 void   Command_Dir(int argc, char **argv);\r
 \r
@@ -25,10 +27,11 @@ struct      {
        char    *name;\r
        void    (*fcn)(int argc, char **argv);\r
 }      cBUILTINS[] = {\r
+       {"exit", Command_Logout},       {"logout", Command_Logout},\r
        {"colour", Command_Colour}, {"clear", Command_Clear},\r
        {"cd", Command_Cd}, {"dir", Command_Dir}\r
 };\r
-static char    *cDEFAULT_PATH[] = {"/Acess"};\r
+static char    *cDEFAULT_PATH[] = {"/Acess/Bin"};\r
 #define        BUILTIN_COUNT   (sizeof(cBUILTINS)/sizeof(cBUILTINS[0]))\r
 \r
 // ==== LOCAL VARIABLES ====\r
@@ -45,7 +48,7 @@ char  **gasCommandHistory;
 int main(int argc, char *argv[], char *envp[])\r
 {\r
        char    *sCommandStr;\r
-       char    *saArgs[32];\r
+       char    *saArgs[32] = {0};\r
         int    length = 0;\r
         int    i;\r
         int    iArgCount = 0;\r
@@ -141,7 +144,7 @@ char *ReadCommandLine(int *Length)
        // Read In Command Line\r
        do {\r
                read(_stdin, 1, &ch);   // Read Character from stdin (read is a blocking call)\r
-               // Ignore control characters\r
+               // Control characters\r
                if(ch == '\x1B') {\r
                        read(_stdin, 1, &ch);   // Read control character\r
                        switch(ch)\r
@@ -171,6 +174,13 @@ char *ReadCommandLine(int *Length)
                        write(_stdout, 1, &ch);\r
                        continue;\r
                }\r
+               // Tab\r
+               if(ch == '\t') {\r
+                       //TODO: Implement Tab-Completion\r
+                       //Currently just ignore tabs\r
+                       continue;\r
+               }\r
+               \r
                // Expand Buffer\r
                if(len > space) {\r
                        space += 256;\r
@@ -311,9 +321,28 @@ void CallCommand(char **Args)
        }\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
 /**\r
  * \fn void Command_Colour(int argc, char **argv)\r
- * \brief \r
+ * \brief Set the colour of the shell prompt\r
+ * \note Conflicts with coloured `dir` display\r
  */\r
 void Command_Colour(int argc, char **argv)\r
 {\r
@@ -374,15 +403,6 @@ usage:
        return;\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
 /**\r
  * \fn void Command_Cd(int argc, char **argv)\r
  * \brief Change directory\r
@@ -423,6 +443,8 @@ void Command_Cd(int argc, char **argv)
 }\r
 \r
 /**\r
+ * \fn void Command_Dir(int argc, char **argv)\r
+ * \brief Print the contents of a directory\r
  */\r
 void Command_Dir(int argc, char **argv)\r
 {\r
@@ -447,10 +469,7 @@ void Command_Dir(int argc, char **argv)
        // Check if file opened\r
        if(dp == -1)\r
        {\r
-               //printf("Unable to open directory `%s', File cannot be found\n", tmpPath);\r
-               write(_stdout, 27, "Unable to open directory `");\r
-               write(_stdout, strlen(tmpPath)+1, tmpPath);\r
-               write(_stdout, 25, "', File cannot be found\n");\r
+               printf("Unable to open directory `%s', File cannot be found\n", tmpPath);\r
                return;\r
        }\r
        // Get File Stats\r
@@ -499,21 +518,24 @@ void Command_Dir(int argc, char **argv)
                        write(_stdout, 1, "-");\r
                \r
                // Print Mode\r
+               // - Owner\r
                acl.group = 0;  acl.id = info.uid;\r
                _SysGetACL(fp, &acl);\r
                if(acl.perms & 1)       modeStr[0] = 'r';       else    modeStr[0] = '-';\r
                if(acl.perms & 2)       modeStr[1] = 'w';       else    modeStr[1] = '-';\r
                if(acl.perms & 8)       modeStr[2] = 'x';       else    modeStr[2] = '-';\r
+               // - Group\r
                acl.group = 1;  acl.id = info.gid;\r
                _SysGetACL(fp, &acl);\r
                if(acl.perms & 1)       modeStr[3] = 'r';       else    modeStr[3] = '-';\r
-               if(acl.perms & 1)       modeStr[4] = 'w';       else    modeStr[4] = '-';\r
-               if(acl.perms & 1)       modeStr[5] = 'x';       else    modeStr[5] = '-';\r
+               if(acl.perms & 2)       modeStr[4] = 'w';       else    modeStr[4] = '-';\r
+               if(acl.perms & 8)       modeStr[5] = 'x';       else    modeStr[5] = '-';\r
+               // - World\r
                acl.group = 1;  acl.id = -1;\r
                _SysGetACL(fp, &acl);\r
                if(acl.perms & 1)       modeStr[6] = 'r';       else    modeStr[6] = '-';\r
-               if(acl.perms & 1)       modeStr[7] = 'w';       else    modeStr[7] = '-';\r
-               if(acl.perms & 1)       modeStr[8] = 'x';       else    modeStr[8] = '-';\r
+               if(acl.perms & 2)       modeStr[7] = 'w';       else    modeStr[7] = '-';\r
+               if(acl.perms & 8)       modeStr[8] = 'x';       else    modeStr[8] = '-';\r
                write(_stdout, 10, modeStr);\r
                close(fp);\r
                \r

UCC git Repository :: git.ucc.asn.au