|
|
e956c8 |
/*******************************************************************/
|
|
|
e956c8 |
/* slibtool: a skinny libtool implementation, written in C */
|
|
|
e956c8 |
/* Copyright (C) 2016 Z. Gilboa */
|
|
|
e956c8 |
/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */
|
|
|
e956c8 |
/*******************************************************************/
|
|
|
e956c8 |
|
|
|
e956c8 |
#include <string.h>
|
|
|
e956c8 |
#include <stdbool.h>
|
|
|
e956c8 |
#include <fcntl.h>
|
|
|
e956c8 |
#include <errno.h>
|
|
|
e956c8 |
#include <sys/stat.h>
|
|
|
e956c8 |
|
|
|
e956c8 |
#include <slibtool/slibtool.h>
|
|
|
e956c8 |
#include "slibtool_spawn_impl.h"
|
|
|
e956c8 |
|
|
|
e956c8 |
int slbt_exec_execute(
|
|
|
e956c8 |
const struct slbt_driver_ctx * dctx,
|
|
|
e956c8 |
struct slbt_exec_ctx * ectx)
|
|
|
e956c8 |
{
|
|
|
e956c8 |
int ret;
|
|
|
e956c8 |
char ** parg;
|
|
|
e956c8 |
char * program;
|
|
|
e956c8 |
char * script;
|
|
|
e956c8 |
char * base;
|
|
|
e956c8 |
char * mark;
|
|
|
e956c8 |
char exeref [PATH_MAX];
|
|
|
e956c8 |
char wrapper[PATH_MAX];
|
|
|
e956c8 |
struct slbt_exec_ctx * actx = 0;
|
|
|
e956c8 |
|
|
|
c4a389 |
/* dry run */
|
|
|
c4a389 |
if (dctx->cctx->drvflags & SLBT_DRIVER_DRY_RUN)
|
|
|
c4a389 |
return 0;
|
|
|
c4a389 |
|
|
|
e956c8 |
/* context */
|
|
|
e956c8 |
if (ectx)
|
|
|
e956c8 |
slbt_disable_placeholders(ectx);
|
|
|
e956c8 |
else if ((ret = slbt_get_exec_ctx(dctx,&ectx)))
|
|
|
e956c8 |
return ret;
|
|
|
e956c8 |
else {
|
|
|
e956c8 |
actx = ectx;
|
|
|
e956c8 |
slbt_disable_placeholders(ectx);
|
|
|
e956c8 |
}
|
|
|
e956c8 |
|
|
|
e956c8 |
/* script, program */
|
|
|
e956c8 |
program = ectx->cargv[0];
|
|
|
e956c8 |
script = ectx->cargv[1];
|
|
|
e956c8 |
|
|
|
e956c8 |
/* wrapper */
|
|
|
e956c8 |
if ((size_t)snprintf(wrapper,sizeof(wrapper),"%s.exe.wrapper",
|
|
|
e956c8 |
script)
|
|
|
e956c8 |
>= sizeof(wrapper)) {
|
|
|
e956c8 |
slbt_free_exec_ctx(actx);
|
|
|
e956c8 |
return -1;
|
|
|
e956c8 |
}
|
|
|
e956c8 |
|
|
|
e956c8 |
/* exeref */
|
|
|
e956c8 |
if ((base = strrchr(script,'/')))
|
|
|
e956c8 |
base++;
|
|
|
e956c8 |
else
|
|
|
e956c8 |
base = script;
|
|
|
e956c8 |
|
|
|
e956c8 |
strcpy(exeref,script);
|
|
|
e956c8 |
mark = exeref + (base - script);
|
|
|
e956c8 |
sprintf(mark,".libs/%s",base);
|
|
|
e956c8 |
|
|
|
e956c8 |
/* swap vector */
|
|
|
e956c8 |
ectx->cargv[0] = wrapper;
|
|
|
e956c8 |
ectx->cargv[1] = program;
|
|
|
e956c8 |
ectx->cargv[2] = exeref;
|
|
|
e956c8 |
|
|
|
e956c8 |
/* execute mode */
|
|
|
e956c8 |
ectx->program = script;
|
|
|
e956c8 |
ectx->argv = ectx->cargv;
|
|
|
e956c8 |
|
|
|
e956c8 |
/* step output */
|
|
|
e956c8 |
if (!(dctx->cctx->drvflags & SLBT_DRIVER_SILENT))
|
|
|
e956c8 |
if (slbt_output_execute(dctx,ectx)) {
|
|
|
e956c8 |
slbt_free_exec_ctx(actx);
|
|
|
e956c8 |
return -1;
|
|
|
e956c8 |
}
|
|
|
e956c8 |
|
|
|
e956c8 |
execvp(wrapper,ectx->argv);
|
|
|
e956c8 |
|
|
|
e956c8 |
slbt_free_exec_ctx(actx);
|
|
|
e956c8 |
return -1;
|
|
|
e956c8 |
}
|