home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hacker Chronicles 2
/
HACKER2.BIN
/
554.TNL7U.C
< prev
next >
Wrap
Text File
|
1988-05-14
|
26KB
|
656 lines
/*****************************************************************************/
/* */
/* */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* ***** ***** */
/* *************** *************** */
/* ***************** ***************** */
/* *************** *************** */
/* ***** ***** TheNet */
/* ***** ***** Portable. Compatible. */
/* ***** ***** Public Domain */
/* ***** ***** NORD><LINK */
/* */
/* This software is public domain ONLY for non commercial use */
/* */
/* */
/*****************************************************************************/
/* Level 7, Utilities */
/* Version 1.01 */
/* Hans Georg Giese, DF2AU, Hinter dem Berge 5, 3300 Braunschweig */
/* 14-MAY-88 */
# include "tndef.h" /* Definition von Konstanten */
# include "tntyp.h" /* Definition der Typen */
# include "tnl7ue.h" /* externe Definitionen */
/*---------------------------------------------------------------------------*/
VOID kilusr() /* User abwerfen */
{
mhtyp *bufpoi; /* MBHD fuer Meldungen */
if ((bufpoi = userpo->mbhd) != 0) /* noch Info im Buffer? */
dealmb(bufpoi); /* dann vernichten */
dealoc(unlink(userpo)); /* User Kontrollblock auch wieder frei */
userpo = 0; /* Userpointer ungueltig machen */
}
/*---------------------------------------------------------------------------*/
VOID invcal() /* ungueltiges Rufzeichen melden */
{
putmsg("Invalid Call");
}
/*---------------------------------------------------------------------------*/
VOID makcon(usrp) /* Verbindung melden, Eintrag herstellen */
usrtyp *usrp; /* Userkontrollblock */
{
msgfrm('U', (ptcrdp->luserl = usrp->cblk_u),
(ptcrdp->lusert = usrp->typ_u), conmsg);
}
/*---------------------------------------------------------------------------*/
VOID msgfrm(seite, link, user, msg) /* Systemstatus melden */
unsigned seite; /* Uplink - Downlink */
ctyp *link; /* Kontrollblock des Users */
unsigned user; /* Usertyp: 0=Host, 2=Level2, 4=Circuit */
char *msg; /* Meldung */
{
mhtyp *bufpoi; /* MBHD der Meldung */
bufpoi = putals(msg); /* Meldung ausgeben */
if (seite == 'D') /* Downlink? */
{
if (user == 4) /* User ist Circuit? */
putalt(link->l3blk.l3node->nodide, bufpoi); /* dann Ident vorweg */
else /* Level2 oder Host? */
if (user == 0)
putalt(alias, bufpoi); /* bei Host auch Ident */
}
putid(calofs(seite, link, user), bufpoi); /* Call immer ausgeben */
seteom(bufpoi); /* Ende Kennung dazu */
}
/*---------------------------------------------------------------------------*/
VOID puttfu(name) /* Tabelle voll melden */
char *name; /* Tabellenname */
{
mhtyp *bufpoi; /* MBHD der Meldung */
putstr(" table full", (bufpoi = putals(name))); /* Meldung */
seteom(bufpoi); /* Ende Kennung dazu */
}
/*---------------------------------------------------------------------------*/
VOID putmsg(string) /* Meldung an User ausgeben */
char *string;
{
seteom(putals(string)); /* Meldung mit Endekennung raus */
}
/*---------------------------------------------------------------------------*/
mhtyp *putals(string) /* String nach Nodeident in neuen Buffer */
char *string; /* Rueckgabe: Pointer auf neuen Buffer */
{
mhtyp *bufpoi; /* neuer Buffer */
bufpoi = (mhtyp *) allocb(); /* neuen Buffer holen */
bufpoi->l2lnk = userpo->cblk_u; /* Level2 Kontrollblock in Buffer eintragen*/
bufpoi->usrtyp = userpo->typ_u; /* Usertyp */
putalt(alias, bufpoi); /* Ident schreiben */
putid(myid, bufpoi); /* Call schreiben */
putstr("> ", bufpoi); /* Trennzeichen */
putstr(string, bufpoi); /* String dazu */
return(bufpoi);
}
/*---------------------------------------------------------------------------*/
VOID putrou(neigb, mbhd) /* Weg zu einem Nachbarn ausgeben */
nbrtyp *neigb; /* Pointer auf den Nachbarn */
mhtyp *mbhd; /* Buffer fuer die Meldung */
{
putstr((neigb->nbrl2l == NULL)? "\015 " : "\015>", mbhd); /* aktiver Weg? */
putnbr(neigb, mbhd); /* Nachbarn ausgeben */
putchr(' ', mbhd); /* Leerraum */
putnum((neigb->pathqu & 0xff), mbhd); /* Qualitaet des Weges */
putchr(' ', mbhd); /* Leerraum */
putnum(neigb->nbrrou, mbhd); /* Zahl der Links */
if (neigb->locked == TRUE) /* Eintrag blockiert? */
putstr(" !", mbhd); /* dann markieren */
}
/*---------------------------------------------------------------------------*/
VOID putnbr(neigb, mbhd) /* Daten eines Nachbarn ausgeben */
nbrtyp *neigb; /* Pointer auf den Nachbarn */
mhtyp *mbhd; /* Buffer fuer die Meldung */
{
putchr(' ', mbhd); /* Trennzeichen */
putnum(neigb->nbrpor, mbhd); /* Port Nummer */
putchr(' ', mbhd); /* Trennzeichen */
putid(neigb->nbrcal, mbhd); /* Call */
putdil(neigb->nbrdil, mbhd); /* Digiliste */
}
/*---------------------------------------------------------------------------*/
VOID putuse(seite, link, typ, mbhd) /* User Daten in MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
unsigned typ; /* Usertyp: 0=Host, 2=Level2, 4=Circuit */
ctyp *link; /* Kontrollblock */
unsigned seite; /* L=uplink, R=downlink */
{
switch (typ) {
/*==============================*/
case 4: /* User ist Circuit */
putstr("Circuit(", mbhd);
putalt(link->l3blk.l3node->nodide, mbhd); /* Node ID */
putid(link->l3blk.downca, mbhd); /* Node Call */
putchr(' ', mbhd);
putid(link->l3blk.upcall, mbhd); /* User Call */
putchr(')', mbhd); /* Ende dieser Seite */
break;
/*==============================*/
case 2: /* User ist Level2 */
if (seite == 'L') { /* Uplink oder Downlink? */
putstr("Uplink(", mbhd); /* Uplink: */
putid(link->l2blk.dstid, mbhd); /* User Call */
putchr(')', mbhd);
}
else { /* Downlink: */
putstr("Downlink(", mbhd);
putid(link->l2blk.srcid, mbhd); /* User Call */
putchr(' ', mbhd);
putid(link->l2blk.dstid, mbhd); /* Gegenstation */
putchr(')', mbhd);
}
break;
/*==============================*/
default: /* User ist Host */
putstr("Host(", mbhd);
putalt(alias, mbhd); /* Host ID */
putid(myid, mbhd); /* Host Call */
putchr(')', mbhd);
break;
}
}
/*---------------------------------------------------------------------------*/
VOID putdil(liste, mbhd) /* Digiliste in MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
char *liste; /* Digiliste, 0 am Ende */
{
if (*liste != 0) { /* existiert die Liste? */
putstr(" via", mbhd);
while (*liste != 0) { /* so lange der Vorrat reicht */
putchr(' ', mbhd); /* Trennzeichen */
putid(liste, mbhd); /* Digi ausgeben */
liste += 7; /* naechster Digi */
}
}
}
/*---------------------------------------------------------------------------*/
VOID putid(call, mbhd) /* Call mit SSID in MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
char *call; /* Call */
{
char ssid; /* SSID des Calls */
char zeichen; /* Scratch bei Ausgabe */
unsigned cnt; /* zaehlt Zeichen */
for (cnt = 0; cnt < 6; ++cnt) { /* 6 Zeichen Call */
zeichen = *call++; /* naechstes Zeichen holen */
if (zeichen > ' ') /* druckbar? */
putchr(zeichen, mbhd); /* dann raus */
else { /* nicht druckbar: */
if (zeichen < ' ') { /* Leerzeichen uebergehen */
putchr('^', mbhd); /* Kontrollzeichen mit Prefix */
putchr((zeichen + '@'), mbhd);
}
}
}
ssid = (*call >> 1) & 0x0f; /* SSID passend schieben */
if (ssid != 0) { /* nur SSID != 0 ausgeben */
putchr('-', mbhd); /* mit Trennstrich */
putnum(ssid, mbhd);
}
}
/*---------------------------------------------------------------------------*/
VOID putnod(mbhd) /* Knoten Info in MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
{
putalt(despoi->nodide, mbhd); /* Ident ausgeben */
putid(despoi->nodcal, mbhd); /* und Call */
}
/*---------------------------------------------------------------------------*/
VOID putalt(ident, mbhd) /* Ident in Buffer MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
char *ident; /* auszugebender Ident */
{
if (*ident != ' ') { /* ueberhaupt definiert? */
putcal(ident, mbhd); /* dann ausgeben */
putchr(':', mbhd); /* Trennzeichen hinterher */
}
}
/*---------------------------------------------------------------------------*/
VOID putcal(call, mbhd) /* Call in Buffer MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
char call[]; /* auszugebendes Call */
{
char zeichen; /* Scratch fuer aktuelles Zeichen */
unsigned cnt; /* Zaehler fuer Zeichen im Call */
for (cnt = 0; cnt < 6; ++cnt) { /* Call ist immer 6 Zeichen lang */
zeichen = call[cnt];
if (zeichen == ' ') /* Leerzeichen nicht ausgeben */
break;
putchr(zeichen, mbhd);
}
}
/*---------------------------------------------------------------------------*/
VOID putnum(zahl, mbhd) /* Zahl in Buffer MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
unsigned zahl; /* auszugebende Zahl */
{
unsigned notnul; /* fuehrende Null j/n */
unsigned diviso; /* Stellenwert der aktuellen Stelle */
unsigned ziffer; /* aktuelle Ziffer */
unsigned numcnt; /* Zahl der ausgegebenen Ziffern */
notnul = 0;
diviso = 10000;
for(numcnt = 0; numcnt < 5; ++numcnt) {
ziffer = zahl / diviso;
if ((ziffer != 0) || (notnul == 1) || (diviso == 1)) {
putchr((ziffer + '0'), mbhd); /* Stelle ausgeben */
notnul = 1;
}
zahl %= diviso;
diviso /= 10;
}
}
/*---------------------------------------------------------------------------*/
VOID putstr(string, mbhd) /* String in Buffer MBHD legen */
mhtyp *mbhd; /* Kopf der Messageliste */
char *string; /* auszugebender String */
{
while (*string != 0) { /* so lange der Vorrat reicht */
putchr(*string++, mbhd); /* weg damit */
}
}
/*---------------------------------------------------------------------------*/
VOID putspa(stop, mbhd) /* bis stop die Zeile mit Space fuellen */
unsigned stop; /* Ende der Leerraeume */
mhtyp *mbhd; /* Buffer der Meldung */
{
unsigned cnt; /* Scratch Zaehler */
cnt = mbhd->l4time + stop - mbhd->putcnt;
while (cnt--)
{
putchr(' ', mbhd);
}
}
/*---------------------------------------------------------------------------*/
BOOLEAN getqua()
{
return (
(skipsp(&clicnt, &clipoi) == TRUE)
&& ((nquali = nxtnum(&clicnt, &clipoi)) <= 255)
);
}
/*---------------------------------------------------------------------------*/
BOOLEAN getpar() /* Parameter fuer Ziel holen */
{
return (
(skipsp(&clicnt, &clipoi) == TRUE)
&& ((nport = nxtnum(&clicnt, &clipoi)) < 2)
&& (getcal(&clicnt, &clipoi, VCpar, ncall) == TRUE)
&& (getdig(&clicnt, &clipoi, FALSE, ndigi) != ERROR)
);
}
/*---------------------------------------------------------------------------*/
getdig(laenge, inbuf, pflag, outbuf) /* Digiliste aus Buffer holen */
unsigned *laenge; /* Laenge des Eingabebuffers */
char *(*inbuf); /* Eingabebuffer */
char pflag; /* Call-pruefen Flag */
char *outbuf; /* Ziel fuer das Call */
{
char liste[8*7 +1]; /* Zwischenspeicher */
char *lispoi; /* Pointer in liste */
char *ibufer; /* Kopie von inbuf */
unsigned ilaeng; /* Kopie von laenge */
unsigned cnt; /* Zaehler, Scratch */
unsigned zeichen; /* Scratch */
unsigned caltyp; /* Typ des letzten Call: 0=leer, -1=niO, 1=OK*/
ibufer = *inbuf; /* eine Indirektion weniger */
ilaeng = *laenge;
if (getcal(&ilaeng, &ibufer, 0, liste) == 1) { /* Call da? */
lispoi = liste; /* koennte "VIA" vorher sein */
if (*lispoi++ == 'V') { /* stimmt erstes Zeichen? */
for (cnt = 0; cnt < 5; ++cnt) { /* ja: max 5 Zeichen testen */
zeichen = *lispoi++; /* naechstes Zeichen */
if (zeichen != ' ') { /* Ende von "VIA"? */
if (!((cnt == 0) && (zeichen == 'I') ||
(cnt == 1) && (zeichen == 'A')))
break; /* Rechtschreibung muss stimmen */
}
}
if (cnt == 5) { /* VIA + ' ' = 4 */
*inbuf = ibufer; /* wenn nicht VIA gefunden, korrigieren */
*laenge = ilaeng;
}
}
}
for (cnt = 0, lispoi = liste; cnt < 8; ++cnt, lispoi +=7)
{ /* maximal 8 Digis */
if (*laenge != 0)
{
if (((zeichen = *(*inbuf)) == '+')
||(zeichen == '-'))
break;
}
if ((caltyp = getcal(laenge, inbuf, pflag, lispoi)) == -1) /* ungueltig? */
return(-1); /* Abbruch */
if (caltyp == 0) break; /* nichts mehr da: Ende */
}
*lispoi = 0; /* Endekennung */
cpyidl(outbuf, liste); /* in Ziel kopieren */
return(*outbuf != 0); /* Erfolg melden */
}
/*---------------------------------------------------------------------------*/
getcal(laenge, inbuf, pflag, outbuf) /* Call aus Buffer holen */
unsigned *laenge; /* Laenge des Eingabebuffers */
char *(*inbuf); /* Eingabebuffer */
char pflag; /* Call-pruefen Flag */
char *outbuf; /* Ziel fuer das Call */
{
char call[7]; /* Zwischenspeicher */
char binsid; /* SSID, binaer */
char *bufpoi; /* Pointer in Call */
char zeichen; /* Scratch */
unsigned cnt; /* Zaehler, Scratch */
bufpoi = call; /* auf Anfang */
for (cnt = 0; cnt < 6; ++cnt) /* Zwischenspeicher loeschen */
*bufpoi++ = ' ';
*bufpoi = 0x60; /* kein SSID */
skipsp(laenge, inbuf); /* auf erstes Zeichen != ' ' */
bufpoi = call; /* wieder nach vorn */
cnt = 0; /* gelesene Zeichen = 0 */
while (*laenge != 0) { /* so lange Zeichen da sind */
if (((zeichen = upcase(*(*inbuf)))/* und gueltig */
== ' ' ) || (zeichen == ',')) break;
if (zeichen < ' ') return(ERROR);
if (zeichen == '-') { /* Trennung zum SSID? */
if ((cnt == 0) || (*laenge == 0))
return(ERROR); /* Fehler: kein Call oder SSID */
++(*inbuf); /* Trennung uebergehen */
--(*laenge);
if (*laenge == 0) return (ERROR); /* SSID angesagt, kommt aber nicht */
zeichen = *(*(inbuf)); /* erste Ziffer SSID holen */
if ((zeichen < '0') || (zeichen > '9'))
return(ERROR); /* ungueltige Ziffer */
++(*inbuf);
--(*laenge); /* Ziffer ist verbraucht */
binsid = (zeichen + 0xffd0); /* Binaer merken */
if (*laenge != 0) { /* noch Zeichen da? */
zeichen = *(*inbuf); /* holen */
if ((zeichen >= '0') && (zeichen <= '9')) { /* gueltige Ziffer? */
binsid *= 10; /* erste Ziffer eine Stelle nach links */
binsid += (zeichen + 0xffd0) ; /* + neue Ziffer */
if (binsid > 15)
return(ERROR); /* ungueltiger SSID */
++(*inbuf); /* letzte Ziffer verbrauchen */
--(*laenge);
}
}
call[6] = (binsid << 1) | 0x60; /* SSID merken */
break;
}
else { /* kein SSID, anderes Zeichen */
if (cnt++ == 6)
return(ERROR); /* Call zu lang */
*bufpoi++ = zeichen; /* Zeichen merken */
++(*inbuf); /* Lesepointer rauf */
--(*laenge);
}
}
/* Call ist im Buffer */
while (*laenge != 0) { /* Rest des Buffers ansehen */
zeichen = *(*inbuf); /* Zeichen holen */
if ((zeichen != ' ') && (zeichen != ','))
break; /* kein Trennzeichen, stop */
++(*inbuf); /* naechstes Zeichen */
--(*laenge);
if (zeichen == ',') break; /* Leerraum uebergehen */
}
if (cnt == 0) return(0); /* Call war leer */
if (fvalca(pflag, call) == ERROR)
return(ERROR); /* Call war ungueltig */
cpyid(outbuf, call); /* Call kopieren */
return(1); /* ok melden */
}
/*---------------------------------------------------------------------------*/
unsigned getide(buffer) /* Ident aus cli-Buffer holen */
char buffer[]; /* -1=kein Erfolg, 0=leer, 1=Erfolg */
{
char ident[6]; /* Zwischenspeicher */
char zeichen; /* Scratch */
unsigned cnt; /* Zaehler, Scratch */
cpy6ch(ident, nulide); /* Zwichenspeicher loeschen */
for (cnt = 0; (cnt < 6) && (clicnt != 0); ++cnt)
{
--clicnt; /* so lange Zeichen da und Buffer nicht voll */
zeichen = upcase(*clipoi++);/* Zeichen aus CLI-Buffer holen */
if (zeichen != ' ') /* Schluss bei Trennzeichen */
{
if (((zeichen >= 'A') && (zeichen <= 'Z'))
|| ((zeichen >= '0') && (zeichen <= '9'))
|| ((cnt == 0) && (zeichen == '#'))) /* gueltiges Zeichen? */
{
ident[cnt] = zeichen;
continue;
}
if ((cnt != 0) || (zeichen != '*')) return(-1); /* '*' als Ident */
}
break;
}
if ((cnt == 6) && (clicnt != 0) && (*clipoi) != ' ')
return(-1); /* Ident zu lang? Fehler melden */
if (valcal(ident) == 1)
return(-1); /* Ident darf kein Call sein */
cpy6ch(buffer, ident); /* umkopieren */
return(ident[0] != ' ');
}
/*---------------------------------------------------------------------------*/
unsigned nxtnum(laenge, buffer) /* Zahl aus Buffer holen */
char *(*buffer); /* Buffer */
unsigned *laenge; /* Laenge des Buffers */
{
unsigned temp; /* Scratch */
skipsp(laenge, buffer); /* auf erstes Zeichen != ' ' */
temp = 0; /* Ergebniss = 0 */
while ((*laenge != 0) && (*(*buffer) >= '0') && (*(*buffer) <='9')) {
--*laenge; /* mitzaehlen */
temp *= 10; /* Ergebniss eine Stelle weiter */
temp += (*(*buffer)++ + 0xffd0);/* + naechstes Digit */
}
return (temp); /* mit Ergebniss zurueck */
}
/*---------------------------------------------------------------------------*/
fvalca(pflag, call) /* Call pruefen: 0=leeres call, ohne Flag */
char *call; /* -1=niO (m. Flag), 1=ok oder o. Flag */
BOOLEAN pflag;
{
if (*call == ' ' ) return(0); /* leer */
if (!pflag) return (1); /* nicht pruefen */
return (valcal(call)); /* pruefen, valcal liefert Ergebniss */
}
/*---------------------------------------------------------------------------*/
valcal(call) /* Call auf Gueltigkeit pruefen */
char *call; /* -1=ungueltiges Zeichen, 1=Call ist ok */
{
char *numpos; /* Position der Zahl im Call */
char *actual; /* Pointer auf aktuelles Zeichen */
char zeichen; /* aktuelles Zeichen */
unsigned zahl; /* Zahlen im Call */
unsigned cnt; /* gepruefte Zeichen */
for (
zahl = 0, /* keine Zahl gefunden */
cnt = 0, /* nichts geprueft */
actual = call; /* auf Anfang */
cnt < 6; /* maximal 6 Zeichen Call */
++cnt, ++actual) {
if ((zeichen = *actual) == ' ') /* Ende des Calls? */
break;
if (!((zeichen >= 'A') && (zeichen <= 'Z'))){ /* Alfa ist immer gut */
if ((zeichen >= '0') && (zeichen <= '9')) {
zahl += 1; /* Zahlen zaehlen */
numpos = actual; /* Position merken */
}
else return(-1); /* ungueltiges Zeichen im Call */
}
}
if (
((actual - call) < 4) /* minimal 4 Zeichen */
|| (zahl == 0) /* mindestens 1 Zahl */
|| (zahl > 2) /* maximal 2 Zahlen */
|| (numpos == call) /* keine Zahl an erster Stelle */
|| (numpos == (actual -1))) /* mindestens 2 Buchstaben Suffix */
return(-1); /* Call ist ungueltig */
else return(+1); /* Call ist gueltig */
}
/*---------------------------------------------------------------------------*/
BOOLEAN ismemr() /* Test auf genuegend freien Speicher */
{
if((nmbfre < 256) && (!userpo->sysflg)) /* Platz oder Sysop? */
{
putmsg("Node busy");
return(FALSE);
}
cpyid(usrcal, calofs('U', userpo->cblk_u, userpo->typ_u));
return(TRUE);
}
/*---------------------------------------------------------------------------*/
VOID setl2b() /* User Kontrollblock aufbauen */
{
userpo->cblk_p = lnkpoi; /* Pointer auf L2-Block */
userpo->typ_p = 2; /* Partner ist L2 */
userpo->status = 2; /* Status: connect laeuft */
cpyid(lnkpoi->srcid, usrcal); /* Call eintragen */
}
/*---------------------------------------------------------------------------*/
char *calofs(seite, link, user) /* Offset Call-String im Kontrollblock */
unsigned user; /* Usertyp: 0=Host, 2=L2-User, 4=Circuit */
ctyp *link; /* Linkkontrollblock */
unsigned seite; /* Seite der Verbindung: U=uplink, D=downlink*/
{
if (user == 4) { /* Circuit? */
return ((seite == 'D') ? /* welche Seite? */
link->l3blk.downca : link->l3blk.upcall);
}
if (user == 2) /* L2-User? */
return(link->l2blk.dstid);
else return(myid); /* muss Host sein */
}
/*---------------------------------------------------------------------------*/
BOOLEAN getlin(mbhd) /* Zeile im Messagebuffer verfuegbar? */
mhtyp *mbhd;
{
char *nextch; /* naechstes Zeichen */
unsigned getcou; /* verfuegbare Zeichen */
BOOLEAN found; /* Flag: Ueberlauf */
unsigned laenge; /* Laenge der Zeile */
nextch = mbhd->nxtchr; /* Pointer auf naechstes Zeichen */
getcou = mbhd->getcnt; /* verfuegbare Zeichen */
found = FALSE; /* default: Zeile nicht da */
laenge = 0; /* Laenge initialisieren */
while (mbhd->getcnt < mbhd->putcnt) { /* so lange Vorrat reicht */
if (((getchr(mbhd) & 0x7f) == 0x0d) /* Zeichen = Zeilenende? */
|| (++laenge == 81)){ /* Zeile zu lang? */
found = TRUE; /* markieren */
break;
}
}
mbhd->nxtchr = nextch; /* MBHD auf alte Werte zurueck */
mbhd->getcnt = getcou;
return (found);
}
/*---------------------------------------------------------------------------*/
invsid() /* SSID umdrehen */
{
usrcal[6] = 0x7e - (usrcal[6] & 0x1e);
}
/*---------------------------------------------------------------------------*/
BOOLEAN issyso() /* Test auf Sysop Attribut */
{
return (
(userpo->sysflg == TRUE)
&& (skipsp(&clicnt, &clipoi) == TRUE) /* kein Sysop ohne Eingabe */
);
}
/*---------------------------------------------------------------------------*/
unsigned skipsp(laenge, string) /* in String auf naechstes Zeichen != ' ' */
unsigned *laenge; /* Laenge des String, wird korrigiert */
char *(*string); /* die Adresse des Kandidaten */
{
while ((*laenge != 0) && (*(*string) == ' ')) {
++*string;
--*laenge;
}
return (*laenge != 0);
}
/*---------------------------------------------------------------------------*/
VOID timer() /* alle 10ms Uhrzeit erhoehen */
{
++tic10;
}
/*---------------------------------------------------------------------------*/