ref: b85da7f9b81831a35f3d881fb9f048a4ac94eb6f
parent: 628bdafd3f9bc1cf19d595dc97e40bee68a54215
author: Quentin Rameau <quinq@fifth.space>
date: Wed Jun 1 14:39:23 EDT 2016
[driver] separate tool initialization Set tool files paths in a separate function as this will only be needed once. Try to simplify the tool struct too.
--- a/driver/posix/scc.c
+++ b/driver/posix/scc.c
@@ -25,17 +25,15 @@
};
static struct tool {
- char cmd[PATH_MAX];
+ char cmd[PATH_MAX];
char *args[NARGS];
- int nargs;
- char bin[16];
- char name[8];
- int in, out;
+ char bin[16];
+ int nargs, in, out;
pid_t pid;
} tools[NR_TOOLS] = {
- [CC1] = { .name = "cc1", },
- [CC2] = { .name = "cc2", },
- [QBE] = { .name = "qbe", .bin = "qbe", .cmd = "qbe", },
+ [CC1] = { .bin = "cc1", .cmd = PREFIX "/libexec/scc/", },
+ [CC2] = { .bin = "cc2", .cmd = PREFIX "/libexec/scc/", },
+ [QBE] = { .bin = "qbe", .bin = "qbe", .cmd = "qbe", },
};
char *argv0;
@@ -54,6 +52,41 @@
}
int
+inittool(int tool)
+{
+ struct tool *t = &tools[tool];
+ size_t binln;
+ int n;
+
+ if (!t->args[0]) {
+ switch (tool) {
+ case CC1:
+ case CC2:
+ binln = strlen(t->bin);
+ if (arch) {
+ n = snprintf(t->bin + binln,
+ sizeof(t->bin) - binln,
+ "-%s", arch);
+ if (n < 0 || n >= sizeof(t->bin))
+ die("scc: target tool bin too long");
+ binln = strlen(t->bin);
+ }
+
+ if (strlen(t->cmd) + binln + 1 > sizeof(t->cmd))
+ die("scc: target tool path too long");
+ strcat(t->cmd, t->bin);
+ break;
+ default:
+ break;
+ }
+
+ t->args[0] = t->bin;
+ }
+
+ return tool;
+}
+
+int
settool(int t, int pipeout)
{
struct tool *tool = &tools[t];
@@ -60,25 +93,8 @@
int fds[2], n;
static int fdin;
- switch (t) {
- case CC1:
- case CC2:
- n = snprintf(tool->bin, sizeof(tool->bin),
- arch ? "%s-%s" : "%s", tool->name, arch);
- if (n < 0 || n >= sizeof(tool->bin))
- die("scc: target tool name too long");
+ inittool(t);
- n = snprintf(tool->cmd, sizeof(tool->cmd),
- "%s/libexec/scc/%s", PREFIX, tool->bin);
- if (n < 0 || n >= sizeof(tool->cmd))
- die("scc: target tool path too long");
- break;
- default:
- break;
- }
-
- tool->args[0] = tool->bin;
-
if (fdin) {
tool->in = fdin;
fdin = 0;
@@ -100,7 +116,7 @@
switch (tool->pid = fork()) {
case -1:
- die("scc: %s: %s", tool->name, strerror(errno));
+ die("scc: %s: %s", tool->bin, strerror(errno));
case 0:
if (tool->out)
dup2(tool->out, 1);