aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Forney <mforney@mforney.org>2019-05-13 12:26:10 -0700
committerMichael Forney <mforney@mforney.org>2019-05-13 12:26:10 -0700
commit62c5dc41974a0f71ab3a6d0148222c9f9ed808e7 (patch)
treedee2809da4c6a621c410f983d70fcf9888e1bf1d
parent173957fae99508b18915daf1bd5768172afc44a3 (diff)
driver: Add verbose mode
-rw-r--r--driver.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/driver.c b/driver.c
index d302623..98e2512 100644
--- a/driver.c
+++ b/driver.c
@@ -44,9 +44,9 @@ struct input {
bool lib;
};
-extern char **environ;
static struct {
bool nostdlib;
+ bool verbose;
} flags;
static struct phase phases[] = {
[PREPROCESS] = {.name = "preprocess"},
@@ -114,6 +114,21 @@ changeext(const char *name, const char *ext)
}
static int
+spawn(pid_t *pid, struct array *args, posix_spawn_file_actions_t *actions)
+{
+ extern char **environ;
+ char **arg;
+
+ if (flags.verbose) {
+ fprintf(stderr, "%s: spawning", argv0);
+ for (arg = args->val; *arg; ++arg)
+ fprintf(stderr, " %s", *arg);
+ fputc('\n', stderr);
+ }
+ return posix_spawnp(pid, *(char **)args->val, actions, NULL, args->val, environ);
+}
+
+static int
spawnphase(struct phase *phase, int *fd, char *input, char *output, bool last)
{
int ret, pipefd[2];
@@ -143,7 +158,7 @@ spawnphase(struct phase *phase, int *fd, char *input, char *output, bool last)
goto err2;
}
- ret = posix_spawnp(&phase->pid, *(char **)phase->cmd.val, &actions, NULL, phase->cmd.val, environ);
+ ret = spawn(&phase->pid, &phase->cmd, &actions);
if (ret)
goto err2;
if (!last) {
@@ -281,7 +296,7 @@ buildexe(struct input *inputs, size_t ninputs, char *output)
arrayaddbuf(&p->cmd, endfiles, sizeof(endfiles));
arrayaddptr(&p->cmd, NULL);
- ret = posix_spawnp(&pid, *(char **)p->cmd.val, NULL, NULL, p->cmd.val, environ);
+ ret = spawn(&pid, &p->cmd, NULL);
if (ret)
fatal("%s: spawn \"%s\": %s", p->name, *(char **)p->cmd.val, strerror(errno));
if (waitpid(pid, &status, 0) < 0)
@@ -378,7 +393,7 @@ main(int argc, char *argv[])
} else if (strcmp(arg, "-pedantic") == 0) {
/* ignore */
} else {
- if (arg[2] != '\0' && strchr("cESs", arg[1]))
+ if (arg[2] != '\0' && strchr("cESsv", arg[1]))
usage(NULL);
switch (arg[1]) {
case 'c':
@@ -432,6 +447,9 @@ main(int argc, char *argv[])
arrayaddptr(&phases[PREPROCESS].cmd, "-U");
arrayaddptr(&phases[PREPROCESS].cmd, nextarg(&argv));
break;
+ case 'v':
+ flags.verbose = true;
+ break;
case 'W':
if (arg[2] && arg[3] == ',') {
switch (arg[2]) {