From 5b3f4e20affe90bff9909272a933834247a2ed9d Mon Sep 17 00:00:00 2001 From: minima Date: Sun, 26 Nov 2000 12:54:23 +0000 Subject: [PATCH] make the PC16/17 antiloop protection for node and alias more clever. make -l nnn on c client work make -e on c client toggle echo cancelling (default on) --- Changes | 6 ++++++ perl/DXProt.pm | 16 ++++++++++++---- src/client.c | 48 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 54 insertions(+), 16 deletions(-) diff --git a/Changes b/Changes index dc742ed3..f9fcf1a3 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,9 @@ +26Nov00======================================================================= +1. made it possible for sysop calls to be used on other nodes and still have +anti loop checking on PC16/17. +25Nov00======================================================================= +1. -l now works on C client +2. -e toggles echo cancelling (normally on) on C client 20Nov00======================================================================= 1. added even more checking to PC16,17 and 39 19Nov00======================================================================= diff --git a/perl/DXProt.pm b/perl/DXProt.pm index ffb9cf5b..03253bf0 100644 --- a/perl/DXProt.pm +++ b/perl/DXProt.pm @@ -504,8 +504,12 @@ sub normal # broadcast_ak1a(pc19($dxchan, $node), $dxchan, $self) unless $dxchan->{isolate}; } - if ($field[2] eq $main::mycall || $field[2] eq $main::myalias || $field[1] eq $main::myalias || $field[1] eq $main::mycall) { - dbg('chan', "LOOP: trying to connect myself!"); + if ($field[1] eq $main::mycall || $field[2] eq $main::mycall) { + dbg('chan', "LOOP: trying to alter config on this node from outside!"); + return; + } + if ($field[2] eq $main::myalias && DXChannel->get($field[1])) { + dbg('chan', "LOOP: trying to connect sysop from outside!"); return; } unless ($node) { @@ -568,8 +572,12 @@ sub normal dbg('chan', "$field[2] no PC19 yet, autovivified as node"); # broadcast_ak1a(pc19($dxchan, $node), $dxchan, $self) unless $dxchan->{isolate}; } - if ($field[2] eq $main::mycall || $field[2] eq $main::myalias || $field[1] eq $main::myalias || $field[1] eq $main::mycall) { - dbg('chan', "LOOP: trying to disconnect me!"); + if ($field[1] eq $main::mycall || $field[2] eq $main::mycall) { + dbg('chan', "LOOP: trying to alter config on this node from outside!"); + return; + } + if ($field[1] eq $main::myalias && DXChannel->get($field[1])) { + dbg('chan', "LOOP: trying to disconnect sysop from outside!"); return; } unless ($node) { 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); -- 2.34.1