Add search function to libtar

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

Change-Id: Id3d13d20dfb74a1779dbd8ba6f0ab08c3ca46319
This commit is contained in:
n0d3
2013-03-06 21:14:15 +02:00
committed by Dees_Troy
parent 7289a181d8
commit 3b51163329
4 changed files with 76 additions and 14 deletions
+2
View File
@@ -291,6 +291,8 @@ int tar_extract_all(TAR *t, char *prefix);
/* 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
}
+30
View File
@@ -153,3 +153,33 @@ tar_append_tree(TAR *t, char *realdir, char *savedir)
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;
}
+42 -14
View File
@@ -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);
}
+2
View File
@@ -38,6 +38,7 @@ class twrpTar {
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 @@ class twrpTar {
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;