update to install all pkgs inside compress file
This commit is contained in:
+34
-20
@@ -729,19 +729,26 @@ namespace Actions
|
||||
ArchiveEntry *entry = ZipUtil::GetPackageEntry(it->path, true);
|
||||
if (entry != nullptr)
|
||||
{
|
||||
ArchivePkgInstallData *install_data = (ArchivePkgInstallData*) malloc(sizeof(ArchivePkgInstallData));
|
||||
memset(install_data, 0, sizeof(ArchivePkgInstallData));
|
||||
while (entry != nullptr)
|
||||
{
|
||||
ArchivePkgInstallData *install_data = (ArchivePkgInstallData*) malloc(sizeof(ArchivePkgInstallData));
|
||||
memset(install_data, 0, sizeof(ArchivePkgInstallData));
|
||||
|
||||
std::string install_pkg_path = std::string(temp_folder) + "/" + entry->filename;
|
||||
SplitFile *sp = new SplitFile(install_pkg_path, INSTALL_ARCHIVE_PKG_SPLIT_SIZE);
|
||||
|
||||
install_data->archive_entry = entry;
|
||||
install_data->split_file = sp;
|
||||
install_data->stop_write_thread = false;
|
||||
std::string install_pkg_path = std::string(temp_folder) + "/" + entry->filename;
|
||||
SplitFile *sp = new SplitFile(install_pkg_path, INSTALL_ARCHIVE_PKG_SPLIT_SIZE);
|
||||
|
||||
install_data->archive_entry = entry;
|
||||
install_data->split_file = sp;
|
||||
install_data->stop_write_thread = false;
|
||||
|
||||
int res = pthread_create(&install_data->thread, NULL, ExtractArchivePkg, install_data);
|
||||
int res = pthread_create(&install_data->thread, NULL, ExtractArchivePkg, install_data);
|
||||
|
||||
INSTALLER::InstallArchivePkg(entry->filename, install_data);
|
||||
INSTALLER::InstallArchivePkg(entry->filename, install_data);
|
||||
|
||||
ArchiveEntry *previos = entry;
|
||||
entry = ZipUtil::GetNextPackageEntry(entry);
|
||||
free(previos);
|
||||
}
|
||||
success++;
|
||||
}
|
||||
else
|
||||
@@ -871,19 +878,26 @@ namespace Actions
|
||||
ArchiveEntry *entry = ZipUtil::GetPackageEntry(it->path);
|
||||
if (entry != nullptr)
|
||||
{
|
||||
ArchivePkgInstallData *install_data = (ArchivePkgInstallData*) malloc(sizeof(ArchivePkgInstallData));
|
||||
memset(install_data, 0, sizeof(ArchivePkgInstallData));
|
||||
while (entry != nullptr)
|
||||
{
|
||||
ArchivePkgInstallData *install_data = (ArchivePkgInstallData*) malloc(sizeof(ArchivePkgInstallData));
|
||||
memset(install_data, 0, sizeof(ArchivePkgInstallData));
|
||||
|
||||
std::string install_pkg_path = std::string(temp_folder) + "/" + entry->filename;
|
||||
SplitFile *sp = new SplitFile(install_pkg_path, INSTALL_ARCHIVE_PKG_SPLIT_SIZE);
|
||||
|
||||
install_data->archive_entry = entry;
|
||||
install_data->split_file = sp;
|
||||
install_data->stop_write_thread = false;
|
||||
std::string install_pkg_path = std::string(temp_folder) + "/" + entry->filename;
|
||||
SplitFile *sp = new SplitFile(install_pkg_path, INSTALL_ARCHIVE_PKG_SPLIT_SIZE);
|
||||
|
||||
install_data->archive_entry = entry;
|
||||
install_data->split_file = sp;
|
||||
install_data->stop_write_thread = false;
|
||||
|
||||
int res = pthread_create(&install_data->thread, NULL, ExtractArchivePkg, install_data);
|
||||
int res = pthread_create(&install_data->thread, NULL, ExtractArchivePkg, install_data);
|
||||
|
||||
INSTALLER::InstallArchivePkg(entry->filename, install_data);
|
||||
INSTALLER::InstallArchivePkg(entry->filename, install_data);
|
||||
|
||||
ArchiveEntry *previous = entry;
|
||||
entry = ZipUtil::GetNextPackageEntry(entry);
|
||||
free(previous);
|
||||
}
|
||||
success++;
|
||||
}
|
||||
else
|
||||
|
||||
@@ -855,7 +855,6 @@ namespace INSTALLER
|
||||
pkg_data->stop_write_thread = true;
|
||||
pthread_join(pkg_data->thread, NULL);
|
||||
delete(pkg_data->split_file);
|
||||
free(pkg_data->archive_entry);
|
||||
free(pkg_data);
|
||||
RemoveArchivePkgInstallData(hash);
|
||||
return ret;
|
||||
|
||||
+77
-1
@@ -613,7 +613,83 @@ namespace ZipUtil
|
||||
if (ret == ARCHIVE_EOF)
|
||||
break;
|
||||
|
||||
char *p, *q;
|
||||
if ((pathname = pathdup(archive_entry_pathname(e))) == NULL)
|
||||
{
|
||||
archive_read_data_skip(a);
|
||||
continue;
|
||||
}
|
||||
|
||||
filetype = archive_entry_filetype(e);
|
||||
|
||||
/* sanity checks */
|
||||
if (pathname[0] == '/' ||
|
||||
strncmp(pathname, "../", 3) == 0 ||
|
||||
strstr(pathname, "/../") != NULL)
|
||||
{
|
||||
archive_read_data_skip(a);
|
||||
free(pathname);
|
||||
continue;
|
||||
;
|
||||
}
|
||||
|
||||
/* I don't think this can happen in a zipfile.. */
|
||||
if (!S_ISREG(filetype))
|
||||
{
|
||||
archive_read_data_skip(a);
|
||||
free(pathname);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Util::EndsWith(Util::ToLower(pathname), ".pkg"))
|
||||
{
|
||||
pkg_entry = (ArchiveEntry *)malloc(sizeof(ArchiveEntry));
|
||||
memset(pkg_entry, 0, sizeof(ArchiveEntry));
|
||||
|
||||
pkg_entry->archive = a;
|
||||
pkg_entry->entry = e;
|
||||
pkg_entry->client_data = client_data;
|
||||
pkg_entry->filename = pathname;
|
||||
pkg_entry->filesize = archive_entry_size(e);
|
||||
|
||||
free(pathname);
|
||||
return pkg_entry;
|
||||
}
|
||||
|
||||
free(pathname);
|
||||
}
|
||||
|
||||
archive_read_free(a);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ArchiveEntry *GetNextPackageEntry(ArchiveEntry *archive_entry)
|
||||
{
|
||||
struct archive *a = archive_entry->archive;
|
||||
struct archive_entry *e = nullptr;
|
||||
RemoteArchiveData *client_data = archive_entry->client_data;
|
||||
char *pathname;
|
||||
mode_t filetype;
|
||||
ArchiveEntry *pkg_entry = nullptr;
|
||||
int ret;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
ret = archive_read_next_header(a, &e);
|
||||
|
||||
if (ret < ARCHIVE_OK)
|
||||
{
|
||||
sprintf(status_message, "%s", "archive_read_next_header failed");
|
||||
if (client_data != nullptr)
|
||||
{
|
||||
free(client_data);
|
||||
}
|
||||
archive_read_free(a);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (ret == ARCHIVE_EOF)
|
||||
break;
|
||||
|
||||
if ((pathname = pathdup(archive_entry_pathname(e))) == NULL)
|
||||
{
|
||||
|
||||
@@ -51,5 +51,6 @@ namespace ZipUtil
|
||||
int ZipAddPath(zipFile zf, const std::string &path, int filename_start, int level);
|
||||
int Extract(const DirEntry &file, const std::string &dir, bool is_remote = false);
|
||||
ArchiveEntry *GetPackageEntry(const std::string &zip_file, bool is_remote = false);
|
||||
ArchiveEntry *GetNextPackageEntry(ArchiveEntry *archive_entry);
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user