ref: 0460d8f44cd2289275665569faa21653e5ae2f96
parent: 7881c61acd222f71b17e4257b5a5d8b8e2b89f78
author: Quentin Rameau <quinq@fifth.space>
date: Wed May 25 15:42:06 EDT 2016
[driver] Unify cc1() and cc2() into spawn() We try to have a common fonction for spawning all libexec tools. Based on the precious work of FRIGN. “No se abrazaron unos a otros, porque donde hay mucho amor no suele haber demasiada desenvoltura.” (Cervantes, “Don Qujote”, II, 65).
--- a/driver/posix/scc.c
+++ b/driver/posix/scc.c
@@ -18,8 +18,7 @@
#define NARGS 64
static char cmd[FILENAME_MAX];
-static char *argcc1[NARGS];
-static char *argcc2[NARGS];
+static char *argcc1[NARGS], *argcc2[NARGS];
static pid_t pid_cc1, pid_cc2;
static char *arch;
@@ -34,53 +33,30 @@
}
void
-cc1(int fd)
+spawn(char *tool, char *args[NARGS], pid_t *pid_tool, int fd, int stdfd)
{
pid_t pid;
- char *fmt;
+ char archtool[16], *fmt = "%s/libexec/scc/%s";
int r;
- switch (pid = fork()) {
- case -1:
- die("scc: cc1: %s", strerror(errno));
- exit(1);
- case 0:
- dup2(fd, 1);
- fmt = (arch) ? "%s/libexec/scc/cc1-%s" : "%s/libexec/scc/cc1";
- r = snprintf(cmd, sizeof(cmd), fmt, PREFIX, arch);
- if (r == sizeof(cmd))
- die("scc: incorrect prefix\n");
- execv(cmd, argcc1);
- fprintf(stderr, "scc: execv cc1: %s\n", strerror(errno));
- _exit(1);
- default:
- pid_cc1 = pid;
- close(fd);
- break;
- }
-}
+ r = snprintf(archtool, sizeof(archtool), arch ? "%s-%s" : "%s", tool, arch);
+ if (r == -1 || r >= sizeof(archtool))
+ die("scc: incorrect target arch");
-pid_t
-cc2(int fd)
-{
- pid_t pid;
- char *fmt;
- int r;
-
switch (pid = fork()) {
case -1:
- die("scc: cc2: %s", strerror(errno));
+ die("scc: %s: %s", archtool, strerror(errno));
case 0:
- dup2(fd, 0);
- fmt = (arch) ? "%s/libexec/scc/cc2-%s" : "%s/libexec/scc/cc2";
- r = snprintf(cmd, sizeof(cmd), fmt, PREFIX, arch);
- if (r == sizeof(cmd))
+ dup2(fd, stdfd);
+ r = snprintf(cmd, sizeof(cmd), fmt, PREFIX, archtool);
+ if (r == - 1 || r >= sizeof(cmd))
die("scc: incorrect prefix");
- execv(cmd, argcc2);
- fprintf(stderr, "scc: execv cc2: %s\n", strerror(errno));
+ args[0] = archtool;
+ execv(cmd, args);
+ fprintf(stderr, "scc: execv %s: %s\n", cmd, strerror(errno));
_exit(1);
default:
- pid_cc2 = pid;
+ *pid_tool = pid;
close(fd);
break;
}
@@ -119,12 +95,9 @@
if (pipe(fds))
die("scc: pipe: %s", strerror(errno));
- argcc1[0] = "cc1";
argcc1[1] = *argv;
- argcc2[0] = "cc2";
-
- cc1(fds[1]);
- cc2(fds[0]);
+ spawn("cc1", argcc1, &pid_cc1, fds[1], 1);
+ spawn("cc2", argcc2, &pid_cc2, fds[0], 0);
for (i = 0; i < 2; ++i) {
pid = wait(&st);