Added "Free Me" Flag to VFS_ReadDir
[tpg/acess2.git] / Usermode / Applications / CLIShell_src / main.c
index cb76be1..aa1d9ab 100644 (file)
@@ -1,9 +1,9 @@
 /*\r
- AcessOS Shell Version 2\r
-- Based on IOOS CLI Shell\r
-*/\r
+ * AcessOS Shell Version 3\r
+ */\r
 #include <acess/sys.h>\r
 #include <stdlib.h>\r
+#include <stdio.h>\r
 #include "header.h"\r
 \r
 #define _stdin 0\r
@@ -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
@@ -50,9 +50,19 @@ int main(int argc, char *argv[], char *envp[])
        \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, 30, " Based on CLI Shell for IOOS\n");\r
+       write(_stdout, 22, "Acess Shell Version 3\n");\r
        write(_stdout,  2, "\n");\r
        for(;;)\r
        {\r
@@ -60,6 +70,7 @@ int main(int argc, char *argv[], char *envp[])
                if(saArgs[0])   free(saArgs);\r
                if(!bCached)    free(sCommandStr);\r
                bCached = 0;\r
+               write(_stdout, 1, "\n");\r
                write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory);\r
                write(_stdout, 3, "$ ");\r
                \r
@@ -325,6 +336,8 @@ 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
 \r
@@ -333,10 +346,11 @@ void Command_Cd(int argc, char **argv)
 void Command_Dir(int argc, char **argv)\r
 {\r
         int    dp, fp, dirLen;\r
-       //char  modeStr[11] = "RWXrwxRWX ";\r
+       char    modeStr[11] = "RWXrwxRWX ";\r
        char    tmpPath[1024];\r
-       char    fileName[256];\r
+       char    *fileName;\r
        t_sysFInfo      info;\r
+       t_sysACL        acl;\r
        \r
        // Generate Directory Path\r
        if(argc > 1)\r
@@ -353,9 +367,9 @@ void Command_Dir(int argc, char **argv)
        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
+               write(_stdout, 27, "Unable to open directory `");\r
+               write(_stdout, strlen(tmpPath)+1, tmpPath);\r
+               write(_stdout, 25, "', File cannot be found\n");\r
                return;\r
        }\r
        // Get File Stats\r
@@ -381,6 +395,8 @@ void Command_Dir(int argc, char **argv)
                tmpPath[dirLen++] = '/';\r
                tmpPath[dirLen] = '\0';\r
        }\r
+       \r
+       fileName = (char*)(tmpPath+dirLen);\r
        // Read Directory Content\r
        while( (fp = readdir(dp, fileName)) )\r
        {\r
@@ -390,43 +406,53 @@ void Command_Dir(int argc, char **argv)
                                write(_stdout, 42, "Invalid Permissions to traverse directory\n");\r
                        break;\r
                }\r
-               // Create File Path\r
-               strcpy((char*)(tmpPath+dirLen), fileName);\r
                // Open File\r
                fp = open(tmpPath, 0);\r
                if(fp == -1)    continue;\r
                // Get File Stats\r
                finfo(fp, &info, 0);\r
+               \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
+               if(acl.perms & 2)       modeStr[1] = 'w';       else    modeStr[1] = '-';\r
+               if(acl.perms & 8)       modeStr[2] = 'x';       else    modeStr[2] = '-';\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
+               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
+               write(_stdout, 10, modeStr);\r
                close(fp);\r
                \r
                // Colour Code\r
-               write(_stdout, 6, "\x1B[37m");  //White\r
-               if(info.flags & FILEFLAG_DIRECTORY)     //Directory Green\r
+               if(info.flags & FILEFLAG_DIRECTORY)     // Directory: Green\r
                        write(_stdout, 6, "\x1B[32m");\r
+               // Default: White\r
                \r
-               //Print Mode\r
-               #if 0\r
-               if(stats.st_mode & 0400)        modeStr[0] = 'R';       else    modeStr[0] = '-';\r
-               if(stats.st_mode & 0200)        modeStr[1] = 'W';       else    modeStr[1] = '-';\r
-               if(stats.st_mode & 0100)        modeStr[2] = 'X';       else    modeStr[2] = '-';\r
-               if(stats.st_mode & 0040)        modeStr[3] = 'R';       else    modeStr[3] = '-';\r
-               if(stats.st_mode & 0020)        modeStr[4] = 'W';       else    modeStr[4] = '-';\r
-               if(stats.st_mode & 0010)        modeStr[5] = 'X';       else    modeStr[5] = '-';\r
-               if(stats.st_mode & 0004)        modeStr[6] = 'R';       else    modeStr[6] = '-';\r
-               if(stats.st_mode & 0002)        modeStr[7] = 'W';       else    modeStr[7] = '-';\r
-               if(stats.st_mode & 0001)        modeStr[8] = 'X';       else    modeStr[8] = '-';\r
-               write(_stdout, 10, modeStr);\r
-               #endif\r
-               \r
-               //Print Name\r
+               // Print Name\r
                write(_stdout, strlen(fileName), fileName);\r
-               //Print slash if applicable\r
+               \r
+               // Print slash if applicable\r
                if(info.flags & FILEFLAG_DIRECTORY)\r
                        write(_stdout, 1, "/");\r
                \r
-               // Revert Colout and end line\r
+               // Revert Colour\r
                write(_stdout, 6, "\x1B[37m");\r
-               write(_stdout, 2, "\n");\r
+               \r
+               // Newline!\r
+               write(_stdout, 1, "\n");\r
        }\r
        // Close Directory\r
        close(dp);\r

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