Usermode/libaxwin4 - Handle demarshal failure
[tpg/acess2.git] / Usermode / Applications / CLIShell_src / main.c
index 28007e1..6de92df 100644 (file)
@@ -8,6 +8,8 @@
 #include <string.h>\r
 #include "header.h"\r
 #include <readline.h>\r
+#include <errno.h>\r
+#include <acess/devices/pty.h>\r
 \r
 #define _stdin 0\r
 #define _stdout        1\r
@@ -31,11 +33,11 @@ struct      {
        {"help", Command_Help}, {"clear", Command_Clear},\r
        {"cd", Command_Cd}, {"dir", Command_Dir}\r
 };\r
-static char    *cDEFAULT_PATH[] = {"/Acess/Bin"};\r
+static char    *cDEFAULT_PATH[] = {"/Acess/Bin","/Acess/SBin"};\r
 #define        BUILTIN_COUNT   (sizeof(cBUILTINS)/sizeof(cBUILTINS[0]))\r
 \r
 // ==== LOCAL VARIABLES ====\r
- int   giNumPathDirs = 1;\r
+ int   giNumPathDirs = 2;\r
 char   **gasPathDirs = cDEFAULT_PATH;\r
 char   **gasEnvironment;\r
 char   gsCommandBuffer[1024];\r
@@ -55,7 +57,7 @@ int main(int argc, char *argv[], char **envp)
        \r
        gasEnvironment = envp;\r
        \r
-       Command_Clear(0, NULL);\r
+//     Command_Clear(0, NULL);\r
        \r
        {\r
                char    *tmp = getenv("CWD");\r
@@ -75,10 +77,15 @@ int main(int argc, char *argv[], char **envp)
                if(saArgs[0])   free(saArgs[0]);\r
                \r
                printf("%s$ ", gsCurrentDirectory);\r
+               fflush(stdout);\r
                \r
                // Read Command line\r
                sCommandStr = Readline( readline_state );\r
                printf("\n");\r
+               if( !sCommandStr ) {\r
+                       perror("Readline");\r
+                       return 1;\r
+               }\r
                \r
                // Parse Command Line into arguments\r
                iArgCount = Parse_Args(sCommandStr, saArgs);\r
@@ -207,14 +214,28 @@ void CallCommand(char **Args)
        \r
        // Create new process\r
        int fds[] = {0, 1, 2};\r
+        int    status;\r
        pid = _SysSpawn(sTmpBuffer, (const char **)Args, (const char **)gasEnvironment, 3, fds, NULL);\r
        if(pid <= 0) {\r
                printf("Unable to create process: `%s'\n", sTmpBuffer); // Error Message\r
+               status = 0;\r
        }\r
        else {\r
-                int    status;\r
+               _SysIOCtl(0, PTY_IOCTL_SETPGRP, &pid);\r
                _SysWaitTID(pid, &status);\r
        }\r
+       \r
+       // Return terminal to a sane state\r
+       {\r
+               int zero = 0;\r
+               _SysIOCtl(0, PTY_IOCTL_SETPGRP, &zero);\r
+               printf("\x1b[0m");\r
+       }\r
+       // Print a status message if termination was non-clean\r
+       if( status )\r
+       {\r
+               printf("[%i] exited %i\n", pid, status);\r
+       }\r
 }\r
 \r
 /**\r
@@ -299,27 +320,23 @@ void Command_Cd(int argc, char **argv)
  */\r
 void Command_Dir(int argc, char **argv)\r
 {\r
-        int    dp, fp, dirLen;\r
+        int    dp, fp;\r
        char    modeStr[11] = "RWXrwxRWX ";\r
-       char    tmpPath[1024];\r
-       char    *fileName;\r
+       char    fileName[256];\r
        t_sysFInfo      info;\r
        t_sysACL        acl;\r
        \r
+\r
+       // -- Generate and open directory --\r
        // Generate Directory Path\r
+       char    tmpPath[1024];\r
        if(argc > 1)\r
-               dirLen = GeneratePath(argv[1], gsCurrentDirectory, tmpPath);\r
+               GeneratePath(argv[1], gsCurrentDirectory, tmpPath);\r
        else\r
-       {\r
                strcpy(tmpPath, gsCurrentDirectory);\r
-       }\r
-       dirLen = strlen(tmpPath);\r
-       \r
        // Open Directory\r
        dp = _SysOpen(tmpPath, OPENFLAG_READ);\r
-       // Check if file opened\r
-       if(dp == -1)\r
-       {\r
+       if(dp == -1) {\r
                printf("Unable to open directory `%s', File cannot be found\n", tmpPath);\r
                return;\r
        }\r
@@ -338,15 +355,7 @@ void Command_Dir(int argc, char **argv)
                return;\r
        }\r
        \r
-       // Append Shash for file paths\r
-       if(tmpPath[dirLen-1] != '/')\r
-       {\r
-               tmpPath[dirLen++] = '/';\r
-               tmpPath[dirLen] = '\0';\r
-       }\r
-       \r
-       fileName = (char*)(tmpPath+dirLen);\r
-       // Read Directory Content\r
+       // -- Read Directory Contents --\r
        while( (fp = _SysReadDir(dp, fileName)) )\r
        {\r
                if(fp < 0)\r
@@ -356,7 +365,7 @@ void Command_Dir(int argc, char **argv)
                        break;\r
                }\r
                // Open File\r
-               fp = _SysOpen(tmpPath, 0);\r
+               fp = _SysOpenChild(dp, fileName, 0);\r
                if(fp == -1)    continue;\r
                // Get File Stats\r
                _SysFInfo(fp, &info, 0);\r

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