From 81e8b3a78b680143e315b4380d794a25fefc9e32 Mon Sep 17 00:00:00 2001 From: midipix Date: Sun, 22 Nov 2015 23:07:39 -0500 Subject: driver integration 8/9: driver code: initial implementation. --- src/driver/pe_unit_ctx.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/driver/pe_unit_ctx.c (limited to 'src/driver/pe_unit_ctx.c') diff --git a/src/driver/pe_unit_ctx.c b/src/driver/pe_unit_ctx.c new file mode 100644 index 0000000..5bcac3d --- /dev/null +++ b/src/driver/pe_unit_ctx.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include + +static int pe_free_unit_ctx_impl(struct pe_unit_ctx * ctx, int status) +{ + if (ctx) { + pe_free_image_meta(ctx->meta); + pe_unmap_raw_image(&ctx->map); + free(ctx); + } + + return status; +} + +int pe_get_unit_ctx( + struct pe_driver_ctx * dctx, + const char * path, + struct pe_unit_ctx ** pctx) +{ + struct pe_unit_ctx * ctx; + int prot; + + if (!dctx || !(ctx = calloc(sizeof(*ctx),1))) + return -1; + + prot = (dctx->cctx.actflags & PERK_ACTION_FLAG_MAP_READWRITE) + ? PROT_READ | PROT_WRITE + : PROT_READ; + + if (pe_map_raw_image(dctx->cctx.fdin,path,prot,&ctx->map)) + return pe_free_unit_ctx_impl(ctx,-1); + + if (pe_get_image_meta(&ctx->map,&ctx->meta)) + return pe_free_unit_ctx_impl(ctx,-1); + + memcpy(&ctx->cctx,&dctx->cctx, + sizeof(ctx->cctx)); + + ctx->path = path; + ctx->cctx.prot = prot; + + *pctx = ctx; + return 0; +} + +void pe_free_unit_ctx(struct pe_unit_ctx * ctx) +{ + pe_free_unit_ctx_impl(ctx,0); +} -- cgit v1.2.3