home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hacker Chronicles 2
/
HACKER2.BIN
/
552.TNL7C.C
< prev
next >
Wrap
Text File
|
1988-05-14
|
20KB
|
539 lines
/*****************************************************************************/
/* */
/* */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* *************** *************** */
/* ***************** ***************** */
/* *************** *************** */
/* ***** ***** TheNet */
/* ***** ***** Portable. Compatible. */
/* ***** ***** Public Domain */
/* ***** ***** NORD><LINK */
/* */
/* This software is public domain ONLY for non commercial use */
/* */
/* */
/*****************************************************************************/
/* Level 7C, Hostinterface */
/* Version 1.01 */
/* Hans Georg Giese, DF2AU, Hinter dem Berge 5, 3300 Braunschweig */
/* 02-APR-88 */
# include "tndef.h" /* Definition von Konstanten */
# include "tntyp.h" /* Definition der Typen */
# include "tnl7ce.h" /* externe Definitionen */
/*---------------------------------------------------------------------------*/
VOID hosini() /* Hostinterface initialisieren */
{
hstusr = &hstubl[0]; /* Pointer auf Kontrollblock setzen */
hstusr->conflg = /* Host ist nicht connected */
hstusr->disflg = /* kein Disconnect nach Info-senden */
hstusr->inlin = /* keine Zeilen von Eingabe da */
hstusr->outlin = /* keine Zeilen fuer Ausgabe da */
blixfl = /* Host darf nicht connected werden */
hostco = /* Host darf nicht connected werden */
blicnt = 0; /* Eingabezeile ist leer */
inithd(&hstusr->inbuf); /* Listenkopf Eingabepuffer initialisieren */
inithd(&hstusr->outbuf); /* Listenkopf Ausgabepuffer initialisieren */
magicn = 0x4d5a; /* Flag fuer Warmstart setzen */
}
/*---------------------------------------------------------------------------*/
VOID hostsv() /* Hostinterface Service */
{ /* regelmaessig von MAIN aufgerufen */
char zeichen; /* Scratch fuer Eingabehandling */
mhtyp *mbuff; /* Messagebuffer */
hstusr = &hstubl[0]; /* Pointer auf Kontrollblock setzen */
hstsen(0); /* falls Info vorhanden: senden, wenn Platz */
if (((hstusr->disflg & 0x80) != 0) /* Disconnect gefordert? */
&& (hstusr->outlin == 0)) /* und Info gesendet? */
hstdis(); /* dann disconnecten */
if (! blicnt && ! blixfl) { /* Zeile leer und kein X-OFF gekommen? */
/* dann Ausgabe versuchen */
while (! ishput() && hstusr->outlin != 0) /* SIO frei und was da? */
{
mbuff = (mhtyp *) unlink(hstusr->outbuf.lnext); /*Buffer aus Kette */
hstusr->outlin -=1; /* eine Zeile weniger */
while (mbuff->getcnt < mbuff->putcnt) /* Info ausgeben */
{
zeichen = (getchr(mbuff) &0x7f); /* Zeichen holen */
if (zeichen == 0x7f) zeichen = 0x08; /* RUBOUT wird Backspace */
if ((zeichen >= ' ') || (zeichen == 0x0a) ||
(zeichen == 0x07) || (zeichen == 0x09))
hputc(zeichen); /* druckbare Zeichen ausgeben*/
else
{
if (zeichen == 0x0d)
{
hputc(zeichen); /* CR wird CR-LF */
hputc(0x0a);
}
else /* andere Kontrollzeichen */
{
hputc('^'); /* mit Prefix */
hputc(zeichen + '@');
}
}
}
dealmb(mbuff); /* Buffer freigeben */
}
}
if (ishget() == 1) { /* Zeichen von Eingabe bereit? */
zeichen = hgetc() & 0x7f; /* dann holen, ohne Parity */
if (! blicnt) /* erstes Zeichen der Zeile? */
blipoi = bline; /* Pointer auf Anfang setzen */
switch(zeichen) {
/*==============================*/
case 0x0d: /* Ende der Zeile */
hputc(zeichen); /* Echo fuer <CR> */
hputc(0x0a); /* <LF> anhaengen */
blipoi = bline; /* Pointer auf Anfang fuer Verarbeitung */
if ((blicnt != 0) /* etwas eingegeben? */
&& (*blipoi == defESC)) /* und erstes Zeichen = <ESC>? dann Befehl */
{
++blipoi; /* erstes Zeichen ist verarbeitet */
--blicnt; /* Zahl der Zeichen -1 */
hstcmd(); /* Befehl verarbeiten */
}
else /* Zeile kein Befehl: */
{
if ((hstusr->conflg != 0) /* Host connected? */
&& ((nmbfre > 64) /* noch Platz im Speicher? */
&& ((hstusr->disflg & 0x80) == 0))) /* kein DISC eingeleitet? */
{
mbuff = (mhtyp *) allocb(); /* Buffer holen */
while (blicnt--) /* Zeile uebertragen */
putchr(*blipoi++, mbuff);
putchr('\15', mbuff);/* <CR> anhaengen */
rwndmb(mbuff); /* alle Bufferpointer wieder auf 0 */
relink(mbuff, hstusr->inbuf.lprev); /* in Kette haengen */
++hstusr->inlin; /* Zahl der Zeilen +1 */
}
}
blicnt = 0;
break;
/*==============================*/
case 0x08: /* Backspace */
case 0x7f: /* Rubout */
if (blicnt != 0) bliloe(); /* Zeichen loeschen - wenn vorhanden */
break;
/*==============================*/
case 0x15: /* ctl-u = Zeile loeschen */
case 0x18: /* ctl-x = Zeile loeschen */
while (blicnt != 0) bliloe(); /* alles killen */
break;
/*==============================*/
case 0x11: /* X-ON */
blixfl = FALSE;
break;
/*==============================*/
case 0x13: /* X-OFF */
blixfl = TRUE;
break;
/*==============================*/
default: /* sonstiges Zeichen */
if (blicnt < 255) { /* noch Platz in der Zeile? */
blieco(zeichen); /* Echo ausgeben */
*blipoi++ = zeichen; /* Zeichen in Buffer */
++blicnt; /* Zeilenlaenge zaehlen */
}
else hputc(0x07); /* kein Platz: meckern! */
break;
}
}
}
/*---------------------------------------------------------------------------*/
VOID hostim() /* Host Timerservice */
{ /* Aufruf jede Sekunde von MAIN */
hstusr = &hstubl[0]; /* Pointer auf Userblock setzen */
if (hstusr->conflg != 0) /* wenn Host connected */
{
if ((hstusr->noact2 != 0) /* und Timeout noch nicht 0 */
&& (--hstusr->noact2 == 0)) /* Timeout runterzaehlen */
hstdis(); /* bei 0 abwerfen */
}
}
/*---------------------------------------------------------------------------*/
VOID hstreq() /* Connect Request an Host */
{
if (hostco == 1) hstcon(); /* ausfuehren, wenn erlaubt */
else { /* sonst anklopfen */
bstrng("\015\012CONNECT REQUEST fm ");
bcalou(hstusr->call); /* Call melden */
bbel(); /* bimmeln */
l2tol7(3, hstusr, 0); /* mit DM nach unten melden */
}
}
/*---------------------------------------------------------------------------*/
VOID hstout() /* Host Interface Timeout */
{
dealml(& hstusr->inbuf); /* eingegebene Zeilen loeschen */
hstusr->inlin = 0;
hstusr->disflg |= 0x80; /* Abwurf verlangen */
}
/*---------------------------------------------------------------------------*/
BOOLEAN hstrec(conflg, ublk) /* Info fuer Host zeigen */
mhtyp *ublk; /* User Kontroll Block */
BOOLEAN conflg; /* Congestion Flag */
{
hustyp *cblk; /* lokaler Kontrollblock */
cblk = (hustyp *) ublk->l2lnk; /* auf Host-Kontollblock */
if ((conflg == 1) || (cblk->outlin < conctl)) /* noch Platz ? */
{
relink(unlink(ublk), cblk->outbuf.lprev); /* Buffer umhaengen */
++cblk->outlin; /* eine Zeile mehr */
cblk->noact2 = ininat; /* Timeout neu setzen */
return (TRUE); /* OK, Info ist auf dem Weg */
}
else return (FALSE); /* Fehler, hat nicht funktioniert */
}
/*---------------------------------------------------------------------------*/
VOID blieco(zeichen) /* Echo fuer Hostterminal */
char zeichen;
{
if (blicnt == 0 && zeichen == defESC) /* erstes Zeichen und <ESC>? */
bstrng("* "); /* dann * als Echo */
else { /* alle anderen Zeichen */
if (zeichen >= ' ' || zeichen == 0x07) /* druckbar oder BELL? */
hputc(zeichen); /* dann Echo */
else { /* sonstige Kontrolzeichen */
hputc('^'); /* Prefix */
hputc(zeichen + '@'); /* Zeichen - druckbar gemacht */
}
}
}
/*---------------------------------------------------------------------------*/
VOID bliloe() /* 1 Zeichen am Hostterminal loeschen */
{
char zeichen; /* Scratch */
if ((zeichen = *(--blipoi)) != 0x07) { /* Sonderfall BELL */
bputbs(); /* Zeichen loeschen */
if (zeichen < ' ') bputbs();/* Controlzeichen: Prefix + Zeichen loeschen */
}
else hputc(zeichen); /* BELL wird wiederholt */
--blicnt; /* Zeilenlaenge -1 */
}
/*---------------------------------------------------------------------------*/
VOID bputbs() /* Backspace an Hostterminal */
{
bstrng("\010 \010"); /* Backspace soll destruktiv sein */
}
/*---------------------------------------------------------------------------*/
VOID hstcmd() /* Befehl an Hostinterface ausfuehren */
{
char *paspoi; /* Pointer in Passwort (<ESC>-P) */
char zeichen; /* Scratch */
unsigned arg; /* Argument des Befehls */
unsigned cnt; /* Scratch */
skipsp(&blicnt, &blipoi); /* Leerzeichen am Anfang uebergehen */
if (blicnt != 0) { /* ueberhaupt was da? */
zeichen = upcase(*blipoi++);/* Befehl - erstes Zeichen - holen */
--blicnt; /* ein Zeichen ist verbraucht */
skipsp(&blicnt, &blipoi); /* Rest bis zum Argument ueberlesen */
switch(zeichen) {
/*==============================*/
case 'C': /* Host an TNC connecten */
if (hstusr->conflg == 0) { /* schon connected? Dann uebergehen */
cpyid(hstusr->call, myid); /* Host ist am TNC */
hstcon(); /* an alle melden */
}
break;
/*==============================*/
case 'D': /* Host vom TNC disconnecten */
if (hstusr->conflg != 0) { /* schon disconnected? Dann uebergehen */
hstsen(1); /* an alle melden, sofort alles senden */
hstdis(); /* Interface trennen, melden */
}
break;
/*==============================*/
case 'P': /* Passwort zeigen-eingeben */
if (blicnt == 0) { /* ohne Argument = zeigen */
bpromp(); /* neue Zeile, * */
paspoi = paswrd; /* auf Anfang des Passwortes */
for (cnt = 0; cnt < paswle; ++cnt)
bchout(*paspoi++); /* Passwort ausgeben */
bende(); /* und * am Ende */
}
else { /* neues Passwort setzen */
paspoi = paswrd; /* auf Anfang Passwort */
paswle = /* Laenge = 0 */
cnt = 0; /* eingegebene Zeichen = 0 */
while (blicnt-- != 0) { /* Rest der Zeile ist Passwort */
if ((zeichen = *blipoi++) != 0x0a) { /* Linefeed ueberlesen */
if ((*paspoi++ = zeichen) != ' ') /* Leerzeichen zaehlen nicht */
++cnt;
++paswle;
if (paswle == 80)
break; /* maximale Laenge erreicht? */
}
}
if (cnt < 5)
paswle = 0; /* Mindestlaenge muss eingehalten werden */
}
break;
/*==============================*/
case 'T': /* Keyup Delay zeigen-eingeben */
if (blicnt == 0) /* ohne Argument = zeigen */
bnuout(Tpar);
else { /* mit Argument = setzen */
if ((arg = nxtnum(&blicnt, &blipoi)) <= 255) /* holen, testen */
Tpar = arg; /* ok, merken */
else
invcmd(); /* meckern */
}
break;
/*==============================*/
case 'Y': /* Connect zu Host erlaubt j-n */
if (blicnt == 0) /* ohne Argument = zeigen */
bnuout(hostco);
else { /* mit Argument = setzen */
if ((arg = nxtnum(&blicnt, &blipoi)) <= 1) /* holen, testen */
hostco = arg; /* ok, merken */
else
invcmd(); /* meckern */
}
break;
/*==============================*/
case 'F': /* Full-Duplex j-n */
if (blicnt == 0) /* ohne Argument = zeigen */
bnuout(Dpar);
else /* mit Argument = setzen */
{
if ((arg = nxtnum(&blicnt, &blipoi)) <= 1) /* holen, testen */
{
if ((Dpar == FALSE) && (arg == TRUE))
{ /* Wechsel auf Full */
DIinc(); /* Interrupts aus */
Dpar = TRUE;
pushtx(); /* Sender anwerfen */
DECei(); /* Interrupts an */
}
Dpar = arg; /* ok, merken */
}
else
invcmd(); /* meckern */
}
break;
/*==============================*/
default : /* ungueltiger Befehl */
invcmd(); /* meckern */
break;
}
}
}
/*---------------------------------------------------------------------------*/
VOID hstcon() /* Host wird connected */
{
bstrng("\015\012CONNECTED to ");
bcalou(hstusr->call); /* Meldung mit Call und Bimmel */
bbel();
l2tol7(1, hstusr, 0); /* nach unten melden: Usrtyp, ctrl-blk, cmd */
hstusr->conflg = 1; /* Connect Flag setzen */
hstusr->noact2 = ininat; /* no-activity-timeout neu setzen */
}
/*---------------------------------------------------------------------------*/
VOID hstdis() /* Host wird disconnected */
{
dealml(& hstusr->inbuf); /* Eingabebuffer freigeben */
dealml(& hstusr->outbuf); /* Ausgabebuffer freigeben */
hstusr->inlin = /* keine Zeile in Eingabe */
hstusr->outlin = 0; /* keine Zeile in Ausgabe */
bstrng("\015\012DISCONNECTED fm ");
bcalou(hstusr->call); /* Meldung mit Call und Bimmel */
bbel();
l2tol7(2, hstusr, 0); /* nach unten melden: Usrtyp, ctrl-blk, cmd */
hstusr->conflg = /* Connect Flag ruecksetzen */
hstusr->disflg = 0; /* Abwurf ausgefuehrt markieren */
}
/*---------------------------------------------------------------------------*/
VOID hstsen(conflg) /* Host Sende Service */
BOOLEAN conflg; /* Congestion Flag, 0=normal, 1=alles sofort */
{
mhtyp *mbhd; /* Message Buffer Head der Info */
while (hstusr->inlin != 0) /* solange Zeilen vorhanden */
{
mbhd = (mhtyp *) hstusr->inbuf.lnext; /* MBHD aufbauen */
mbhd->l2lnk = (l2ltyp *) hstusr; /* User ist Host */
mbhd->usrtyp = 0; /* Usertyp setzen */
if (! fmlink(conflg, mbhd)) /* Frame senden, Fehler dabei? */
break; /* im Fehlerfalle Abbruch */
hstusr->inlin -=1; /* eine Zeile erledigt */
hstusr->noact2 = ininat; /* no-activity-timeout neu setzen */
}
}
/*---------------------------------------------------------------------------*/
VOID invcmd() /* ungueltigen Befehl melden */
{
bpromp(); /* am Anfang ein * */
bstrng("INVALID COMMAND"); /* meckern */
belend(); /* bimmeln und einen * */
}
/*---------------------------------------------------------------------------*/
VOID bcalou (call) /* Call auf Crosslink Kanal geben */
char *call;
{
char ssid; /* SSID des Calls */
char zeichen; /* aktuelles Zeichen */
unsigned z_zahl; /* Anzahl ausgegebener Zeichen */
for (z_zahl = 0; z_zahl < 6; ++z_zahl)
{
zeichen = *call++;
if (zeichen != ' ') bchout(zeichen);
}
ssid = (*call >> 1) & 0x0f;
if (ssid)
{
hputc('-');
bnumou(ssid);
}
}
/*---------------------------------------------------------------------------*/
VOID bnuout (zahl) /* Zahl auf Crosslink Kanal geben */
int zahl; /* eingerahmt in * * */
{
bpromp(); /* neue Zeile, * */
bnumou(zahl); /* Zahl */
bende(); /* und * am Ende */
}
/*---------------------------------------------------------------------------*/
VOID bnumou (zahl) /* Zahl auf Crosslink Kanal geben */
unsigned zahl;
{
BOOLEAN notnul; /* fuehrende Null j/n */
unsigned diviso; /* Stellenwert der aktuellen Stelle */
unsigned ziffer; /* aktuelle Ziffer */
unsigned numcnt; /* Zahl der ausgegebenen Ziffern */
notnul = FALSE;
diviso = 10000;
for(numcnt = 0; numcnt < 5; ++numcnt) {
ziffer = zahl / diviso;
if ((ziffer != 0) || (notnul == TRUE) || (diviso == 1)) {
hputc (ziffer + '0');
notnul = TRUE;
}
zahl %= diviso;
diviso /= 10;
}
}
/*---------------------------------------------------------------------------*/
VOID bpromp() /* Prompt auf Crosslink Kanal */
{
bstrng("* ");
}
/*---------------------------------------------------------------------------*/
VOID bende() /* Ende Kennung auf Crosslink Kanal */
{
bstrng(" *\015\12");
}
/*---------------------------------------------------------------------------*/
VOID belend() /* Ende mit BELL auf Crosslink Kanal */
{
bstrng(" *\007\015\012");
}
/*---------------------------------------------------------------------------*/
VOID bbel() /* BELL Ausgabe auf Crosslink Kanal */
{
bstrng("\015\012\007");
}
/*---------------------------------------------------------------------------*/
VOID bstrng (string) /* String auf Crossllink Kanal geben */
char *string;
{
while (*string != 0) hputc(*string++);
}
/*---------------------------------------------------------------------------*/
VOID bchout (c) /* Zeichen auf Crosslink Kanal geben */
char c;
{
if (c >= ' ') hputc(c);
else {
hputc('^');
hputc(c + '@');
}
}
/*---------------------------------------------------------------------------*/
BOOLEAN iswarm () /* Test auf Warmstart */
{
return (magicn == 0x4d5a); /* RAM noch intakt? dann Warmstart */
}
/*--- Ende Level 7c ---------------------------------------------------------*/