From: Michael Tremer Date: Thu, 29 Apr 2021 11:40:38 +0000 (+0000) Subject: archive: Choose sensible prefixes when extracting source packages X-Git-Tag: 0.9.28~1285^2~192 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5fa990f7737cf532a2b94246986cad276c1737b;p=pakfire.git archive: Choose sensible prefixes when extracting source packages Signed-off-by: Michael Tremer --- diff --git a/src/_pakfire/archive.c b/src/_pakfire/archive.c index c10d4117d..bc0bd21a0 100644 --- a/src/_pakfire/archive.c +++ b/src/_pakfire/archive.c @@ -122,19 +122,13 @@ static PyObject* Archive_get_signatures(ArchiveObject* self) { } static PyObject* Archive_extract(ArchiveObject* self, PyObject* args) { - const char* target = NULL; + const char* prefix = NULL; - if (!PyArg_ParseTuple(args, "|z", &target)) + if (!PyArg_ParseTuple(args, "|z", &prefix)) return NULL; - // Make extraction path - char* prefix = pakfire_archive_extraction_path(self->archive, target); - // Extract payload int r = pakfire_archive_extract(self->archive, prefix); - free(prefix); - - // Throw an exception on error if (r) { PyErr_SetFromErrno(PyExc_OSError); return NULL; diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 55b10222f..70fe71e69 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -773,34 +773,39 @@ ERROR: return r; } -PAKFIRE_EXPORT char* pakfire_archive_extraction_path(PakfireArchive archive, const char* target) { - char prefix[PATH_MAX]; +static int pakfire_archive_extraction_path(PakfireArchive archive, + char* path, size_t length, const char* prefix) { + char buffer[PATH_MAX]; PakfirePackage pkg = pakfire_archive_get_package(archive); if (!pkg) - return NULL; + return 1; - // Use a good default for source packages - if (pakfire_package_is_source(pkg) && !target) - target = "/usr/src/packages"; + // Use a good default when no prefix is set + if (pakfire_package_is_source(pkg)) { + if (!prefix) + prefix = "/usr/src/packages"; - const char* nevra = pakfire_package_get_nevra(pkg); + pakfire_string_format(buffer, "%s/%s", prefix, pakfire_package_get_nevra(pkg)); + } else { + if (!prefix) + prefix = "/"; + + pakfire_string_set(buffer, prefix); + } - // Append package name and version to path - int r = pakfire_path_join(prefix, target, nevra); + // Always prepend the root path + __pakfire_make_path(archive->pakfire, path, length, buffer); // Cleanup pakfire_package_unref(pkg); - if (r < 0) - return NULL; - - return strdup(prefix); + return 0; } struct pakfire_archive_extractor { struct archive* writer; - const char* prefix; + const char* path; PakfireFilelist filelist; struct pakfire_progressbar* progressbar; }; @@ -877,8 +882,8 @@ static int pakfire_archive_extract_entry(PakfireArchive archive, DEBUG(archive->pakfire, "Extracting /%s\n", path); // Prepend the prefix - if (extractor->prefix) { - r = pakfire_path_join(buffer, extractor->prefix, path); + if (extractor->path && *extractor->path) { + r = pakfire_path_join(buffer, extractor->path, path); if (r < 0) goto ERROR; @@ -887,7 +892,7 @@ static int pakfire_archive_extract_entry(PakfireArchive archive, // Update hardlink destination const char* link = archive_entry_hardlink(entry); if (link) { - r = pakfire_path_join(buffer, extractor->prefix, link); + r = pakfire_path_join(buffer, extractor->path, link); if (r < 0) goto ERROR; @@ -924,17 +929,17 @@ ERROR: PAKFIRE_EXPORT int pakfire_archive_extract(PakfireArchive archive, const char* prefix) { struct pakfire_progressbar* progressbar = NULL; + char path[PATH_MAX]; struct archive* a = NULL; struct archive* payload = NULL; struct archive* writer = NULL; size_t size; - int r; - // Use default path if nothing is set - if (!prefix) - prefix = pakfire_get_path(archive->pakfire); + int r = pakfire_archive_extraction_path(archive, path, sizeof(path) - 1, prefix); + if (r) + goto ERROR; - DEBUG(archive->pakfire, "Extracting %s to %s\n", archive->path, prefix); + DEBUG(archive->pakfire, "Extracting %s to %s\n", archive->path, path); // Create a filelist if (!archive->filelist) { @@ -965,7 +970,7 @@ PAKFIRE_EXPORT int pakfire_archive_extract(PakfireArchive archive, const char* p struct pakfire_archive_extractor extractor = { .writer = writer, - .prefix = prefix, + .path = path, .filelist = archive->filelist, .progressbar = progressbar, }; diff --git a/src/libpakfire/include/pakfire/archive.h b/src/libpakfire/include/pakfire/archive.h index e446a7e28..bb6d041d7 100644 --- a/src/libpakfire/include/pakfire/archive.h +++ b/src/libpakfire/include/pakfire/archive.h @@ -46,7 +46,6 @@ char* pakfire_archive_get(PakfireArchive archive, const char* namespace, const c int pakfire_archive_read(PakfireArchive archive, const char* filename, char** data, size_t* data_size); int pakfire_archive_extract(PakfireArchive archive, const char* prefix); -char* pakfire_archive_extraction_path(PakfireArchive archive, const char* target); const char* pakfire_archive_get_path(PakfireArchive archive); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index f4fcf94c6..2fa73d5cc 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -60,7 +60,6 @@ global: # archive pakfire_archive_count_signatures; pakfire_archive_extract; - pakfire_archive_extraction_path; pakfire_archive_get; pakfire_archive_get_filelist; pakfire_archive_get_format;