diff options
-rw-r--r-- | tools/hi-q.c | 22 | ||||
-rw-r--r-- | tools/hi-test.conf | 2 |
2 files changed, 20 insertions, 4 deletions
diff --git a/tools/hi-q.c b/tools/hi-q.c index 1896bf4..7215b0c 100644 --- a/tools/hi-q.c +++ b/tools/hi-q.c @@ -2,6 +2,9 @@ // lightweight connection from qmail to filters e.g. spamassassin // (hi-q filter, get it?) +// Hint: For testing, see also hi-test.conf which invokes ./hi-test: +// ./hi-q hi-test.conf + // TODO: Panic stop should signal all children. // TODO: Possibly: Wait for all kids in parallel? // That's because they might finish out of order. @@ -21,6 +24,7 @@ using namespace std; #include <string> #include <vector> #include <sstream> +#include <map> // error exit codes, mostly as stated in qmail.c const int ex_good = 0; @@ -131,7 +135,7 @@ int xclose(int arg){ extern char** environ; int main(int argc, char** argv) { - int verbose(1); + int verbose(0); int kidstatus; int rslt; @@ -238,6 +242,7 @@ int main(int argc, char** argv) { // doesn't choose it. That allows N-1 of the kids // to close it and dup() something useful onto it. + map<int,int> iiofpid; for (unsigned int ii=0; ii < nkids; ii++){ /* loop starting all kids */ int datapipe[2]; int kid_end; @@ -275,6 +280,12 @@ int main(int argc, char** argv) { kid_end = datapipe[flip(wEnd, rEnd)]; kidpid[ii] = fork(); + if (kidpid[ii] == -1) { + cerr << "hi-q: fork failed : "; + perror(0); + exit(ex_syserr); + } + iiofpid[kidpid[ii]] = ii; if (!kidpid[ii]) { /*** child code ***/ pid_t kidgroup(0); // process group for all kids is @@ -314,6 +325,7 @@ int main(int argc, char** argv) { ssize_t rslt = read(resync[rEnd], &junk, 1); if (rslt < 0 ) { cerr << "bad sync ... " << rslt << endl; + // FIXME (maybe?) should this be fatal? } else { // cerr << "back from read resync, good: " << rslt << endl; } @@ -458,11 +470,15 @@ int main(int argc, char** argv) { /////////////////// // decode the best reason why the filter-chain terminated if (best_blame) { + string short_name(""); + int kidno(iiofpid[argbest_blame]); if (WIFEXITED(best_blame)) { int sts = WEXITSTATUS(best_blame); if (sts == 1) { - cerr << "hi-q says: kid " << argbest_blame - << " reports spam." << endl; + cerr << "hi-q says: kid[" << kidno << "]" + << " pid " << argbest_blame + << " i.e. '" << filter[kidno][0] << "'" + << " reports spam." << endl; panic(ex_spam); } if (sts != 0) { diff --git a/tools/hi-test.conf b/tools/hi-test.conf index df3f8bb..630e2bb 100644 --- a/tools/hi-test.conf +++ b/tools/hi-test.conf @@ -1,3 +1,3 @@ hi-test x0 -snooze 10 -hi-test x1 -snooze 1 -exit 3 -kill +hi-test x1 -snooze 1 -exit 1 -kill hi-test x2 -snooze 10 |