file manager updates for exFAT

Change-Id: I06fa6120a975cbc3d4eef9bc2ca034ec716740ee
diff --git a/gui/fileselector.cpp b/gui/fileselector.cpp
index aecdd25..38eaadd 100644
--- a/gui/fileselector.cpp
+++ b/gui/fileselector.cpp
@@ -31,6 +31,7 @@
 #include "rapidxml.hpp"
 #include "objects.hpp"
 #include "../data.hpp"
+#include "../twrp-functions.hpp"
 
 #define TW_FILESELECTOR_UP_A_LEVEL "(Up A Level)"
 
@@ -787,9 +788,12 @@
 			continue;
 		if (data.fileName == ".." && folder == "/")
 			continue;
-		if (data.fileName == "..")
+		if (data.fileName == "..") {
 			data.fileName = TW_FILESELECTOR_UP_A_LEVEL;
-		data.fileType = de->d_type;
+			data.fileType = DT_DIR;
+		} else {
+			data.fileType = de->d_type;
+		}
 
 		std::string path = folder + "/" + data.fileName;
 		stat(path.c_str(), &st);
@@ -801,6 +805,9 @@
 		data.lastModified = st.st_mtime;
 		data.lastStatChange = st.st_ctime;
 
+		if (data.fileType == DT_UNKNOWN) {
+			data.fileType = TWFunc::Get_D_Type_From_Stat(path);
+		}
 		if (data.fileType == DT_DIR)
 		{
 			if (mShowNavFolders || (data.fileName != "." && data.fileName != TW_FILESELECTOR_UP_A_LEVEL))
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index edf4898..5473c8d 100644
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -453,3 +453,24 @@
 	dstfile.close();
 	return 0;
 }
+
+unsigned int TWFunc::Get_D_Type_From_Stat(string Path) {
+	struct stat st;
+
+	stat(Path.c_str(), &st);
+	if (st.st_mode & S_IFDIR)
+		return DT_DIR;
+	else if (st.st_mode & S_IFBLK)
+		return DT_BLK;
+	else if (st.st_mode & S_IFCHR)
+		return DT_CHR;
+	else if (st.st_mode & S_IFIFO)
+		return DT_FIFO;
+	else if (st.st_mode & S_IFLNK)
+		return DT_LNK;
+	else if (st.st_mode & S_IFREG)
+		return DT_REG;
+	else if (st.st_mode & S_IFSOCK)
+		return DT_SOCK;
+	return DT_UNKNOWN;
+}
\ No newline at end of file
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index 7cef37f..8cd3445 100644
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -39,6 +39,7 @@
 	static int Exec_Cmd(string cmd, string &result); //execute a command and return the result as a string by reference
 	static int removeDir(const string path, bool removeParent); //recursively remove a directory
 	static int copy_file(string src, string dst, int mode); //copy file from src to dst with mode permissions
+	static unsigned int Get_D_Type_From_Stat(string Path);                      // Returns a dirent dt_type value using stat instead of dirent
 
 private:
 	static void check_and_fclose(FILE *fp, const char *name);