Fixed bit arithmatic
[tpg/acess2.git] / Usermode / Applications / CLIShell_src / main.c
index 04acc14..24c93dd 100644 (file)
@@ -31,7 +31,7 @@ struct        {
 \r
 // ==== LOCAL VARIABLES ====\r
 char   gsCommandBuffer[1024];\r
-char   *gsCurrentDirectory = "/";\r
+char   *gsCurrentDirectory = NULL;\r
 char   gsTmpBuffer[1024];\r
 char   **gasCommandHistory;\r
  int   giLastCommand = 0;\r
@@ -48,10 +48,21 @@ int main(int argc, char *argv[], char *envp[])
         int    bCached = 1;\r
        t_sysFInfo      info;\r
        \r
-       //Command_Clear(0, NULL);\r
+       Command_Clear(0, NULL);\r
+       \r
+       {\r
+               char    *tmp = getenv("CWD");\r
+               if(tmp) {\r
+                       gsCurrentDirectory = malloc(strlen(tmp)+1);\r
+                       strcpy(gsCurrentDirectory, tmp);\r
+               } else {\r
+                       gsCurrentDirectory = malloc(2);\r
+                       strcpy(gsCurrentDirectory, "/");\r
+               }\r
+       }       \r
        \r
        write(_stdout, 1, "\n");\r
-       write(_stdout, 36, "Acess Shell Version 3\n");\r
+       write(_stdout, 22, "Acess Shell Version 3\n");\r
        write(_stdout,  2, "\n");\r
        for(;;)\r
        {\r
@@ -119,6 +130,7 @@ int main(int argc, char *argv[], char *envp[])
                }\r
                // Load new executable\r
                pid = clone(CLONE_VM, 0);\r
+               printf("pid = %i\n", pid);\r
                if(pid == 0)    execve(gsTmpBuffer, &saArgs[1], envp);\r
                if(pid <= 0) {\r
                        Print("Unablt to create process: `");Print(gsTmpBuffer);Print("'\n");   // Error Message
@@ -143,6 +155,7 @@ char *ReadCommandLine(int *Length)
         \r
        // Preset Variables\r
        ret = malloc( space+1 );\r
+       if(!ret)        return NULL;\r
        len = 0;\r
        pos = 0;\r
                \r
@@ -150,7 +163,22 @@ char *ReadCommandLine(int *Length)
        do {\r
                read(_stdin, 1, &ch);   // Read Character from stdin (read is a blocking call)\r
                // Ignore control characters\r
-               if(ch < 0)      continue;\r
+               if(ch == '\x1B') {\r
+                       read(_stdin, 1, &ch);   // Read control character\r
+                       switch(ch)\r
+                       {\r
+                       case 'D':       if(pos) pos--;  break;\r
+                       case 'C':       if(pos<len)     pos++;  break;\r
+                       case '[':\r
+                               read(_stdin, 1, &ch);   // Read control character\r
+                               switch(ch)\r
+                               {\r
+                               case 'D':       if(pos) pos--;  break;\r
+                               case 'C':       if(pos<len)     pos++;  break;\r
+                               }\r
+                       }\r
+                       continue;\r
+               }\r
                // Backspace\r
                if(ch == '\b') {\r
                        if(len <= 0)            continue;       // Protect against underflows\r
@@ -324,7 +352,12 @@ void Command_Cd(int argc, char **argv)
                return;\r
        }\r
        \r
+       free(gsCurrentDirectory);\r
+       gsCurrentDirectory = malloc(strlen(tmpPath)+1);\r
        strcpy(gsCurrentDirectory, tmpPath);\r
+       \r
+       // Register change with kernel\r
+       chdir( gsCurrentDirectory );\r
 }\r
 \r
 /**\r
@@ -397,10 +430,13 @@ void Command_Dir(int argc, char **argv)
                if(fp == -1)    continue;\r
                // Get File Stats\r
                finfo(fp, &info, 0);\r
-               close(fp);\r
                \r
-               //Print Mode\r
-               //#if 0\r
+               if(info.flags & FILEFLAG_DIRECTORY)\r
+                       write(_stdout, 1, "d");\r
+               else\r
+                       write(_stdout, 1, "-");\r
+               \r
+               // Print Mode\r
                acl.group = 0;  acl.id = info.uid;\r
                _SysGetACL(fp, &acl);\r
                if(acl.perms & 1)       modeStr[0] = 'r';       else    modeStr[0] = '-';\r
@@ -417,15 +453,16 @@ void Command_Dir(int argc, char **argv)
                if(acl.perms & 1)       modeStr[7] = 'w';       else    modeStr[7] = '-';\r
                if(acl.perms & 1)       modeStr[8] = 'x';       else    modeStr[8] = '-';\r
                write(_stdout, 10, modeStr);\r
-               //#endif\r
+               close(fp);\r
                \r
                // Colour Code\r
                if(info.flags & FILEFLAG_DIRECTORY)     // Directory: Green\r
                        write(_stdout, 6, "\x1B[32m");\r
-               else\r
-                       write(_stdout, 6, "\x1B[37m");  // Default: White\r
+               // Default: White\r
+               \r
                // Print Name\r
                write(_stdout, strlen(fileName), fileName);\r
+               \r
                // Print slash if applicable\r
                if(info.flags & FILEFLAG_DIRECTORY)\r
                        write(_stdout, 1, "/");\r
@@ -433,10 +470,8 @@ void Command_Dir(int argc, char **argv)
                // Revert Colour\r
                write(_stdout, 6, "\x1B[37m");\r
                \r
-               // Put Size\r
-               printf("\n", info.size);\r
-               \r
-               //write(_stdout, 1, "\n");\r
+               // Newline!\r
+               write(_stdout, 1, "\n");\r
        }\r
        // Close Directory\r
        close(dp);\r

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