summaryrefslogtreecommitdiffhomepage
path: root/src/driver/slbt_driver_ctx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/driver/slbt_driver_ctx.c')
-rw-r--r--src/driver/slbt_driver_ctx.c65
1 files changed, 32 insertions, 33 deletions
diff --git a/src/driver/slbt_driver_ctx.c b/src/driver/slbt_driver_ctx.c
index 658b62b..9d7deb6 100644
--- a/src/driver/slbt_driver_ctx.c
+++ b/src/driver/slbt_driver_ctx.c
@@ -176,9 +176,17 @@ static struct slbt_driver_ctx_impl * slbt_driver_ctx_alloc(
return &ictx->ctx;
}
-static int slbt_get_driver_ctx_fail(struct argv_meta * meta)
+static int slbt_get_driver_ctx_fail(
+ struct slbt_driver_ctx * dctx,
+ struct argv_meta * meta)
{
- argv_free(meta);
+ if (dctx) {
+ slbt_output_error_vector(dctx);
+ slbt_free_driver_ctx(dctx);
+ } else {
+ argv_free(meta);
+ }
+
return -1;
}
@@ -1294,14 +1302,21 @@ int slbt_get_driver_ctx(
/* driver context */
if (!(ctx = slbt_driver_ctx_alloc(meta,fdctx,&cctx)))
- return slbt_get_driver_ctx_fail(meta);
+ return slbt_get_driver_ctx_fail(0,meta);
+
+ /* ctx */
+ ctx->ctx.program = program;
+ ctx->ctx.cctx = &ctx->cctx;
+ ctx->targv = sargv.targv;
+ ctx->cargv = sargv.cargv;
+
+ ctx->cctx.targv = sargv.targv;
+ ctx->cctx.cargv = sargv.cargv;
/* heuristics */
if (cctx.drvflags & SLBT_DRIVER_HEURISTICS) {
- if (slbt_get_lconf_flags(&ctx->ctx,lconf,&lflags) < 0) {
- slbt_free_driver_ctx(&ctx->ctx);
- return -1;
- }
+ if (slbt_get_lconf_flags(&ctx->ctx,lconf,&lflags) < 0)
+ return slbt_get_driver_ctx_fail(&ctx->ctx,0);
cctx.drvflags &= ~(uint64_t)SLBT_DRIVER_DISABLE_STATIC;
cctx.drvflags &= ~(uint64_t)SLBT_DRIVER_DISABLE_SHARED;
@@ -1321,25 +1336,14 @@ int slbt_get_driver_ctx(
ctx->cctx.drvflags = cctx.drvflags;
}
- /* ctx */
- ctx->ctx.program = program;
- ctx->ctx.cctx = &ctx->cctx;
- ctx->targv = sargv.targv;
- ctx->cargv = sargv.cargv;
-
- ctx->cctx.targv = sargv.targv;
- ctx->cctx.cargv = sargv.cargv;
-
/* host params */
if (slbt_init_host_params(
&ctx->ctx,
&ctx->cctx,
&ctx->host,
&ctx->cctx.host,
- &ctx->cctx.cfgmeta)) {
- slbt_free_driver_ctx(&ctx->ctx);
- return -1;
- }
+ &ctx->cctx.cfgmeta))
+ return slbt_get_driver_ctx_fail(&ctx->ctx,0);
/* flavor settings */
slbt_init_flavor_settings(
@@ -1347,26 +1351,21 @@ int slbt_get_driver_ctx(
&ctx->cctx.settings);
/* ldpath */
- if (slbt_init_ldrpath(&ctx->cctx,&ctx->cctx.host)) {
- slbt_free_driver_ctx(&ctx->ctx);
- return -1;
- }
+ if (slbt_init_ldrpath(&ctx->cctx,&ctx->cctx.host))
+ return slbt_get_driver_ctx_fail(&ctx->ctx,0);
/* version info */
- if (slbt_init_version_info(ctx,&ctx->cctx.verinfo)) {
- slbt_free_driver_ctx(&ctx->ctx);
- return -1;
- }
+ if (slbt_init_version_info(ctx,&ctx->cctx.verinfo))
+ return slbt_get_driver_ctx_fail(&ctx->ctx,0);
/* link params */
if (cctx.mode == SLBT_MODE_LINK)
- if (slbt_init_link_params(ctx)) {
- slbt_free_driver_ctx(&ctx->ctx);
- return -1;
- }
+ if (slbt_init_link_params(ctx))
+ return slbt_get_driver_ctx_fail(&ctx->ctx,0);
*pctx = &ctx->ctx;
- return SLBT_OK;
+
+ return 0;
}
static void slbt_free_driver_ctx_impl(struct slbt_driver_ctx_alloc * ictx)