Skip to content

Commit

Permalink
Add search function to libtar
Browse files Browse the repository at this point in the history
 Function entryExists() can be called in order
 to check if an entry exists inside an archive.

Change-Id: Id3d13d20dfb74a1779dbd8ba6f0ab08c3ca46319
  • Loading branch information
n0d3 authored and Dees-Troy committed Mar 18, 2013
1 parent 7289a18 commit 3b51163
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 14 deletions.
2 changes: 2 additions & 0 deletions libtar/libtar.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
30 changes: 30 additions & 0 deletions libtar/wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
56 changes: 42 additions & 14 deletions twrpTar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 changes: 2 additions & 0 deletions twrpTar.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand Down

0 comments on commit 3b51163

Please sign in to comment.