From: Michael Tremer Date: Fri, 20 Oct 2023 12:00:53 +0000 (+0000) Subject: scriptlets: Decouple from pakfire and replace with context X-Git-Tag: 0.9.30~1417 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0fb64a58df1cd25a708c87bd06aa9d3db3df477c;p=pakfire.git scriptlets: Decouple from pakfire and replace with context Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 0b43c7119..f6515e378 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -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; diff --git a/src/libpakfire/build.c b/src/libpakfire/build.c index c91163235..7f11747bd 100644 --- a/src/libpakfire/build.c +++ b/src/libpakfire/build.c @@ -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; diff --git a/src/libpakfire/db.c b/src/libpakfire/db.c index 8fd354e6b..1af9e6de5 100644 --- a/src/libpakfire/db.c +++ b/src/libpakfire/db.c @@ -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; } diff --git a/src/libpakfire/include/pakfire/scriptlet.h b/src/libpakfire/include/pakfire/scriptlet.h index 6a083eba9..6c098a926 100644 --- a/src/libpakfire/include/pakfire/scriptlet.h +++ b/src/libpakfire/include/pakfire/scriptlet.h @@ -25,21 +25,23 @@ #ifdef PAKFIRE_PRIVATE +#include +#include 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 */ diff --git a/src/libpakfire/scriptlet.c b/src/libpakfire/scriptlet.c index e75dd6e55..a4f46fb34 100644 --- a/src/libpakfire/scriptlet.c +++ b/src/libpakfire/scriptlet.c @@ -22,8 +22,10 @@ #include #include +#include #include #include +#include #include #include #include @@ -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; } diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index fcf1b3d66..2f22c2c60 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -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);