From 3b51163329d24df073610499af4f540c2f0766ed Mon Sep 17 00:00:00 2001 From: n0d3 Date: Wed, 6 Mar 2013 21:14:15 +0200 Subject: Add search function to libtar Function entryExists() can be called in order to check if an entry exists inside an archive. Change-Id: Id3d13d20dfb74a1779dbd8ba6f0ab08c3ca46319 --- twrpTar.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 14 deletions(-) (limited to 'twrpTar.cpp') diff --git a/twrpTar.cpp b/twrpTar.cpp index dd6d5c37b..1ab1ab7d3 100644 --- a/twrpTar.cpp +++ b/twrpTar.cpp @@ -308,23 +308,34 @@ int twrpTar::extractTar() { 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 @@ int twrpTar::extractTGZ() { 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); } -- cgit v1.2.3