+/**\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
+ int dp, fp, dirLen;\r
+ char modeStr[11] = "RWXrwxRWX ";\r
+ char tmpPath[1024];\r
+ char *fileName;\r
+ t_sysFInfo info;\r
+ t_sysACL acl;\r
+ \r
+ // Generate Directory Path\r
+ if(argc > 1)\r
+ dirLen = 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
+ printf("Unable to open directory `%s', File cannot be found\n", tmpPath);\r
+ return;\r
+ }\r
+ // Get File Stats\r
+ if( _SysFInfo(dp, &info, 0) == -1 )\r
+ {\r
+ _SysClose(dp);\r
+ printf("stat Failed, Bad File Descriptor\n");\r
+ return;\r
+ }\r
+ // Check if it's a directory\r
+ if(!(info.flags & FILEFLAG_DIRECTORY))\r
+ {\r
+ _SysClose(dp);\r
+ printf("Unable to open directory `%s', Not a directory\n", tmpPath);\r
+ 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
+ while( (fp = _SysReadDir(dp, fileName)) )\r
+ {\r
+ if(fp < 0)\r
+ {\r
+ if(fp == -3)\r
+ printf("Invalid Permissions to traverse directory\n");\r
+ break;\r
+ }\r
+ // Open File\r
+ fp = _SysOpen(tmpPath, 0);\r
+ if(fp == -1) continue;\r
+ // Get File Stats\r
+ _SysFInfo(fp, &info, 0);\r
+ \r
+ if(info.flags & FILEFLAG_DIRECTORY)\r
+ printf("d");\r
+ else\r
+ printf("-");\r
+ \r
+ // Print Mode\r
+ // - Owner\r
+ acl.object = 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.object = info.gid | 0x80000000;\r
+ _SysGetACL(fp, &acl);\r
+ if(acl.perms & 1) modeStr[3] = 'r'; else modeStr[3] = '-';\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.object = 0xFFFFFFFF;\r
+ _SysGetACL(fp, &acl);\r
+ if(acl.perms & 1) modeStr[6] = 'r'; else modeStr[6] = '-';\r
+ if(acl.perms & 2) modeStr[7] = 'w'; else modeStr[7] = '-';\r
+ if(acl.perms & 8) modeStr[8] = 'x'; else modeStr[8] = '-';\r
+ printf(modeStr);\r
+ _SysClose(fp);\r
+ \r
+ // Colour Code\r
+ if(info.flags & FILEFLAG_DIRECTORY) // Directory: Green\r
+ printf("\x1B[32m");\r
+ // Default: White\r
+ \r
+ // Print Name\r
+ printf("%s", fileName);\r
+ \r
+ // Print slash if applicable\r
+ if(info.flags & FILEFLAG_DIRECTORY)\r
+ printf("/");\r
+ \r
+ // Revert Colour\r
+ printf("\x1B[37m");\r
+ \r
+ // Newline!\r
+ printf("\n");\r
+ }\r
+ // Close Directory\r
+ _SysClose(dp);\r
+}\r