[hackers] [scc] [driver] replace checktool with validatetools || Quentin Rameau

From: <git_AT_suckless.org>
Date: Tue, 7 Jun 2016 14:30:11 +0200 (CEST)

commit 60152abae659d0e540fd1afa15b738bb42ba87ad
Author: Quentin Rameau <quinq_AT_fifth.space>
AuthorDate: Tue Jun 7 14:12:24 2016 +0200
Commit: Quentin Rameau <quinq_AT_fifth.space>
CommitDate: Tue Jun 7 14:30:03 2016 +0200

    [driver] replace checktool with validatetools
    
    Do all the checks and cleaning in the same function, for all tools which
    has been spawned.

diff --git a/driver/posix/scc.c b/driver/posix/scc.c
index cb0bc06..65595f3 100644
--- a/driver/posix/scc.c
+++ b/driver/posix/scc.c
_AT_@ -34,7 +34,7 @@ struct tool {
         char *args[NARGS];
         char bin[16];
         char *outfile;
- int nargs, in, out;
+ int nargs, in, out, error;
         pid_t pid;
 };
 
_AT_@ -53,21 +53,23 @@ char *argv0;
 static char *arch;
 static char *tmpobjs[NARGS - 2];
 static int nobjs;
-static int failedtool = LAST_TOOL;
 static int Eflag, Sflag, kflag;
 
 static void
 terminate(void)
 {
         Tool *t;
- int i;
+ int tool, failed;
 
- for (i = 0; i < LAST_TOOL; ++i) {
- t = tools[i];
- if (t->pid)
+ for (tool = 0; tool < LAST_TOOL; ++tool) {
+ t = tools[tool];
+ if (t->pid) {
                         kill(t->pid, SIGTERM);
- if (i >= failedtool && t->outfile)
- unlink(t->outfile);
+ if (t->error)
+ failed = tool;
+ if (tool >= failed && t->outfile)
+ unlink(t->outfile);
+ }
         }
 }
 
_AT_@ -179,7 +181,7 @@ settool(int tool, char *infile, int nexttool)
                 break;
         case LD:
                 if (!t->outfile)
- t->outfile = "a.out";
+ t->outfile = xstrdup("a.out");
                 t->args[2] = t->outfile;
                 break;
         default:
_AT_@ -248,21 +250,24 @@ toolfor(char *file)
 }
 
 static void
-checktool(int tool)
+validatetools(void)
 {
- Tool *t = tools[tool];
- int st;
-
- if (!t->pid)
- return;
-
- if (waitpid(t->pid, &st, 0) < 0 ||
- !WIFEXITED(st) || WEXITSTATUS(st) != 0) {
- failedtool = tool;
- exit(-1);
+ Tool *t;
+ int tool, st;
+ for (tool = 0; tool < LAST_TOOL; ++tool) {
+ t = tools[tool];
+ if (t->pid) {
+ if (waitpid(t->pid, &st, 0) < 0 ||
+ !WIFEXITED(st) || WEXITSTATUS(st) != 0) {
+ t->error = 1;
+ exit(-1);
+ }
+ free(t->outfile);
+ t->outfile = NULL;
+ t->pid = 0;
+ t->error = 0;
+ }
         }
-
- t->pid = 0;
 }
 
 static void
_AT_@ -276,8 +281,7 @@ linkobjs(void)
                 addarg(LD, tmpobjs[i]);
 
         spawn(LD);
-
- checktool(LD);
+ validatetools();
 
         if (!kflag) {
                 for (i = 0; i < nobjs; ++i)
_AT_@ -290,7 +294,7 @@ linkobjs(void)
 static void
 build(char *file)
 {
- int i, tool = toolfor(file), nexttool, argfile = (tool == LD) ? 1 : 0;
+ int tool = toolfor(file), nexttool, argfile = (tool == LD) ? 1 : 0;
 
         for (; tool < LAST_TOOL; tool = nexttool) {
                 switch (tool) {
_AT_@ -334,15 +338,7 @@ build(char *file)
                 spawn(settool(inittool(tool), file, nexttool));
         }
 
- for (i = 0; i < LAST_TOOL; ++i)
- checktool(i);
-
- for (i = 0; i < LAST_TOOL; ++i) {
- if (i != LD) {
- free(tools[i]->outfile);
- tools[i]->outfile = NULL;
- }
- }
+ validatetools();
 }
 
 static void
Received on Tue Jun 07 2016 - 14:30:11 CEST

This archive was generated by hypermail 2.3.0 : Tue Jun 07 2016 - 14:36:28 CEST