X-Git-Url: http://dxcluster.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=src%2Fclient.c;fp=src%2Fclient.c;h=a3147d551dd4a91bd74dec75519e7131e2740193;hb=5b3f4e20affe90bff9909272a933834247a2ed9d;hp=8df624494b3c7879cc60480458ff860369d4fe92;hpb=4470e513c0285d0fceb43299bcbe67d7e12c45d5;p=spider.git diff --git a/src/client.c b/src/client.c index 8df62449..a3147d55 100644 --- a/src/client.c +++ b/src/client.c @@ -16,9 +16,10 @@ * $Id$ */ +#include #include #include -#include +#include #include #include #include @@ -96,6 +97,7 @@ 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 */ +char echocancel = 1; /* echo cancelling */ 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 */ @@ -104,7 +106,7 @@ int echon; /* no of entries in the anti echo queue */ #define WAITLOGIN 1 #define WAITPASSWD 2 #define WAITINPUT 10 - +#define DOCHAT 20 myregex_t iscallreg[] = { /* regexes to determine whether this is a reasonable callsign */ { @@ -203,6 +205,14 @@ int iscallsign(char *s) return 0; } +void reaper(int i) +{ + pid_t mypid; + while ((mypid = waitpid(-1, 0, WNOHANG)) > 0) { + ; + } +} + /* * higher level send and receive routines */ @@ -231,10 +241,12 @@ void flush_text(fcb_t *f) 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); + if (echocancel) { + chain_add(&echobase, emp); + if (++echon > maxecho) { + emp = cmsg_prev(&echobase); + cmsg_free(emp); + } } /* queue it for sending */ @@ -597,10 +609,12 @@ void process_stdin() 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; + if (echocancel) { + for (wmp = 0; wmp = chain_get_next(&echobase, wmp); ) { + if (!memcmp(wmp->data, mp->data, wmp->size)) { + cmsg_callback(mp, 0); + return; + } } } @@ -652,6 +666,11 @@ void process_stdin() chgstate(CONNECTED); send_file("connected"); + break; + + case DOCHAT: + + break; } cmsg_callback(mp, 0); @@ -749,8 +768,11 @@ void initargs(int argc, char *argv[]) { int i, c, err = 0; - while ((c = getopt(argc, argv, "h:p:x:")) > 0) { + while ((c = getopt(argc, argv, "eh:l:p:x:")) > 0) { switch (c) { + case 'e': + echocancel ^= 1; + break; case 'h': node_addr = optarg; break; @@ -776,7 +798,7 @@ void initargs(int argc, char *argv[]) lerr: if (err) { - die("usage: client [-x n|-h|-p|-l] |login [local|telnet|ax25]"); + die("usage: client [-e|-x n|-h|-p|-l] |login [local|telnet|ax25]"); } if (optind < argc) { @@ -879,6 +901,8 @@ main(int argc, char *argv[]) #ifdef SIGPWR signal(SIGPWR, terminate); #endif + signal(SIGCLD, reaper); + /* init a few things */ chain_init(&echobase);