diff options
author | midipix <writeonce@midipix.org> | 2025-05-31 22:43:06 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2025-05-31 22:43:06 +0000 |
commit | d3b5266a2df3a52b0bd36f1de86736fd353a5c4e (patch) | |
tree | e12efde91be9b8deff4833944e948db75c132ead | |
parent | 6c5659bb5b977671760778f4fca719a19801732c (diff) | |
download | perk-d3b5266a2df3a52b0bd36f1de86736fd353a5c4e.tar.bz2 perk-d3b5266a2df3a52b0bd36f1de86736fd353a5c4e.tar.xz |
pe_lib_get_unit_ctx(): return a read-only parsed object vector to the caller.
-rw-r--r-- | src/driver/pe_unit_ctx.c | 12 | ||||
-rw-r--r-- | src/internal/perk_driver_impl.h | 1 |
2 files changed, 12 insertions, 1 deletions
diff --git a/src/driver/pe_unit_ctx.c b/src/driver/pe_unit_ctx.c index deb9b95..b165226 100644 --- a/src/driver/pe_unit_ctx.c +++ b/src/driver/pe_unit_ctx.c @@ -26,6 +26,7 @@ static int pe_lib_free_unit_ctx_impl(struct pe_unit_ctx_impl * ctx, int ret) pe_ar_free_archive_meta(ctx->armeta); pe_meta_free_image_meta(ctx->meta); pe_raw_unmap_raw_image(&ctx->map); + free(ctx->usrobjmeta); free(ctx->objmeta); free(ctx); } @@ -45,6 +46,7 @@ static int pe_lib_create_object_vector_or_verify_archive( bool fpurearch; struct pe_image_meta * meta; struct pe_image_meta ** objmeta; + const struct pe_image_meta ** usrobjmeta; size_t veclen; struct pe_raw_image map; struct ar_meta_member_info ** pmember; @@ -67,10 +69,16 @@ static int pe_lib_create_object_vector_or_verify_archive( if (fvector && !(ctx->objmeta = calloc(veclen,sizeof(meta)))) return PERK_BUFFER_ERROR(dctx); + if (fvector && !(ctx->usrobjmeta = calloc(veclen,sizeof(*usrobjmeta)))) + return PERK_BUFFER_ERROR(dctx); + if (!actx->a_memberv) return 0; - for (pmember=actx->a_memberv,objmeta=ctx->objmeta; *pmember; pmember++) { + objmeta = ctx->objmeta; + usrobjmeta = ctx->usrobjmeta; + + for (pmember=actx->a_memberv; *pmember; pmember++) { errinfp = idctx->errinfp; switch (pmember[0]->ar_member_attr) { @@ -100,6 +108,7 @@ static int pe_lib_create_object_vector_or_verify_archive( if (fvector) { *objmeta++ = meta; + *usrobjmeta++ = meta; } else { pe_meta_free_image_meta(meta); }; @@ -178,6 +187,7 @@ int pe_lib_get_unit_ctx( ctx->uctx.path = &ctx->path; ctx->uctx.meta = ctx->meta; ctx->uctx.armeta = ctx->armeta; + ctx->uctx.objmeta = ctx->usrobjmeta; *pctx = &ctx->uctx; return 0; diff --git a/src/internal/perk_driver_impl.h b/src/internal/perk_driver_impl.h index d3aa30d..99c68be 100644 --- a/src/internal/perk_driver_impl.h +++ b/src/internal/perk_driver_impl.h @@ -51,6 +51,7 @@ struct pe_unit_ctx_impl { struct pe_raw_archive armap; struct pe_archive_meta * armeta; struct pe_image_meta ** objmeta; + const struct pe_image_meta**usrobjmeta; struct pe_unit_ctx uctx; }; |