home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hacker Chronicles 2
/
HACKER2.BIN
/
550.TNL7B.C
< prev
next >
Wrap
Text File
|
1988-05-14
|
22KB
|
578 lines
/*****************************************************************************/
/* */
/* */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* *************** *************** */
/* ***************** ***************** */
/* *************** *************** */
/* ***** ***** TheNet */
/* ***** ***** Portable. Compatible. */
/* ***** ***** Public Domain */
/* ***** ***** NORD><LINK */
/* */
/* This software is public domain ONLY for non commercial use */
/* */
/* */
/*****************************************************************************/
/* Level 7B, Befehlsinterpreter, Befehle */
/* Version 1.01 */
/* Hans Georg Giese, DF2AU, Hinter dem Berge 5, 3300 Braunschweig */
/* 08-MAY-88 */
# include "tndef.h" /* Definition von Konstanten */
# include "tntyp.h" /* Definition der Typen */
# include "tnl7be.h" /* externe Definitionen */
/*---------------------------------------------------------------------------*/
VOID ccpcon() /* CONNECT Befehl */
{
char call[7]; /* User Call */
char digil[57]; /* Downlink Digiliste */
char node[6]; /* Ziel Node */
char *cpoisa; /* Temp fuer clipoi */
unsigned ccntsa; /* Temp fuer clicnt */
unsigned iscall; /* Ergebniss der Suche nach Call */
unsigned isnode; /* Ergebniss der Suche nach Node */
unsigned cnt; /* Scratch Zaehler */
usrtyp *usrpoi; /* aktueller User beim Suchen */
l2ltyp *frelnk; /* freier lnkpoi Platz */
l2ltyp *p_cblk; /* Partner lnkpoi Block */
if (!ismemr()) return; /* noch Platz? */
if (clicnt != 0) /* ohne Parameter -> Host connecten */
{
cpoisa = clipoi; /* Parameter des Aufrufs retten */
ccntsa = clicnt;
isnode = getide(node); /* Node angegeben? */
clipoi = cpoisa; /* Aufrufparameter zurueck */
clicnt = ccntsa;
if (
(((iscall = ((getcal(&clicnt, &clipoi, VCpar, call) == 1) &&
(getdig(&clicnt, &clipoi, 0, digil) != -1))
) == 1)
&& (digil[0] == 0)
&& (seades(call) == 1))
|| ((isnode == 1) && (isidnt(node) == 1)))
{
/*=== Node soll connected werden ============================================*/
for (cnt = 0, cirpoi = cirtab; cnt < NUMCIR; ++cnt, ++cirpoi)
{ /* freien Platz in CIRTAB suchen */
if (cirpoi->state3 == 0) break;
}
if (cnt != NUMCIR) /* Erfolg dabei? */
{
userpo->cblk_p = (l2ltyp *) cirpoi; /* in User Block eintragen */
userpo->typ_p = 4; /* und Usertyp eintragen */
userpo->status = 2; /* Staus: connect requested */
cpyid(cirpoi->downca, despoi->nodcal);
cpyid(cirpoi->upcall, usrcal);/* User Call merken */
cirpoi->l3node = despoi; /* CIRTAB Eintrag mit Userdaten */
newcir(); /* Circuit aufbauen */
}
else puttfu("Circuit"); /* kein Platz: melden */
return;
}
/*=== User soll connected werden ============================================*/
if (iscall == 1) /* gueltiges Call? */
{
/* Antwort auf CQ-Ruf? */
for (usrpoi = (usrtyp *) usccpl.lnext;
(usrtyp *) &usccpl != usrpoi;
usrpoi = usrpoi->unext)
{ /* Userliste absuchen */
if ((usrpoi->status == 2) /* Status muss stimmen */
&&(usrpoi->typ_p == 2) /* gesuchter Partner muss stimmen */
&&((p_cblk = usrpoi->cblk_p)->state == 0)) /* und noch kein L2 */
{
if (cmpid(p_cblk->srcid, call) == 1) /* und eigenes Call */
{
disusr(p_cblk, 2); /* dann aus CCP entfernen */
for (ptcrdp = ptcrdl; ptcrdp->luserl != 0; ptcrdp += 2)
; /* freier Eintrag links */
makcon(usrpoi); /* Verbindung herstellen */
++ptcrdp; /* auf rechte Seite */
frelnk = (l2ltyp *) userpo;
userpo = usrpoi;
makcon(usrpoi = (usrtyp *) frelnk); /* zweite Seite */
kilusr(); /* Partner loeschen */
userpo = usrpoi;
kilusr(); /* eigenen Eintrag loeschen */
return;
}
}
}
/* Connect in L2 absetzen */
invsid(); /* SSID aendern */
for (p_cblk = 0, cnt = 0, lnkpoi = lnktbl; /* freien Eintrag finden */
cnt < MAXL2L; ++cnt, ++lnkpoi)
{
if (lnkpoi->state != 0) /* Eintrag leer? */
{
if ((cmpid(lnkpoi->srcid, usrcal) == 1)
&& (cmpid(lnkpoi->dstid, call) == 1))
{
msgfrm('D', lnkpoi, 2, dmmsg); /* nicht gleiche Partner 2-mal */
return;
}
}
else /* leerer Eintrag gefunden: */
{
if ((! p_cblk) && (lnkpoi->srcid[0] == 0))
p_cblk = lnkpoi; /* den ersten merken */
}
}
if (p_cblk != 0) { /* freier Platz da? */
lnkpoi = p_cblk; /* merken */
setl2b(); /* L2 Block initialisieren */
cpyid(lnkpoi->dstid, call); /* Partner Call */
cpyidl(lnkpoi->viaid, digil); /* Digipeater */
lnkpoi->liport = 0; /* Port ist HDLC */
newlnk(); /* an Level2 melden */
}
else { /* alles voll */
puttfu("Link"); /* melden */
}
}
else invcal();
return;
}
/*=== Host soll connected werden ============================================*/
for (cnt = 0, hstusr = hstubl; /* alle Hostkanaele absuchen */
cnt < MAXHST;
++cnt, ++hstusr) {
if (! hstusr->conflg) /* dieser Kanal belegt? */
break;
}
if (cnt != MAXHST) { /* freien Kanal gefunden? */
userpo->cblk_p = (l2ltyp *) hstusr; /* Host als Partner eintragen*/
userpo->typ_p = 0; /* Usertyp ist Host */
userpo->status = 2; /* neuer Status: connect requested */
cpyid(hstusr->call, usrcal); /* Usercall in Hostblock eintragen */
hstreq(); /* Request an Hostinterface leiten */
return;
}
else puttfu("Host"); /* kein Kanal frei */
}
/*---------------------------------------------------------------------------*/
ccpcq() /* CQ-Ruf starten */
{
unsigned cnt; /* Scartch Zaehler */
mhtyp *mbhd; /* Buffer fuer Meldung */
if (ismemr() == 1) /* Platz genug? */
{
for (cnt = 0, lnkpoi = lnktbl; cnt < MAXL2L; ++cnt, ++lnkpoi)
{ /* freien Platz in L2-Liste suchen */
if ((lnkpoi->state == 0) && (lnkpoi->srcid[0] == 0))
break;
}
if (cnt < MAXL2L)
{
invsid(); /* SSID umdrehen */
setl2b(); /* L2 Kontrollblock initialisieren */
if (cqen == 1) /* CQ-Ruf zulaessig? */
{
(mbhd = (mhtyp *) allocb())->pid = 0xf0; /* PID setzen */
while (clicnt != 0) /* Rest der Zeile ist Meldung */
{
putchr(*clipoi++, mbhd); /* umkopieren */
--clicnt;
}
putchr(0x0d, mbhd); /* Zeilenende anhaengen */
rwndmb(mbhd); /* Pointer auf Null */
sdui(cqdil, cqdest, usrcal, 0, mbhd); /* senden */
dealmb(mbhd); /* Buffer wieder freigeben */
}
}
else /* Tabelle ist voll */
puttfu("Link"); /* melden */
}
}
/*---------------------------------------------------------------------------*/
VOID ccpide() /* Befehl INFO */
{
mhtyp *bufpoi; /* Buffer fuer Meldung */
unsigned chaptr;
if (issyso() == TRUE) /* Sysop setzt Zusatz? */
{
chaptr = 0;
while (clicnt-- != 0)
{
infmsg[chaptr++] = *clipoi++;
}
infmsg[chaptr] = 0;
}
bufpoi = putals(DEFINF); /* Info mit Header */
putchr('\015', bufpoi);
putstr(infmsg, bufpoi); /* Zusatzinfo */
seteom(bufpoi); /* Endekennung dran */
}
/*---------------------------------------------------------------------------*/
VOID ccpnod() /* NODES Befehl */
{
char newcal[7]; /* neues Call */
char niden[6]; /* neuer Ident */
char *cpoisa; /* temp fuer clipoi */
BOOLEAN alles; /* versteckte Nodes auch zeigen */
unsigned nobc; /* neuer Abwesenheitszaehler */
unsigned wegcnt; /* Zaehler fuer Wege in Ausgabe */
unsigned aender; /* Aenderungsmode: + oder - */
unsigned iscall; /* Ergebniss des Tests auf gueltiges Call */
unsigned isnode; /* Ergebniss des Tests auf gueltigen Node */
unsigned ccntsa; /* temp fuer clicnt */
BOOLEAN neupar; /* neue Parameter in der Zeile */
unsigned cnt; /* Scratch Zaehler */
unsigned leer; /* Leerzeichen bis zum naechsten Node */
mhtyp *bufpoi; /* Buffer fuer Meldung an User */
wegtyp *actweg; /* aktueller Weg der Ausgabe */
nbrtyp *nabar; /* Nachbar fuer aktuellen Node */
alles = FALSE; /* default: keine versteckten Nodes */
if (clicnt != 0) /* mit Argument aufgerufen? */
{
cpoisa = clipoi; /* Befehlszeile retten */
ccntsa = clicnt;
isnode = getide(niden); /* Test auf Node Namen */
clipoi = cpoisa; /* Befehlszeile zurueck */
clicnt = ccntsa;
iscall = getcal(&clicnt, &clipoi, VCpar, newcal); /* Test auf Call */
clipoi = cpoisa; /* Befehlszeile zurueck */
clicnt = ccntsa;
while (clicnt != 0)
{
if (*clipoi == ' ') break;
++clipoi; /* Call bzw Ident ueberlesen */
--clicnt;
}
if ((iscall == 1) /* alle Nodes oder was spezielles gefragt? */
|| (isnode != -1))
{
neupar = FALSE; /* default: keine neuen Parameter */
if ((issyso() == 1) /* nur Sysop darf aendern */
&& (iscall == 1)) /* wenn er ein Call angibt */
{
--clicnt; /* Aenderungsmode uebergehen */
if (((aender = *clipoi++) == '+') /* nur + oder - erlaubt */
|| (aender == '-'))
{
/*=== Node Parameter aendern ================================================*/
if ((skipsp(&clicnt, &clipoi) == 1) /* Parameter holen */
&& ((isnode = getide(niden)) != -1)) /* Ident */
{
if (getqua() == 1) /* Qualitaet holen */
{
if ((skipsp(&clicnt, &clipoi) == 1)
&& ((nobc = nxtnum(&clicnt, &clipoi)) <= 255))
{
if (getpar() == 1) neupar = TRUE; /* Port, Digis, Nachbar */
}
}
}
}
}
else if (isnode == 0) alles = 1; /* Sternchen eingegeben */
if (neupar == TRUE) { /* neue Werte spezifiziert */
if (chgnod(aender, nobc, nquali, nport, ndigi, ncall, niden, newcal)
== 0) {
puttfu("Routing"); /* hat nicht geklappt, Ende */
return;
}
}
if (((iscall == TRUE) && (seades(newcal) == 1)) /* gueltiges Call */
|| ((isnode == TRUE) && (isidnt(niden) == 1))) { /* Node? */
putnod(bufpoi = putals("Routes to: ")); /* gueltig: */
for (wegcnt = 0; wegcnt < despoi->wege; ++wegcnt)
{ /* alle Wege zeigen */
nabar = (actweg = &despoi->weg[wegcnt])->nachba;
putstr((((despoi->actrou != 0) && (despoi->wegnr == wegcnt)) ?
"\015> " : "\015 "), bufpoi); /* aktiven Weg markieren */
putnum((actweg->qualit) &0xff, bufpoi);
putchr(' ', bufpoi);
putnum((actweg->obscnt) &0xff, bufpoi);
putnbr(nabar, bufpoi); /* Nachbarn Zeigen */
}
seteom(bufpoi); /* Ende anhaengen */
return;
}
}
}
/*=== Nodes anzeigen ========================================================*/
bufpoi = putals("Nodes:"); /* Kopfzeile holt Buffer */
cnt = 0; /* Nummer des Eintrages */
for (despoi = (nodtyp *) destil.lnext; /* gesamte Liste */
(nodtyp *) &destil != despoi;
despoi = (nodtyp *) despoi->nodlnk.lnext) {
if (despoi->nodcal[0] != 0) { /* Eintrag definiert? */
if ((despoi->nodide[0] != '#')
|| (alles == TRUE)) { /* auch versteckte Nodes zeigen? */
if ((cnt++ & 0x03) == 0) /* 4 Nodes in eine Zeile */
putchr('\015', bufpoi);
bufpoi->l4time = bufpoi->putcnt;
putnod(bufpoi); /* Node ausgeben */
putspa(19, bufpoi); /* Abstand zum Nachbarn */
} } }
seteom(bufpoi); /* Endekennung anhaengen */
}
/*---------------------------------------------------------------------------*/
VOID ccppar() /* PARMS Befehl */
{
unsigned laenge; /* Laenge der Zeile bisher */
unsigned newval; /* neuer Wert des Parameters */
unsigned parnum; /* Nummer des aktuellen Parameters */
mhtyp *bufpoi; /* Message Buffer */
partyp *parpoi; /* Pointer auf aktuellen Parameter */
bufpoi = putals(""); /* Kopfzeile */
for (laenge = 0, parnum = 0, parpoi = partab;
parnum < (sizeof(partab) / sizeof(struct param));
++parnum, ++parpoi) /* alle Parameter */
{
if (issyso() == TRUE) /* Sysop am anderen Ende? */
{
if (*clipoi != '*') /* Wert aendern? */
{
newval = nxtnum(&clicnt, &clipoi); /* neuen Wert holen */
if ((newval >= parpoi->minimal) && (newval <= parpoi->maximal))
*(parpoi->paradr) = newval;
else clicnt = 0; /* Fehler: Rest vergessen */
}
else /* Parameter bleibt: */
{
--clicnt; /* das Sternchen verbrauchen */
++clipoi;
}
}
if ((bufpoi->putcnt - laenge) > 72)
{
putchr('\15', bufpoi); /* neue Zeile */
laenge = bufpoi->putcnt;
}
else putchr(' ', bufpoi);
putnum(*(parpoi->paradr), bufpoi); /* Wert ausgeben */
}
seteom(bufpoi); /* Endekennung anhaengen */
}
/*---------------------------------------------------------------------------*/
VOID ccprou() /* ROUTES Befehl */
{
unsigned mode;
mhtyp *mbhd;
nbrtyp *neigb;
neigb = NULL; /* default: kein Nachbar */
if (clicnt != 0) /* aendern oder zeigen? */
{
if (getpar() == TRUE) /* Nachbardaten holen */
{
neigb = (nbrtyp *) getnei(ndigi, ncall, nport); /* existiert Nachbar?*/
if (issyso() == TRUE) /* nur SYSOP darf aendern */
{
--clicnt;
mode = *clipoi++; /* Modus holen, merken */
if (getqua() == TRUE) /* Qualitaet muss passen */
{
if (mode == '+') /* blockieren? */
{
if (!neigb) /* Nachbar existiert nicht? */
neigb = (nbrtyp *) updnbr(ndigi, ncall, nport); /* erzeugen */
neigb->pathqu = nquali; /* neue Daten setzen */
neigb->locked = TRUE; /* blockieren */
}
else
{
if (mode == '-') /* freigeben? */
{
if (neigb != NULL) /* nur wenn Nachbar existiert*/
{
neigb->pathqu = nquali; /* neue Daten setzen */
neigb->locked = FALSE; /* nicht blockieren */
if (neigb->nbrrou == 0) /* wenn keine Wege aktiv */
{
dealoc(unlink(neigb)); /* Eintrag loeschen */
neigb = NULL;
}
}
}
}
}
}
}
}
mbhd = putals("Routes:"); /* neue Daten zeigen */
if (!neigb) /* kein Nachbar angegeben */
{
for (neigb = (nbrtyp *) neigbl.lnext;
(nbrtyp *) &neigbl != neigb;
neigb = (nbrtyp *) neigb->nbrlnk.lnext)
{ /* alle Wege zeigen */
putrou(neigb, mbhd);
}
}
else
putrou(neigb, mbhd); /* sonst Wege des Nachbarn */
seteom(mbhd); /* Ende Kennung anhaengen */
}
/*---------------------------------------------------------------------------*/
VOID ccpres() /* RESET Befehl */
{
if (userpo->sysflg == TRUE) /* darf nur der Sysop */
{
magicn = 0; /* immer Kaltstart */
reset();
}
}
/*---------------------------------------------------------------------------*/
VOID ccplow() /* LOW Befehl */
{
if (issyso() == TRUE) /* darf nur der Sysop */
{
switch (nxtnum(&clicnt, &clipoi))
{
case 0:
CONled(FALSE);
break;
case 1:
STAled(FALSE);
break;
}
}
}
/*---------------------------------------------------------------------------*/
VOID ccphig() /* HIGH Befehl */
{
if (issyso() == TRUE) /* darf nur der Sysop */
{
switch (nxtnum(&clicnt, &clipoi))
{
case 0:
CONled(TRUE);
break;
case 1:
STAled(TRUE);
break;
}
}
}
/*---------------------------------------------------------------------------*/
VOID ccpsys() /* SYSOP Befehl */
{
unsigned num; /* Zufallszahl fuer Zeichenauswahl */
unsigned cnt; /* Scratch Zaehler */
unsigned chk; /* Check Zaehler */
mhtyp *bufpoi; /* Buffer fuer Passwort-Zahlen */
if (paswle != 0) /* ohne Passwort kein Sysop */
{
bufpoi = putals(""); /* Buffer besorgen */
for (cnt = 0; cnt < 5; ++cnt) /* 5 Zahlen ausgeben */
{
do
{
do;
while (((num = random()) >= paswle) /* Zufallszahl holen */
|| (paswrd[num] == ' ')); /* gueltiges Zeichen? */
for (chk = 0; chk < cnt; ++chk) /* keine Zahl doppelt */
{
if ((userpo->paswrd[chk] & 0xff) == num) break;
}
}
while (cnt != chk);
userpo->paswrd[cnt] = num; /* neue Zahl merken */
putchr(' ', bufpoi);
putnum(num +1, bufpoi); /* dem User mitteilen */
}
seteom(bufpoi); /* Ende Kennung anhaengen */
userpo->status = 3; /* neuer Status: Passwort soll kommen */
}
}
/*---------------------------------------------------------------------------*/
VOID ccpuse() /* USERS Befehl */
{
unsigned cnt; /* Scratch Zaehler */
mhtyp *bufpoi; /* MBHD fuer Meldungen */
usrtyp *userp; /* Userkontrollblock fuer CCP User */
l2ltyp *ucblk; /* L2 User Kontrollblock */
bufpoi = putals(signon); /* Kopf */
putnum(nmbfre, bufpoi); /* freie Buffer */
putchr(')', bufpoi);
/* erst die User mit Partner */
for (cnt = 0, ptcrdp = ptcrdl; /* Patchcord Liste absuchen */
cnt < ((NUMPAT +1) /2);
++cnt, ptcrdp += 2) /* nur "linke" Eintraege */
{
if (ptcrdp->luserl != NULL) /* Eintrag belegt? */
{
putchr('\015', bufpoi);
bufpoi->l4time = bufpoi->putcnt; /* Zeichen im Buffer merken */
putuse('L', ptcrdp->luserl, ptcrdp->lusert, bufpoi); /* linke Seite */
putspa(35, bufpoi); /* Leerzeichen als Trennung */
putstr(" <--> ", bufpoi); /* Verbindung steht */
putuse('R', (ptcrdp +1)->luserl, (ptcrdp +1)->lusert, bufpoi);
/* rechte Seite */
}
}
for (userp = (usrtyp *) usccpl.lnext; /* nun die User am CCP */
(usrtyp *) &usccpl != userp; /* bis zum Ende der Liste */
userp = userp->unext)
{
putchr('\15', bufpoi); /* neue Zeile je User */
bufpoi->l4time = bufpoi->putcnt; /* Zeichen im Buffer merken */
putuse('L', userp->cblk_u, userp->typ_u, bufpoi); /* immer links */
if (userp->status == 2) /* Connect laeuft? */
{
putspa(35, bufpoi); /* Trennung */
putstr(" <..> ", bufpoi); /* Verbindung wartet */
if ((userp->typ_p == 2) /* wird L2 Verbindung? */
&&((ucblk = userp->cblk_p)->state == 0)) /* Status: connect laeuft */
{
putstr("CQ(", bufpoi); /* Partner ist "CQ" */
putid(ucblk->srcid, bufpoi);
putchr(')', bufpoi);
}
else /* andere L2 Verbindung */
putuse('R', userp->cblk_p, userp->typ_p, bufpoi);
}
}
seteom(bufpoi); /* Ende der Meldung setzen */
}
/*--- Ende Level7B ----------------------------------------------------------*/