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:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user