From 846f96ecfe93b8f3cb08b0baa8296f20b7a3974b Mon Sep 17 00:00:00 2001 From: midipix Date: Sun, 22 Nov 2015 23:07:55 -0500 Subject: driver integration 9/9: utilize the driver in the front-end utility. --- src/perk.c | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) (limited to 'src/perk.c') diff --git a/src/perk.c b/src/perk.c index 983c130..b952a1b 100644 --- a/src/perk.c +++ b/src/perk.c @@ -1,11 +1,46 @@ +#include #include -static int perk_main(int argc, char ** argv, char ** envp) +#ifndef PERK_DRIVER_FLAGS +#define PERK_DRIVER_FLAGS PERK_DRIVER_VERBOSITY_ERRORS|PERK_DRIVER_VERBOSITY_USAGE +#endif + +static void perk_perform_unit_actions(struct pe_unit_ctx * uctx) +{ + uint64_t flags = uctx->cctx.fmtflags; + + if (flags & PERK_OUTPUT_FLAG_EXPORT_SYMS) + uctx->cctx.status = pe_output_export_symbols(uctx->meta,&uctx->cctx,0); +} + +static int perk_exit(struct pe_driver_ctx * dctx, int status) { - return -1; + pe_free_driver_ctx(dctx); + return (status < 0) ? 2 : status; +} + +static int perk_main(int argc, const char ** argv, const char ** envp) +{ + int ret; + struct pe_driver_ctx * dctx; + struct pe_unit_ctx * uctx; + const char ** unit; + + if ((ret = pe_get_driver_ctx(argv,envp,PERK_DRIVER_FLAGS,&dctx))) + return (ret == PERK_USAGE) ? 0 : 2; + + for (unit=dctx->units; *unit; unit++) { + if (!(pe_get_unit_ctx(dctx,*unit,&uctx))) { + perk_perform_unit_actions(uctx); + ret = uctx->cctx.status ? uctx->cctx.status : ret; + pe_free_unit_ctx(uctx); + } + } + + return perk_exit(dctx,ret); } -int main(int argc, char ** argv, char ** envp) +int main(int argc, const char ** argv, const char ** envp) { return perk_main(argc,argv,envp); } -- cgit v1.2.3