diff options
author | midipix <writeonce@midipix.org> | 2015-11-22 23:07:55 -0500 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2016-11-10 23:35:26 -0500 |
commit | 846f96ecfe93b8f3cb08b0baa8296f20b7a3974b (patch) | |
tree | fb4f13e707d3303bf01d648e990006bc823f7a06 | |
parent | 81e8b3a78b680143e315b4380d794a25fefc9e32 (diff) | |
download | perk-846f96ecfe93b8f3cb08b0baa8296f20b7a3974b.tar.bz2 perk-846f96ecfe93b8f3cb08b0baa8296f20b7a3974b.tar.xz |
driver integration 9/9: utilize the driver in the front-end utility.
-rw-r--r-- | src/perk.c | 41 |
1 files changed, 38 insertions, 3 deletions
@@ -1,11 +1,46 @@ +#include <stdio.h> #include <perk/perk.h> -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); } |