]> git.ipfire.org Git - pakfire.git/commitdiff
archive: Choose sensible prefixes when extracting source packages
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 29 Apr 2021 11:40:38 +0000 (11:40 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 29 Apr 2021 11:40:38 +0000 (11:40 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/archive.c
src/libpakfire/archive.c
src/libpakfire/include/pakfire/archive.h
src/libpakfire/libpakfire.sym

index c10d4117d8303783cf99425c3771c7d7b939ff06..bc0bd21a0fabac5bfdc4d1fa5a05716b5e9901ca 100644 (file)
@@ -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;
index 55b10222fef75d22f56d572136310229c44a7e9f..70fe71e69c6c02ed4af25705b46e2424700ff1da 100644 (file)
@@ -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,
        };
index e446a7e284a42f5f3858b23616cc1a3d8c73bb9f..bb6d041d7146e25460ee82e7da1660591cf600a4 100644 (file)
@@ -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);
 
index f4fcf94c68f0bca1c2a6c70696a7a72cd60fa265..2fa73d5cc4ac6ba2b25dda07bda475e7cfe76e36 100644 (file)
@@ -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;