Add search function to libtar

 Function entryExists() can be called in order
 to check if an entry exists inside an archive.

Change-Id: Id3d13d20dfb74a1779dbd8ba6f0ab08c3ca46319
diff --git a/libtar/libtar.h b/libtar/libtar.h
index f2f423b..1d6c1df 100644
--- a/libtar/libtar.h
+++ b/libtar/libtar.h
@@ -291,6 +291,8 @@
 /* add a whole tree of files */
 int tar_append_tree(TAR *t, char *realdir, char *savedir);
 
+/* find an entry */
+int tar_find(TAR *t, char *searchstr);
 
 #ifdef __cplusplus
 }
diff --git a/libtar/wrapper.c b/libtar/wrapper.c
index 116dc28..7f65375 100644
--- a/libtar/wrapper.c
+++ b/libtar/wrapper.c
@@ -153,3 +153,33 @@
 
 	return 0;
 }
+
+
+int
+tar_find(TAR *t, char *searchstr)
+{
+	if (!searchstr)
+		return 0;
+
+	char *filename;
+	int i, entryfound = 0;
+#ifdef DEBUG
+	printf("==> tar_find(0x%lx, %s)\n", (long unsigned int)t, searchstr);
+#endif
+	while ((i = th_read(t)) == 0) {
+		filename = th_get_pathname(t);
+		if (fnmatch(searchstr, filename, FNM_FILE_NAME | FNM_PERIOD) == 0) {
+			entryfound++;
+#ifdef DEBUG
+			printf("Found matching entry: %s\n", filename);
+#endif
+			break;
+		}
+	}
+#ifdef DEBUG
+	if (!entryfound)
+		printf("No matching entry found.\n");
+#endif
+
+	return entryfound;
+}
diff --git a/twrpTar.cpp b/twrpTar.cpp
index dd6d5c3..1ab1ab7 100644
--- a/twrpTar.cpp
+++ b/twrpTar.cpp
@@ -308,23 +308,34 @@
 	return 0;
 }
 
+int twrpTar::getArchiveType() {
+        int type = 0;
+        string::size_type i = 0;
+        int firstbyte = 0, secondbyte = 0;
+	char header[3];
+        
+        ifstream f;
+        f.open(tarfn.c_str(), ios::in | ios::binary);
+        f.get(header, 3);
+        f.close();
+        firstbyte = header[i] & 0xff;
+        secondbyte = header[++i] & 0xff;
+
+        if (firstbyte == 0x1f && secondbyte == 0x8b)
+		type = 1; // Compressed
+	else
+		type = 0; // Uncompressed
+
+	return type;
+}
+
 int twrpTar::extract() {
-	int len = 3;
-	char header[len];
-	string::size_type i = 0;
-	int firstbyte = 0;
-	int secondbyte = 0;
-	int ret;
-	ifstream f;
-	f.open(tarfn.c_str(), ios::in | ios::binary);
-	f.get(header, len);
-	firstbyte = header[i] & 0xff;
-	secondbyte = header[++i] & 0xff;
-	f.close();
-	if (firstbyte == 0x1f && secondbyte == 0x8b) {
+	int Archive_Current_Type = getArchiveType();
+
+	if (Archive_Current_Type == 1) {
 		//if you return the extractTGZ function directly, stack crashes happen
 		LOGI("Extracting gzipped tar\n");
-		ret = extractTGZ();
+		int ret = extractTGZ();
 		return ret;
 	}
 	else {
@@ -580,6 +591,23 @@
 	return 0;
 }
 
+int twrpTar::entryExists(string entry) {
+	char* searchstr = (char*)entry.c_str();
+	int ret;
+
+	int Archive_Current_Type = getArchiveType();
+
+	if (openTar(Archive_Current_Type) == -1)
+		ret = 0;
+	else
+		ret = tar_find(t, searchstr);
+
+	if (tar_close(t) != 0)
+		LOGI("Unable to close tar file after searching for entry '%s'.\n", entry.c_str());
+
+	return ret;
+}
+
 extern "C" ssize_t write_tar(int fd, const void *buffer, size_t size) {
 	return (ssize_t) write_libtar_buffer(fd, buffer, size);
 }
diff --git a/twrpTar.hpp b/twrpTar.hpp
index 427e6d1..3ee6028 100644
--- a/twrpTar.hpp
+++ b/twrpTar.hpp
@@ -38,6 +38,7 @@
                 int addFilesToExistingTar(vector <string> files, string tarFile);
 		int createTar();
 		int addFile(string fn, bool include_root);
+		int entryExists(string entry);
 		int closeTar(bool gzip);
 		int createTarGZFork();
 		int createTarFork();
@@ -59,6 +60,7 @@
 		int has_data_media;
 		int Archive_File_Count;
 		unsigned long long Archive_Current_Size;
+		int getArchiveType(); // 1 for compressed - 0 for uncompressed
 		TAR *t;
 		FILE* p;
 		int fd;