summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/logic/slbt_exec_stoolie.c66
1 files changed, 57 insertions, 9 deletions
diff --git a/src/logic/slbt_exec_stoolie.c b/src/logic/slbt_exec_stoolie.c
index 45aa76d..e9f1d15 100644
--- a/src/logic/slbt_exec_stoolie.c
+++ b/src/logic/slbt_exec_stoolie.c
@@ -4,6 +4,7 @@
/* Released under the Standard MIT License; see COPYING.SLIBTOOL. */
/*******************************************************************/
+#include <sys/stat.h>
#include <slibtool/slibtool.h>
#include <slibtool/slibtool_output.h>
#include "slibtool_driver_impl.h"
@@ -11,6 +12,8 @@
#include "slibtool_errinfo_impl.h"
#include "argv/argv.h"
+static const char slbt_this_dir[2] = {'.',0};
+
static int slbt_stoolie_usage(
int fdout,
const char * program,
@@ -79,6 +82,11 @@ int slbt_exec_stoolie(const struct slbt_driver_ctx * dctx)
struct argv_meta * meta;
struct argv_entry * entry;
size_t nunits;
+ size_t cunits;
+ const char ** unitv;
+ const char ** unitp;
+ struct slbt_stoolie_ctx ** stctxv;
+ struct slbt_stoolie_ctx ** stctxp;
const struct argv_option * optv[SLBT_OPTV_ELEMENTS];
/* context */
@@ -98,17 +106,9 @@ int slbt_exec_stoolie(const struct slbt_driver_ctx * dctx)
(void)fderr;
- /* missing arguments? */
+ /* <stoolie> argv meta */
slbt_optv_init(slbt_stoolie_options,optv);
- if (!iargv[1] && (dctx->cctx->drvflags & SLBT_DRIVER_VERBOSITY_USAGE))
- return slbt_stoolie_usage(
- fdout,
- dctx->program,
- 0,optv,0,ectx,
- dctx->cctx->drvflags & SLBT_DRIVER_ANNOTATE_NEVER);
-
- /* <stoolie> argv meta */
if (!(meta = slbt_argv_get(
iargv,optv,
dctx->cctx->drvflags & SLBT_DRIVER_VERBOSITY_ERRORS
@@ -192,10 +192,58 @@ int slbt_exec_stoolie(const struct slbt_driver_ctx * dctx)
return SLBT_OK;
}
+ /* default to this-dir as needed */
+ if (!(cunits = nunits))
+ nunits++;
+
+ /* slibtoolize target directory vector allocation */
+ if (!(stctxv = calloc(nunits+1,sizeof(struct slbt_stoolie_ctx *))))
+ return slbt_exec_stoolie_fail(
+ ectx,meta,
+ SLBT_SYSTEM_ERROR(dctx,0));
+
+ /* unit vector allocation */
+ if (!(unitv = calloc(nunits+1,sizeof(const char *)))) {
+ free (stctxv);
+
+ return slbt_exec_stoolie_fail(
+ ectx,meta,
+ SLBT_SYSTEM_ERROR(dctx,0));
+ }
+
+ /* unit vector initialization */
+ for (entry=meta->entries,unitp=unitv; entry->fopt || entry->arg; entry++)
+ if (!entry->fopt)
+ *unitp++ = entry->arg;
+
+ if (!cunits)
+ unitp[0] = slbt_this_dir;
+
+ /* slibtoolize target directory vector initialization */
+ for (unitp=unitv,stctxp=stctxv; *unitp; unitp++,stctxp++) {
+ if (slbt_st_get_stoolie_ctx(dctx,*unitp,stctxp) < 0) {
+ for (stctxp=stctxv; *stctxp; stctxp++)
+ slbt_st_free_stoolie_ctx(*stctxp);
+
+ free(unitv);
+ free(stctxv);
+
+ return slbt_exec_stoolie_fail(
+ ectx,meta,
+ SLBT_NESTED_ERROR(dctx));
+ }
+ }
+
/* slibtoolize operations */
ret = slbt_exec_stoolie_perform_actions(dctx);
/* all done */
+ for (stctxp=stctxv; *stctxp; stctxp++)
+ slbt_st_free_stoolie_ctx(*stctxp);
+
+ free(unitv);
+ free(stctxv);
+
slbt_argv_free(meta);
slbt_ectx_free_exec_ctx(ectx);