diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/database.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/database.c b/src/database.c index 65f8633..7c89dd3 100644 --- a/src/database.c +++ b/src/database.c @@ -37,6 +37,7 @@ struct install_ctx { struct apk_package *pkg; int script; + int script_pending : 1; struct apk_db_dir_instance *diri; struct apk_checksum data_csum; struct apk_sign_ctx sctx; @@ -1233,6 +1234,24 @@ static void extract_cb(void *_ctx, size_t progress) } } +static int apk_db_run_pending_script(struct install_ctx *ctx) +{ + int r; + + if (!ctx->script_pending) + return 0; + if (!ctx->sctx.control_verified) + return 0; + + ctx->script_pending = FALSE; + r = apk_pkg_run_script(ctx->pkg, ctx->db->root_fd, ctx->script); + if (r != 0) + apk_error("%s-%s: Failed to execute " + "pre-install/upgrade script", + ctx->pkg->name->name, ctx->pkg->version); + return r; +} + static int apk_db_install_archive_entry(void *_ctx, const struct apk_file_info *ae, struct apk_istream *is) @@ -1275,16 +1294,15 @@ static int apk_db_install_archive_entry(void *_ctx, /* Handle script */ if (type != APK_SCRIPT_INVALID) { apk_pkg_add_script(pkg, is, type, ae->size); + if (type == ctx->script) + ctx->script_pending = TRUE; + return apk_db_run_pending_script(ctx); + } - if (type == ctx->script) { - r = apk_pkg_run_script(pkg, db->root_fd, ctx->script); - if (r != 0) - apk_error("%s-%s: Failed to execute pre-install/upgrade script", - pkg->name->name, pkg->version); - } - + r = apk_db_run_pending_script(ctx); + if (r != 0) return r; - } + /* Show progress */ if (ctx->cb) { @@ -1501,6 +1519,9 @@ static int apk_db_unpack_pkg(struct apk_database *db, newpkg->name->name, newpkg->version); return -1; } + r = apk_db_run_pending_script(&ctx); + if (r != 0) + return r; if (need_copy) { char file2[256]; |