| #include <stdio.h> |
| #include <unistd.h> |
| #include <sofort/sofort.h> |
| #include "sofort_version.h" |
| |
| #ifndef SFRT_DRIVER_FLAGS |
| #define SFRT_DRIVER_FLAGS SFRT_DRIVER_VERBOSITY_ERRORS \ |
| | SFRT_DRIVER_VERBOSITY_USAGE |
| #endif |
| |
| static const char vermsg[] = "%s (git://midipix.org/sofort): commit %s.\n"; |
| |
| static ssize_t sofort_version(struct sfrt_driver_ctx * dctx) |
| { |
| return fprintf(stdout,vermsg,dctx->program,SOFORT_GIT_VERSION); |
| } |
| |
| static void sofort_perform_unit_actions(struct sfrt_unit_ctx * uctx) |
| { |
| uint64_t flags = uctx->cctx->actflags; |
| |
| if (flags & SFRT_OUTPUT_NAME) { |
| uctx->status = sfrt_output_name(uctx,stdout); |
| uctx->nerrors += !!uctx->status; |
| } |
| |
| if (flags & SFRT_OUTPUT_ADDRESS) { |
| uctx->status = sfrt_output_address(uctx,stdout); |
| uctx->nerrors += !!uctx->status; |
| } |
| } |
| |
| static int sofort_exit(struct sfrt_driver_ctx * dctx, int nerrors) |
| { |
| sfrt_free_driver_ctx(dctx); |
| return nerrors ? 2 : 0; |
| } |
| |
| int sofort_main(int argc, const char ** argv, const char ** envp) |
| { |
| int ret; |
| struct sfrt_driver_ctx * dctx; |
| struct sfrt_unit_ctx * uctx; |
| const char ** unit; |
| |
| if ((ret = sfrt_get_driver_ctx(argv,envp,SFRT_DRIVER_FLAGS,&dctx))) |
| return (ret == SFRT_USAGE) ? !--argc : 2; |
| |
| if (dctx->cctx->drvflags & SFRT_DRIVER_VERSION) |
| if ((sofort_version(dctx)) < 0) |
| return sofort_exit(dctx,2); |
| |
| if (dctx->cctx->anystring) |
| if ((sfrt_output_dummy(dctx->cctx,stdout)) < 0) |
| return sofort_exit(dctx,2); |
| |
| for (unit=dctx->units; *unit; unit++) { |
| if (!(sfrt_get_unit_ctx(dctx,*unit,&uctx))) { |
| sofort_perform_unit_actions(uctx); |
| ret += uctx->nerrors; |
| sfrt_free_unit_ctx(uctx); |
| } |
| } |
| |
| return sofort_exit(dctx,ret); |
| } |
| |
| #ifndef SOFORT_IN_A_BOX |
| |
| int main(int argc, const char ** argv, const char ** envp) |
| { |
| return sofort_main(argc,argv,envp); |
| } |
| |
| #endif |