]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
scriptlets: Decouple from pakfire and replace with context
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Oct 2023 12:00:53 +0000 (12:00 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 20 Oct 2023 12:00:53 +0000 (12:00 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/archive.c
src/libpakfire/build.c
src/libpakfire/db.c
src/libpakfire/include/pakfire/scriptlet.h
src/libpakfire/scriptlet.c
src/libpakfire/transaction.c

index 0b43c7119e65cf1657dd3371a437cfcb031f05fa..f6515e378a80962ec18d4cda2d1445c94f37c617 100644 (file)
@@ -331,7 +331,7 @@ static int pakfire_archive_parse_scriptlet(struct pakfire_archive* archive,
        }
 
        // Allocate a scriptlet
-       r = pakfire_scriptlet_create(&scriptlet, archive->pakfire, type, data, length);
+       r = pakfire_scriptlet_create(&scriptlet, archive->ctx, type, data, length);
        if (r)
                return r;
 
index c91163235152b3c13608eb53fcc8578476fdc44c..7f11747bdace4d99d264a333053be3349a2b3e18 100644 (file)
@@ -811,7 +811,7 @@ static int pakfire_build_package_add_scriptlet(struct pakfire_build* build,
                goto ERROR;
 
        // Create a scriptlet
-       r = pakfire_scriptlet_create(&scriptlet, build->pakfire, type, shell, 0);
+       r = pakfire_scriptlet_create(&scriptlet, build->ctx, type, shell, 0);
        if (r)
                goto ERROR;
 
index 8fd354e6b65bdb1fc16bf93eef05056173fb8475..1af9e6de55d4f56bd643252ad9316eecae04c87a 100644 (file)
@@ -1791,7 +1791,7 @@ struct pakfire_scriptlet* pakfire_db_get_scriptlet(struct pakfire_db* db,
                ssize_t size = sqlite3_column_bytes(stmt, 1);
 
                // Create a scriptlet object
-               r = pakfire_scriptlet_create(&scriptlet, db->pakfire, type, data, size);
+               r = pakfire_scriptlet_create(&scriptlet, db->ctx, type, data, size);
                if (r)
                        goto ERROR;
        }
index 6a083eba974206a1186277a7e63c37a4646e7c86..6c098a92657790f14faa1fab38292936cc21b02d 100644 (file)
 
 #ifdef PAKFIRE_PRIVATE
 
+#include <pakfire/ctx.h>
+#include <pakfire/pakfire.h>
 
 extern const char* pakfire_scriptlet_types[13];
 
 struct pakfire_scriptlet;
 
-int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet, struct pakfire* pakfire,
-       const char* type, const char* data, size_t size);
+int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet,
+       struct pakfire_ctx* ctx, const char* type, const char* data, size_t size);
 struct pakfire_scriptlet* pakfire_scriptlet_ref(struct pakfire_scriptlet* scriptlet);
 struct pakfire_scriptlet* pakfire_scriptlet_unref(struct pakfire_scriptlet* scriptlet);
 
 const char* pakfire_scriptlet_get_type(struct pakfire_scriptlet* scriptlet);
 const char* pakfire_scriptlet_get_data(struct pakfire_scriptlet* scriptlet, size_t* size);
 
-int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet);
+int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet, struct pakfire* pakfire);
 
-#endif
+#endif /* PAKFIRE_PRIVATE */
 
 #endif /* PAKFIRE_SCRIPTLET_H */
index e75dd6e555407e7614abffab5bf994d3a6105e89..a4f46fb34a18bfe4bee1d3c70ed9d3a81bb564ea 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 
+#include <pakfire/ctx.h>
 #include <pakfire/jail.h>
 #include <pakfire/logging.h>
+#include <pakfire/pakfire.h>
 #include <pakfire/scriptlet.h>
 #include <pakfire/string.h>
 #include <pakfire/util.h>
@@ -45,7 +47,7 @@ const char* pakfire_scriptlet_types[] = {
 };
 
 struct pakfire_scriptlet {
-       struct pakfire* pakfire;
+       struct pakfire_ctx* ctx;
        int nrefs;
 
        // Type
@@ -76,7 +78,7 @@ static int pakfire_scriptlet_set(struct pakfire_scriptlet* scriptlet, const char
        // Allocate space for data
        scriptlet->data = malloc(size);
        if (!scriptlet->data)
-               return 1;
+               return -errno;
 
        // Copy data
        memcpy(scriptlet->data, data, size);
@@ -88,43 +90,53 @@ static int pakfire_scriptlet_set(struct pakfire_scriptlet* scriptlet, const char
 static void pakfire_scriptlet_free(struct pakfire_scriptlet* scriptlet) {
        if (scriptlet->data)
                free(scriptlet->data);
-
-       pakfire_unref(scriptlet->pakfire);
+       if (scriptlet->ctx)
+               pakfire_ctx_unref(scriptlet->ctx);
        free(scriptlet);
 }
 
-int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet, struct pakfire* pakfire,
-               const char* type, const char* data, size_t size) {
-       if (!type || !data) {
-               errno = EINVAL;
-               return 1;
-       }
+int pakfire_scriptlet_create(struct pakfire_scriptlet** scriptlet,
+               struct pakfire_ctx* ctx, const char* type, const char* data, size_t size) {
+       int r;
+
+       // Check inputs
+       if (!type || !data)
+               return -EINVAL;
 
        // Do we know this type?
-       if (!pakfire_scriptlet_valid_type(type)) {
-               errno = ENOTSUP;
-               return 1;
-       }
+       if (!pakfire_scriptlet_valid_type(type))
+               return -ENOTSUP;
 
+       // Allocate some memory
        struct pakfire_scriptlet* s = calloc(1, sizeof(*s));
        if (!s)
-               return 1;
+               return -errno;
+
+       // Store reference to the context
+       s->ctx = pakfire_ctx_ref(ctx);
 
-       // Store reference to Pakfire
-       s->pakfire = pakfire_ref(pakfire);
+       // Initialize the reference counter
        s->nrefs = 1;
 
        // Set type
-       pakfire_string_set(s->type, type);
+       r = pakfire_string_set(s->type, type);
+       if (r)
+               goto ERROR;
 
-       int r = pakfire_scriptlet_set(s, data, size);
-       if (r) {
-               pakfire_scriptlet_free(s);
-               return 1;
-       }
+       // Store the payload
+       r = pakfire_scriptlet_set(s, data, size);
+       if (r)
+               goto ERROR;
 
+       // Return the pointer
        *scriptlet = s;
+
        return 0;
+
+ERROR:
+       pakfire_scriptlet_free(s);
+
+       return r;
 };
 
 struct pakfire_scriptlet* pakfire_scriptlet_ref(struct pakfire_scriptlet* scriptlet) {
@@ -166,13 +178,11 @@ static int pakfire_scriptlet_is_shell_script(struct pakfire_scriptlet* scriptlet
        return 0;
 }
 
-int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet) {
+int pakfire_scriptlet_execute(struct pakfire_scriptlet* scriptlet, struct pakfire* pakfire) {
        // Detect what kind of script this is and run it
        if (pakfire_scriptlet_is_shell_script(scriptlet))
-               return pakfire_jail_run_script(scriptlet->pakfire,
-                       scriptlet->data, scriptlet->size, NULL, 0);
+               return pakfire_jail_run_script(pakfire, scriptlet->data, scriptlet->size, NULL, 0);
 
-       ERROR(scriptlet->pakfire, "Scriptlet is of an unknown kind\n");
-       errno = ENOTSUP;
-       return 1;
+       CTX_ERROR(scriptlet->ctx, "Scriptlet is of an unknown kind\n");
+       return -ENOTSUP;
 }
index fcf1b3d66dab57a16252202f3f8810e270a9a473..2f22c2c60cd5f291f9decfaa7238e8537ace3e4f 100644 (file)
@@ -1271,7 +1271,7 @@ static int pakfire_transaction_run_script(struct pakfire_transaction* transactio
                return 0;
 
        // Execute the scriptlet
-       pakfire_scriptlet_execute(scriptlet);
+       pakfire_scriptlet_execute(scriptlet, transaction->pakfire);
 
        pakfire_scriptlet_unref(scriptlet);