Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b511633 authored by n0d3's avatar n0d3 Committed by Dees_Troy
Browse files

Add search function to libtar

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

Change-Id: Id3d13d20dfb74a1779dbd8ba6f0ab08c3ca46319
parent 7289a181
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
@@ -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
Original line number Diff line number Diff line
@@ -308,23 +308,34 @@ int twrpTar::extractTar() {
	return 0;
}

int twrpTar::extract() {
	int len = 3;
	char header[len];
int twrpTar::getArchiveType() {
        int type = 0;
        string::size_type i = 0;
	int firstbyte = 0;
	int secondbyte = 0;
	int ret;
        int firstbyte = 0, secondbyte = 0;
	char header[3];
        
        ifstream f;
        f.open(tarfn.c_str(), ios::in | ios::binary);
	f.get(header, len);
        f.get(header, 3);
        f.close();
        firstbyte = header[i] & 0xff;
        secondbyte = header[++i] & 0xff;
	f.close();
	if (firstbyte == 0x1f && secondbyte == 0x8b) {

        if (firstbyte == 0x1f && secondbyte == 0x8b)
		type = 1; // Compressed
	else
		type = 0; // Uncompressed

	return type;
}

int twrpTar::extract() {
	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 −0
Original line number Diff line number Diff line
@@ -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;