X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fclient.c;h=8df624494b3c7879cc60480458ff860369d4fe92;hb=c20a2c1e01d707d6c3fa25067df93d491aba8fff;hp=0fd8950e4d76f5d88523ac809d0af2c0b9630ae6;hpb=3a6b5b143e5d0e6011a70ec6897934b518f744e1;p=spider.git diff --git a/src/client.c b/src/client.c index 0fd8950e..8df62449 100644 --- a/src/client.c +++ b/src/client.c @@ -34,6 +34,7 @@ #include "sel.h" #include "cmsg.h" +#include "chain.h" #include "debug.h" #define TEXT 1 @@ -95,8 +96,9 @@ int tabsize = 8; /* default tabsize for text messages */ char *connsort = "local"; /* the connection variety */ int state = 0; /* the current state of the connection */ int laststate = 0; /* the last state we were in */ - - +reft echobase; /* the anti echo queue */ +int maxecho = 5; /* the depth of the anti echo queue */ +int echon; /* no of entries in the anti echo queue */ #define CONNECTED 100 #define WAITLOGIN 1 @@ -112,10 +114,10 @@ myregex_t iscallreg[] = { /* regexes to determine whether this is a reasonable "^[0-9]+[A-Z]+[0-9]+[A-Z]+[1-9]?$", 0 /* 2E0AAA 2E0AAA1 */ }, { - "^[A-Z]+[0-9]+[A-Z]+-[1-9]$", 0 /* G1TLH-2 */ + "^[A-Z]+[0-9]+[A-Z]+-[0-9]$", 0 /* G1TLH-2 */ }, { - "^[0-9]+[A-Z]+[0-9]+[A-Z]+-[1-9]$", 0 /* 2E0AAA-2 */ + "^[0-9]+[A-Z]+[0-9]+[A-Z]+-[0-9]$", 0 /* 2E0AAA-2 */ }, { "^[A-Z]+[0-9]+[A-Z]+-1[0-5]$", 0 /* G1TLH-11 */ @@ -221,7 +223,22 @@ fcb_t *fcb_new(int cnum, int sort) void flush_text(fcb_t *f) { if (f->obuf) { - cmsg_send(f->outq, f->obuf, 0); + /* save this onto the front of the echo chain */ + cmsg_t *imp = f->obuf; + int size = imp->inp - imp->data; + cmsg_t *emp = cmsg_new(size, imp->sort, imp->portp); + + emp->size = size; + memcpy(emp->data, imp->data, size); + emp->inp = emp->data + size; /* just in case */ + chain_add(&echobase, emp); + if (++echon > maxecho) { + emp = cmsg_prev(&echobase); + cmsg_free(emp); + } + + /* queue it for sending */ + cmsg_send(f->outq, imp, 0); f->sp->flags |= SEL_OUTPUT; f->obuf = 0; } @@ -572,12 +589,20 @@ void setmode(char *m) void process_stdin() { - cmsg_t *mp = cmsg_next(in->inq); + cmsg_t *wmp, *mp = cmsg_next(in->inq); char *p, hasa, hasn, i; char callsign[MAXCALLSIGN+1]; if (mp) { dbg(DMSG, "MSG size: %d", mp->size); + + /* check for echos */ + for (wmp = 0; wmp = chain_get_next(&echobase, wmp); ) { + if (!memcmp(wmp->data, mp->data, wmp->size)) { + cmsg_callback(mp, 0); + return; + } + } switch (state) { case CONNECTED: @@ -613,6 +638,11 @@ void process_stdin() if (!iscallsign(call)) { die("Sorry, %s isn't a valid callsign", call); } + + /* strip off a '-0' at the end */ + i = strlen(call); + if (call[i-1] == '0' && call[i-2] == '-') + call[i-2] = 0; alarm(0); signal(SIGALRM, SIG_IGN); @@ -621,6 +651,7 @@ void process_stdin() send_msg(node, 'A', connsort, strlen(connsort)); chgstate(CONNECTED); + send_file("connected"); } cmsg_callback(mp, 0); @@ -848,6 +879,8 @@ main(int argc, char *argv[]) #ifdef SIGPWR signal(SIGPWR, terminate); #endif + /* init a few things */ + chain_init(&echobase); /* connect up stdin */ in = fcb_new(0, TEXT); @@ -878,17 +911,22 @@ main(int argc, char *argv[]) send_text(in, "login: ", 7, 0); chgstate(WAITLOGIN); } else { - + int i; + /* check the callsign against the regexes */ if (!iscallsign(call)) { die("Sorry, %s isn't a valid callsign", call); } + /* strip off a '-0' at the end */ + i = strlen(call); + if (call[i-1] == '0' && call[i-2] == '-') + call[i-2] = 0; + /* tell the cluster who I am */ send_msg(node, 'A', connsort, strlen(connsort)); chgstate(CONNECTED); - send_file("connected"); }