1086 lines
24 KiB
C
Executable file
1086 lines
24 KiB
C
Executable file
#include "tnn.h"
|
|
|
|
static ULONG token_sent = 0L;
|
|
|
|
/* Pruefen, ob KissType in der TBL gesetzt ist. */
|
|
static BOOLEAN SearchKissType(UWORD Interface)
|
|
{
|
|
register int i;
|
|
|
|
/* Alle Ports durchgehen. */
|
|
for (i = 0; i < L1PNUM; ++i)
|
|
/* KissType gleich. */
|
|
if (l1port[i].kisstype == Interface)
|
|
/* Ja. */
|
|
return(TRUE);
|
|
|
|
/* Nein, */
|
|
return(FALSE);
|
|
}
|
|
|
|
#define ATT_PORT 1
|
|
#define ATT_KISSTYPE 2
|
|
#define ATT_SPEED 3
|
|
#define ATT_DEVICE 4
|
|
|
|
ATTPRT attprt[] = {
|
|
{"PORT", ATT_PORT },
|
|
{"KTYP", ATT_KISSTYPE },
|
|
{"SPEED", ATT_SPEED },
|
|
{"DEVICE", ATT_DEVICE },
|
|
{NULL, 0 }
|
|
};
|
|
|
|
ATTTYP attyp[] = {
|
|
{"KISS", KISS_NORMAL },
|
|
{"SMACK", KISS_SMACK },
|
|
{"RMNC", KISS_RMNC },
|
|
{"TOKENRING", KISS_TOK },
|
|
{"VANESSA", KISS_VAN },
|
|
{"SCC", KISS_SCC },
|
|
{"TF", KISS_TF },
|
|
{"IPX", KISS_IPX },
|
|
{"AX25IP", KISS_AXIP },
|
|
{"LOOP", KISS_LOOP },
|
|
{"KAX25", KISS_KAX25 },
|
|
{"KAX25KJD", KISS_KAX25KJD },
|
|
{"6PACK", KISS_6PACK },
|
|
#ifdef L1TELNET
|
|
{"TELNET", KISS_TELNET },
|
|
#endif /* L1TELNET */
|
|
#ifdef L1HTTPD
|
|
{"HTTPD", KISS_HTTPD },
|
|
#endif /* L1HTTPD */
|
|
#ifdef L1IPCONV
|
|
{"IPCONV", KISS_IPCONV },
|
|
#endif /* L1IPCONV */
|
|
#ifdef L1IRC
|
|
{"IRC", KISS_IRC },
|
|
#endif /* L1IRC */
|
|
{NULL, 0 }
|
|
};
|
|
|
|
#define ATT_NO_OPTION 0
|
|
#define ATT_POR_BUSY 1
|
|
#define ATT_INV_PORT 2
|
|
#define ATT_INV_TYP 3
|
|
#define ATT_KIS_BUSY 4
|
|
#define ATT_SPE_BUSY 5
|
|
#define ATT_INV_OPTION 6
|
|
#define ATT_INV_UDP 7
|
|
#define ATT_INV_TCP 8
|
|
|
|
static const char *errormsg[] =
|
|
{
|
|
"No Option."
|
|
,"Port is busy."
|
|
,"Invalid Port."
|
|
,"Invalid KissType."
|
|
,"Kisstype is busy."
|
|
,"Invalid Speed."
|
|
,"Invalid Option."
|
|
,"Invalid UDP-Port."
|
|
,"Invalid TCP-Port."
|
|
};
|
|
|
|
/* KissType setzen. */
|
|
int SetKissType(WORD Interface, int port)
|
|
{
|
|
switch (Interface)
|
|
{
|
|
case KISS_NORMAL:
|
|
case KISS_SMACK:
|
|
case KISS_RMNC:
|
|
case KISS_TOK:
|
|
return(Interface);
|
|
|
|
break;
|
|
#ifdef VANESSA
|
|
case KISS_VAN:
|
|
/* Testen ob es ueberhaupt eine Vanessa gibt. */
|
|
if (!van_test(port))
|
|
return(KISS_NIX);
|
|
|
|
break;
|
|
#endif
|
|
case KISS_SCC:
|
|
case KISS_TF:
|
|
case KISS_KAX25:
|
|
case KISS_KAX25KJD:
|
|
case KISS_6PACK:
|
|
return(Interface);
|
|
|
|
break;
|
|
|
|
/* Pruefe auf doppel-Eintraege! */
|
|
case KISS_IPX:
|
|
case KISS_AXIP:
|
|
case KISS_LOOP:
|
|
#ifdef L1TELNET
|
|
case KISS_TELNET:
|
|
#endif /* L1TELNET */
|
|
#ifdef L1HTTPD
|
|
case KISS_HTTPD:
|
|
#endif /* L1HTTPD */
|
|
#ifdef L1IPCONV
|
|
case KISS_IPCONV:
|
|
#endif /* L1IPCONV */
|
|
#ifdef L1IRC
|
|
case KISS_IRC:
|
|
#endif /* L1IRC */
|
|
/* KissType schon gesetzt? */
|
|
if (!SearchKissType(Interface))
|
|
/* Nein, dann jetzt setzen. */
|
|
return(Interface);
|
|
/* KissType existiert schon. */
|
|
else
|
|
/* nicht setzen. */
|
|
return(KISS_NIX);
|
|
|
|
break;
|
|
|
|
/* Unbekanntes KissType. */
|
|
default:
|
|
/* nicht setzen. */
|
|
return(KISS_NIX);
|
|
|
|
break;
|
|
}
|
|
|
|
return(KISS_NIX);
|
|
}
|
|
|
|
/* Baudrate setzen. */
|
|
int SetSpeed(char *speed, UWORD KissType)
|
|
{
|
|
int Speed = EOF;
|
|
|
|
/* Baudrate holen. */
|
|
if ((sscanf(speed, "%d", &Speed) != 1))
|
|
/* Fehler, abbruch. */
|
|
return(EOF);
|
|
|
|
/* Geschwindigkeit fuer Tokenring-Port */
|
|
if (KissType == KISS_TOK)
|
|
/* Tokenring setzen. */
|
|
tkcom = 1;
|
|
|
|
switch(Speed)
|
|
{
|
|
case 0:
|
|
return(FALSE);
|
|
|
|
case 9600:
|
|
if (KissType == KISS_TOK)
|
|
tkbaud = 96;
|
|
|
|
return(B9600);
|
|
|
|
case 19200:
|
|
if (KissType == KISS_TOK)
|
|
tkbaud = 192;
|
|
|
|
return(B19200);
|
|
|
|
case 38400:
|
|
if (KissType == KISS_TOK)
|
|
tkbaud = 384;
|
|
|
|
return(B38400);
|
|
|
|
case 57600:
|
|
if (KissType == KISS_TOK)
|
|
tkbaud = 576;
|
|
|
|
#ifdef B57600
|
|
return(B57600);
|
|
#else
|
|
return(B38400);
|
|
#endif
|
|
|
|
case 115200:
|
|
if (KissType == KISS_TOK)
|
|
tkbaud = 1152;
|
|
|
|
#ifdef B115200
|
|
return(B115200);
|
|
#else
|
|
return(B38400);
|
|
#endif
|
|
|
|
case 230400:
|
|
if (KissType == KISS_TOK)
|
|
tkbaud = 2304;
|
|
|
|
#ifdef B230400
|
|
return(B230400);
|
|
#else
|
|
return(B38400);
|
|
#endif
|
|
|
|
case 460800:
|
|
if (KissType == KISS_TOK)
|
|
tkbaud = 4608;
|
|
|
|
#ifdef B460800
|
|
return(B460800);
|
|
#else
|
|
return(B38400);
|
|
#endif
|
|
|
|
/* unbekannte Geschwindigkeiten */
|
|
default:
|
|
return(EOF);
|
|
}
|
|
|
|
return(EOF);
|
|
}
|
|
|
|
/* Baudrateflags setzen. */
|
|
int SetSpeedflag(char *speed)
|
|
{
|
|
int Speed = EOF;
|
|
|
|
/* Baudrate holen. */
|
|
if ((sscanf(speed, "%d", &Speed) != 1))
|
|
/* Fehler, abbruch. */
|
|
return(EOF);
|
|
|
|
switch(Speed)
|
|
{
|
|
|
|
case 57600:
|
|
return(ASYNC_SPD_HI);
|
|
|
|
case 115200:
|
|
return(ASYNC_SPD_VHI);
|
|
|
|
case 230400:
|
|
return(ASYNC_SPD_SHI);
|
|
|
|
case 460800:
|
|
return(ASYNC_SPD_WARP);
|
|
|
|
/* unbekannte Geschwindigkeiten */
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
|
|
return(FALSE);
|
|
}
|
|
|
|
/* Buffer "clipoi" einlesen. */
|
|
char *ReadBuf(char *cBuf, BOOLEAN flag)
|
|
{
|
|
register int i;
|
|
skipsp(&clicnt, &clipoi);
|
|
|
|
/* Frischer Buffer */
|
|
memset(cBuf, 0, sizeof(cBuf));
|
|
|
|
for (i = 0; i < MAXPATH; ++i)
|
|
{
|
|
if ((!clicnt) || (*clipoi == ' '))
|
|
break;
|
|
|
|
if (*clipoi == '=')
|
|
{
|
|
clicnt--;
|
|
clipoi++;
|
|
break;
|
|
}
|
|
clicnt--;
|
|
/* TRUE, In Grossbuchstaben umwandeln. */
|
|
if (flag)
|
|
cBuf[i] = toupper(*clipoi++);
|
|
/* FALSE. */
|
|
else
|
|
/* keine Aenderungen durchfuehren. */
|
|
cBuf[i] = (*clipoi++);
|
|
}
|
|
|
|
cBuf[i] = 0;
|
|
|
|
return(cBuf);
|
|
}
|
|
|
|
/* Eine Modifizierte Funktion Init_kisslink(); */
|
|
BOOLEAN InitKissLink(UWORD port)
|
|
{
|
|
DEVICE *l1att = &l1port[l1ptab[port]];
|
|
int Error = 0;
|
|
|
|
switch(l1att->kisstype)
|
|
{
|
|
case KISS_TOK:
|
|
/* Nur die 1. Schnittstelle Initialisieren. */
|
|
if (tokenring_ports > 1)
|
|
return(FALSE);
|
|
|
|
/* Alle Device haben hier nix zu suchen. */
|
|
#ifdef VANESSA
|
|
case KISS_VAN:
|
|
#endif
|
|
case KISS_SCC:
|
|
case KISS_IPX:
|
|
case KISS_AXIP:
|
|
case KISS_LOOP:
|
|
case KISS_KAX25:
|
|
case KISS_KAX25KJD:
|
|
#ifdef L1TELNET
|
|
case KISS_TELNET:
|
|
#endif /* L1TELNET */
|
|
#ifdef L1HTTPD
|
|
case KISS_HTTPD:
|
|
#endif /* L1HTTPD */
|
|
#ifdef L1IPCONV
|
|
case KISS_IPCONV:
|
|
#endif /* L1IPCONV */
|
|
#ifdef L1IRC
|
|
case KISS_IRC:
|
|
#endif /* L1IRC */
|
|
/* und weg hier. */
|
|
return(FALSE);
|
|
|
|
#ifdef SIXPACK
|
|
case KISS_6PACK:
|
|
/* 6PACK-Ring ist schon Initialisiert. */
|
|
if (iDescriptor)
|
|
/* Schliesse schnittstelle. */
|
|
close(iDescriptor);
|
|
|
|
/* Neue Konfiguration Initialisieren. */
|
|
Sixpack_l1init();
|
|
|
|
return(FALSE);
|
|
#endif /* SIXPACK */
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* Port oeffnen. */
|
|
/* */
|
|
/************************************************************************/
|
|
l1att->kisslink = open(l1att->device, l1att->speed);
|
|
|
|
if (l1att->kisslink == KISS_NIX)
|
|
{
|
|
Error = 1;
|
|
printf("Error: can't open device %s\n", l1att->device);
|
|
printf(" (%s)\n", strerror(errno));
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* Serielle Schnittstelle auf neue Parameter einstellen, KISS-Empfang */
|
|
/* initialisieren */
|
|
/* */
|
|
/************************************************************************/
|
|
if (!Error)
|
|
{
|
|
l1att->rx_state = ST_BEGIN;
|
|
l1att->rx_port = 0;
|
|
l1att->tx_port = 0;
|
|
|
|
if (l1att->kisstype == KISS_TF)
|
|
tf_set_kiss(l1att);
|
|
}
|
|
|
|
/************************************************************************/
|
|
/* */
|
|
/* Wenn kein Fehler aufgetreten ist, dann fuer gewisse Interfaces die */
|
|
/* ersten Aktionen ausfuehren. */
|
|
/* */
|
|
/* Tokenring : Token senden */
|
|
/* 6PACK : TNC-Zaehlung anstossen */
|
|
/* */
|
|
/************************************************************************/
|
|
|
|
if (!Error)
|
|
{
|
|
/* Tokenring */
|
|
if (l1att->kisstype == KISS_TOK)
|
|
{
|
|
send_kisscmd(0xff, CMD_TOKEN, 0); /* Token senden */
|
|
token_sent = tic10; /* Zeitpunkt der Sendung */
|
|
tokenflag = FALSE; /* Token unterwegs */
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
if (Error)
|
|
{
|
|
/* Handle schliessen. */
|
|
close(l1att->kisslink);
|
|
return(TRUE);
|
|
}
|
|
|
|
/* Initialisierung war erfolgreich. */
|
|
return(FALSE);
|
|
}
|
|
|
|
/* Port setzen. */
|
|
void ccpattach(void)
|
|
{
|
|
MBHEAD *mbp;
|
|
ATTPRT *attcmd;
|
|
ATTTYP *attype;
|
|
char Buf[MAXPATH + 1];
|
|
char *cBuf = Buf;
|
|
int port = EOF;
|
|
int error = ATT_NO_OPTION;
|
|
WORD found;
|
|
WORD att_kisstype = EOF;
|
|
WORD att_speed = EOF;
|
|
WORD att_speedflag= EOF;
|
|
char att_device[MAXPATH + 1];
|
|
|
|
/* Sysop will aendern und noch was in der Zeile da ? */
|
|
if (issyso() && skipsp(&clicnt, &clipoi))
|
|
{
|
|
memset(att_device, 0, sizeof(att_device));
|
|
do
|
|
{
|
|
/* Gibt es einen Fehler? */
|
|
if (error != ATT_NO_OPTION)
|
|
/* Abbruch. */
|
|
break;
|
|
|
|
/* Option einlesen. */
|
|
cBuf = ReadBuf(cBuf, TRUE);
|
|
|
|
/* Option in TBL suchen. */
|
|
for (attcmd = attprt, found = 0; !found && attcmd->attstr != NULL; ++attcmd)
|
|
{
|
|
if (!strncmp(attcmd->attstr, cBuf, strlen(cBuf)))
|
|
/* Option gefunden. */
|
|
found = attcmd->attnum;
|
|
}
|
|
|
|
switch (found)
|
|
{
|
|
/* PORT. */
|
|
case ATT_PORT:
|
|
skipsp(&clicnt, &clipoi);
|
|
|
|
/* Port einlesen/pruefen. */
|
|
if ((port = (nxtnum(&clicnt, &clipoi) & 0x7F)) < L2PNUM)
|
|
{
|
|
/* uninitialisierter Port */
|
|
if (l1ptab[port] != -1)
|
|
/* Port ist belegt. */
|
|
error = ATT_POR_BUSY;
|
|
}
|
|
/* Portangabe liegt ausserhalb vom Grenzbereichs. */
|
|
else
|
|
/* Markiere Fehlermeldung. */
|
|
error = ATT_INV_PORT;
|
|
|
|
break;
|
|
|
|
/* KISSTYPE setzen. */
|
|
case ATT_KISSTYPE:
|
|
/* KissType einlesen. */
|
|
cBuf = ReadBuf(cBuf, TRUE);
|
|
|
|
/* KissType in TBL suchen. */
|
|
for (attype = attyp, found = EOF; found == EOF && attype->attstr != NULL; ++attype)
|
|
{
|
|
if (!strncmp(attype->attstr, cBuf, strlen(cBuf)))
|
|
/* KissType gefunden. */
|
|
found = attype->attnum;
|
|
}
|
|
|
|
/* Unbekannte KissType. */
|
|
if (found == EOF )
|
|
{
|
|
/* Markiere Fehlermeldung. */
|
|
error = ATT_INV_TYP;
|
|
break;
|
|
}
|
|
|
|
/* Kisstype setzen. */
|
|
if ((att_kisstype = SetKissType(found, port)) == EOF)
|
|
/* EOF, Markiere Fehlermeldung. */
|
|
error = ATT_KIS_BUSY;
|
|
|
|
break;
|
|
|
|
/* Baudrate setzen. */
|
|
case ATT_SPEED:
|
|
/* Baudrate einlesen. */
|
|
cBuf = ReadBuf(cBuf, TRUE);
|
|
|
|
/* Baudrate setzen. */
|
|
if ((att_speed = SetSpeed(cBuf, att_kisstype)) == EOF)
|
|
/* EOF, Markiere Fehlermeldung. */
|
|
error = ATT_SPE_BUSY;
|
|
|
|
/* Baudrateflag setzen. */
|
|
att_speedflag = SetSpeedflag(cBuf);
|
|
|
|
break;
|
|
|
|
/* Device setzen. */
|
|
case ATT_DEVICE:
|
|
/* Device einlesen. */
|
|
cBuf = ReadBuf(cBuf, FALSE);
|
|
|
|
switch(att_kisstype)
|
|
{
|
|
case KISS_NORMAL:
|
|
case KISS_SMACK:
|
|
case KISS_RMNC:
|
|
case KISS_TOK:
|
|
#ifdef VANESSA
|
|
case KISS_VAN:
|
|
#endif
|
|
case KISS_SCC:
|
|
case KISS_TF:
|
|
case KISS_KAX25:
|
|
case KISS_KAX25KJD:
|
|
case KISS_6PACK:
|
|
strncpy(att_device, cBuf, MAXPATH);
|
|
break;
|
|
|
|
/* UDP-Port pruefen. */
|
|
case KISS_AXIP:
|
|
if (atoi(cBuf) < 65536)
|
|
{
|
|
strncpy(att_device, cBuf, MAXPATH);
|
|
/* Neuen UDP-Port markieren. */
|
|
my_udp = htons((unsigned short)atoi(cBuf));
|
|
}
|
|
/* UDP-Port liegt ausserhalb vom Grenzbereich. */
|
|
else
|
|
/* Markiere Fehlermeldung. */
|
|
error = ATT_INV_UDP;
|
|
|
|
break;
|
|
|
|
#ifdef L1TELNET
|
|
/* TCP-Port pruefen. */
|
|
case KISS_TELNET:
|
|
if (atoi(cBuf) < 65536)
|
|
strncpy(att_device, cBuf, MAXPATH);
|
|
/* UDP-Port liegt ausserhalb vom Grenzbereich. */
|
|
else
|
|
/* Markiere Fehlermeldung. */
|
|
error = ATT_INV_TCP;
|
|
|
|
break;
|
|
#endif /* L1TELNET */
|
|
#ifdef L1HTTPD
|
|
/* TCP-Port pruefen. */
|
|
case KISS_HTTPD:
|
|
if (atoi(cBuf) < 65536)
|
|
strncpy(att_device, cBuf, MAXPATH);
|
|
/* UDP-Port liegt ausserhalb vom Grenzbereich. */
|
|
else
|
|
/* Markiere Fehlermeldung. */
|
|
error = ATT_INV_TCP;
|
|
|
|
break;
|
|
#endif /* L1HTTPD */
|
|
#ifdef L1IPCONV
|
|
/* TCP-Port pruefen. */
|
|
case KISS_IPCONV:
|
|
if (atoi(cBuf) < 65536)
|
|
strncpy(att_device, cBuf, MAXPATH);
|
|
/* UDP-Port liegt ausserhalb vom Grenzbereich. */
|
|
else
|
|
/* Markiere Fehlermeldung. */
|
|
error = ATT_INV_TCP;
|
|
|
|
break;
|
|
#endif /* L1IPCONV */
|
|
#ifdef L1IRC
|
|
/* TCP-Port pruefen. */
|
|
case KISS_IRC:
|
|
if (atoi(cBuf) < 65536)
|
|
strncpy(att_device, cBuf, MAXPATH);
|
|
/* UDP-Port liegt ausserhalb vom Grenzbereich. */
|
|
else
|
|
/* Markiere Fehlermeldung. */
|
|
error = ATT_INV_TCP;
|
|
|
|
break;
|
|
#endif /* L1IRC */
|
|
}
|
|
|
|
case KISS_LOOP :
|
|
break;
|
|
|
|
default:
|
|
/* Unbekannte Option. */
|
|
error = ATT_INV_OPTION;
|
|
break;
|
|
}
|
|
}
|
|
/* Gibt es noch Zeichen. */
|
|
while (clicnt > 0);
|
|
}
|
|
/* Kein Sysop. */
|
|
else
|
|
{
|
|
if (!issyso())
|
|
invmsg();
|
|
else
|
|
{
|
|
DEVICE *l1att;
|
|
|
|
mbp = putals("ATTACH-TABLES:\rPort--KISSTYPE---DEVICE\r");
|
|
|
|
/* alle Ports durchgehen */
|
|
for (port = 0; port < L2PNUM; ++port)
|
|
{
|
|
/* uninitialisierter Port */
|
|
if (l1ptab[port] == -1)
|
|
{
|
|
putprintf(mbp, "%2d Port deaktiv.\r", port);
|
|
continue;
|
|
}
|
|
|
|
l1att = &l1port[l1ptab[port]];
|
|
|
|
for (attype = attyp; attype->attstr != NULL; ++attype)
|
|
if (l1att->kisstype == attype->attnum)
|
|
break;
|
|
|
|
putprintf(mbp, "%2d %-10s "
|
|
, port
|
|
, attype->attstr);
|
|
|
|
switch(l1att->kisstype)
|
|
{
|
|
case KISS_AXIP:
|
|
putprintf(mbp, "%u" ,ntohs(my_udp));
|
|
break;
|
|
|
|
#ifdef L1TELNET
|
|
case KISS_TELNET:
|
|
putprintf(mbp, "%d" , atoi(l1att->device));
|
|
break;
|
|
#endif /* L1TELNET */
|
|
#ifdef L1HTTPD
|
|
case KISS_HTTPD:
|
|
putprintf(mbp, "%d" , atoi(l1att->device));
|
|
break;
|
|
#endif /* L1HTTPD */
|
|
#ifdef L1IPCONV
|
|
case KISS_IPCONV:
|
|
putprintf(mbp, "%d" , atoi(l1att->device));
|
|
break;
|
|
#endif /* L1IPCONV */
|
|
#ifdef L1IRC
|
|
case KISS_IRC:
|
|
putprintf(mbp, "%d" , atoi(l1att->device));
|
|
break;
|
|
#endif /* L1IRC */
|
|
|
|
default:
|
|
putprintf(mbp, "%-5s" ,l1att->device);
|
|
break;
|
|
}
|
|
putstr("\r", mbp);
|
|
|
|
|
|
}
|
|
/* und ab geht die Post. */
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
}
|
|
return;
|
|
}
|
|
|
|
/* Kisstype Tokenring. */
|
|
if ( (att_kisstype == KISS_TOK)
|
|
/* Ja, dann zaehlen wir. */
|
|
&&(++tokenring_ports))
|
|
{
|
|
/* Sonderbehandlung fuer Tokenring-Ports */
|
|
if (att_kisstype == KISS_TOK)
|
|
{
|
|
l1ptab[port] = 0;
|
|
l2ptab[max_device] = -1;
|
|
}
|
|
}
|
|
/* Kein Tokenring. */
|
|
#ifdef SIXPACK
|
|
/* Sonderbehandlung fuer 6PACK-Ports */
|
|
if ( (att_kisstype == KISS_6PACK)
|
|
&&(++sixpack_ports))
|
|
{
|
|
/* Sonderbehandlung fuer Tokenring-Ports */
|
|
if (att_kisstype == KISS_6PACK)
|
|
{
|
|
l1ptab[port] = max_device;
|
|
l2ptab[max_device] = -1;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/* Sind alle Einstellungen korrekt? */
|
|
if ( (port == EOF)
|
|
/* Pruefen ob Kisstype */
|
|
||(att_kisstype == EOF)
|
|
/* und Device korrekt gesetzt sind. */
|
|
||((att_device[0] == FALSE)
|
|
&&(att_kisstype != KISS_AXIP)
|
|
&&(att_kisstype != KISS_LOOP)))
|
|
{
|
|
mbp = getmbp();
|
|
|
|
/* Fehlermeldung ausgeben mit Syntax. */
|
|
putprintf(mbp, "%s\r", errormsg[error]);
|
|
putstr("Syntax: ATT PORT=X KTYP=KISSTYPE SPEED=19200 DEVICE=SCHNITTSTELLE\r", mbp);
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
return;
|
|
}
|
|
/* Kisstype/Device sind OK. */
|
|
else
|
|
{
|
|
/* Port auf aktiv stellen. */
|
|
l1port[++max_device].port_active = TRUE;
|
|
/* Kisstype setzen. */
|
|
l1port[max_device].kisstype = att_kisstype;
|
|
/* Baudrateflag setzen. */
|
|
l1port[max_device].speedflag = att_speedflag;
|
|
/* Baudrate setzen. */
|
|
l1port[max_device].speed = att_speed;
|
|
/* Device setzen. */
|
|
strcpy(l1port[max_device].device, att_device);
|
|
|
|
/* Port markieren. */
|
|
l1ptab[port] = max_device;
|
|
l2ptab[max_device] = port;
|
|
|
|
/* Zaehler L1Ports. */
|
|
++used_l1ports;
|
|
/* Kiss aktivieren. */
|
|
kiss_active = TRUE;
|
|
|
|
/* Serielle Schnittstellen initialisieren */
|
|
if (InitKissLink((UWORD)port))
|
|
{
|
|
/* Es gab ein Fehler bei der Initialisierung. */
|
|
/* Alle Werte zuruecksetzen. */
|
|
l1port[max_device].port_active = FALSE;
|
|
l1port[max_device].kisstype = KISS_NIX;
|
|
l1port[max_device].speedflag = 0;
|
|
l1port[max_device].speed = 0;
|
|
l1port[max_device].device[0] = 0;
|
|
|
|
l1ptab[port] = EOF;
|
|
l2ptab[port] = EOF;
|
|
--max_device;
|
|
--used_l1ports;
|
|
|
|
mbp = getmbp();
|
|
|
|
putstr("Error with initializing the interface\r", mbp);
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
return;
|
|
}
|
|
}
|
|
|
|
mbp = getmbp();
|
|
|
|
putprintf(mbp, "Port %d Attached.\r", port);
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
}
|
|
|
|
/* Port entladen. */
|
|
void ccpdetach(void)
|
|
{
|
|
MBHEAD *mbp;
|
|
DEVICE *l1att;
|
|
int port;
|
|
|
|
/* Sysop will aendern und noch was in der Zeile da ? */
|
|
if (issyso() && skipsp(&clicnt, &clipoi))
|
|
{
|
|
/* Port einlesen/pruefen. */
|
|
if ((port = (nxtnum(&clicnt, &clipoi) & 0x7F)) < L2PNUM)
|
|
{
|
|
/* uninitialisierter Port */
|
|
if (l1ptab[port] == EOF)
|
|
{
|
|
mbp = getmbp();
|
|
putprintf(mbp, "Port %d is no activ.\r", port);
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
return;
|
|
}
|
|
/* Port eingeschaltet. */
|
|
if (portenabled(port))
|
|
/* Port runterfahren. */
|
|
l1detach(port);
|
|
|
|
l1att = &l1port[l1ptab[port]];
|
|
/* Schliesse Schnittstelle. */
|
|
switch(l1att->kisstype)
|
|
{
|
|
case KISS_TOK:
|
|
/* Schliesse Schnittstelle. */
|
|
close(l1att->kisslink);
|
|
|
|
/* Port's zuruecksetzen. */
|
|
tokenring_ports = 0;
|
|
break;
|
|
|
|
|
|
case KISS_NORMAL:
|
|
case KISS_SMACK:
|
|
case KISS_RMNC:
|
|
|
|
|
|
case KISS_TF:
|
|
close(l1att->kisslink);
|
|
break;
|
|
|
|
#ifdef SIXPACK
|
|
case KISS_6PACK:
|
|
/* Schnittstelle schliessen. */
|
|
Sixpack_l1exit();
|
|
|
|
/* Port's zuruecksetzen. */
|
|
sixpack_ports = 0;
|
|
#endif /* SIXPACK */
|
|
|
|
case KISS_AXIP:
|
|
case KISS_KAX25:
|
|
case KISS_KAX25KJD:
|
|
#ifdef L1TELNET
|
|
case KISS_TELNET:
|
|
#endif /* L1TELNET */
|
|
#ifdef L1HTTPD
|
|
case KISS_HTTPD:
|
|
#endif /* L1HTTPD */
|
|
#ifdef L1IPCONV
|
|
case KISS_IPCONV:
|
|
#endif /* L1IPCONV */
|
|
#ifdef L1IRC
|
|
case KISS_IRC:
|
|
#endif /* L1IRC */
|
|
close(l1att->kisslink);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
/* Defaultwerte setzen. */
|
|
l1att->port_active = FALSE;
|
|
l1att->kisstype = KISS_NIX;
|
|
l1att->speed = 0;
|
|
l1att->device[0] = 0;
|
|
|
|
l1ptab[port] = EOF;
|
|
l2ptab[port] = EOF;
|
|
|
|
mbp = getmbp();
|
|
putprintf(mbp, "Port %d Detach.\r", port);
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
return;
|
|
}
|
|
/* Ungueltiger Port. */
|
|
else
|
|
{
|
|
mbp = getmbp();
|
|
putstr("Invalid Port.\r", mbp);
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{ /* Sysop ? */
|
|
if (!issyso())
|
|
invmsg();
|
|
/* Portangabe fehlt.*/
|
|
else
|
|
{
|
|
mbp = getmbp();
|
|
|
|
putstr("Port failed.\r", mbp);
|
|
prompt(mbp);
|
|
seteom(mbp);
|
|
}
|
|
}
|
|
}
|
|
/* Speed einlesen fuer tnb. */
|
|
int ReadSpeed(unsigned int Speed)
|
|
{
|
|
switch(Speed)
|
|
{
|
|
case 0:
|
|
return(FALSE);
|
|
|
|
case B9600:
|
|
return(9600);
|
|
|
|
case B19200:
|
|
return(19200);
|
|
|
|
case B38400:
|
|
return(38400);
|
|
|
|
case B57600:
|
|
#ifdef B57600
|
|
return(57600);
|
|
#else
|
|
return(38400);
|
|
#endif
|
|
|
|
#ifdef B115200
|
|
case B115200:
|
|
return(115200);
|
|
#else
|
|
return(38400);
|
|
#endif
|
|
case 230400:
|
|
#ifdef B230400
|
|
return(230400);
|
|
#else
|
|
return(38400);
|
|
#endif
|
|
|
|
case 460800:
|
|
#ifdef B460800
|
|
return(460800);
|
|
#else
|
|
return(38400);
|
|
#endif
|
|
|
|
/* unbekannte Geschwindigkeiten */
|
|
default:
|
|
return(FALSE);
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
/* Attach-Eintraege in tnb sichern. */
|
|
void dump_attach(MBHEAD *mbp)
|
|
{
|
|
DEVICE *l1pp;
|
|
int port;
|
|
|
|
putstr(";\r; Attach (l1-Level)\r;\r", mbp);
|
|
|
|
/* alle Ports durchgehen */
|
|
for (port = 0; port < L2PNUM; ++port)
|
|
{
|
|
/* uninitialisierter Port */
|
|
if (l1ptab[port] == -1)
|
|
continue;
|
|
|
|
l1pp = &l1port[l1ptab[port]];
|
|
|
|
putprintf(mbp, "ATTACH PORT=%d ", port);
|
|
|
|
switch(l1pp->kisstype)
|
|
{
|
|
case KISS_NORMAL:
|
|
putprintf(mbp, "KTYP=KISS SPEED=%d DEVICE=%s"
|
|
, ReadSpeed(l1pp->speed)
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_SMACK:
|
|
putprintf(mbp, "KTYP=SMACK SPEED=%d DEVICE=%s"
|
|
, ReadSpeed(l1pp->speed)
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_RMNC:
|
|
putprintf(mbp, "KTYP=RMNC SPEED=%d DEVICE=%s"
|
|
, ReadSpeed(l1pp->speed)
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_TOK:
|
|
putprintf(mbp, "KTYP=TOKENRING SPEED=%d DEVICE=%s"
|
|
, ReadSpeed(l1pp->speed)
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_SCC:
|
|
putprintf(mbp, "KTYP=SCC DEVIVE=%s"
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_TF:
|
|
putprintf(mbp, "KTYP=TF SPEED=%d DEVICE=%s"
|
|
, ReadSpeed(l1pp->speed)
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_IPX:
|
|
putprintf(mbp, "KTYP=IPX");
|
|
break;
|
|
|
|
case KISS_AXIP:
|
|
putstr("KTYP=AX25IP ", mbp);
|
|
if (l1pp->device)
|
|
putprintf(mbp, "DEVICE=%d"
|
|
, ntohs(my_udp));
|
|
else
|
|
putstr("DEVICE=", mbp);
|
|
break;
|
|
|
|
case KISS_LOOP:
|
|
putprintf(mbp, "KTYP=LOOP");
|
|
break;
|
|
|
|
case KISS_KAX25:
|
|
putprintf(mbp, "KTYP=KAX25 DEVICE=%s"
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_KAX25KJD:
|
|
putprintf(mbp, "KTYP=KAX25DJK DEVICE=%s"
|
|
, l1pp->device);
|
|
break;
|
|
|
|
case KISS_6PACK:
|
|
putprintf(mbp, "KTYP=6PACK SPEED=%d DEVICE=%s"
|
|
, ReadSpeed(l1pp->speed)
|
|
, l1pp->device);
|
|
break;
|
|
|
|
#ifdef L1TELNET
|
|
case KISS_TELNET:
|
|
putprintf(mbp, "KTYP=TELNET DEVICE=%d"
|
|
, atoi(l1pp->device));
|
|
break;
|
|
#endif /* L1TELNET */
|
|
#ifdef L1HTTPD
|
|
case KISS_HTTPD:
|
|
putprintf(mbp, "KTYP=HTTPD DEVICE=%d"
|
|
, atoi(l1pp->device));
|
|
break;
|
|
#endif /* L1HTTPD */
|
|
#ifdef L1IPCONV
|
|
case KISS_IPCONV:
|
|
putprintf(mbp, "KTYP=IPCONV DEVICE=%d"
|
|
, atoi(l1pp->device));
|
|
break;
|
|
#endif /* L1IPCONV */
|
|
#ifdef L1IRC
|
|
case KISS_IRC:
|
|
putprintf(mbp, "KTYP=IRC DEVICE=%d"
|
|
, atoi(l1pp->device));
|
|
break;
|
|
#endif /* L1IRC */
|
|
}
|
|
putstr("\n", mbp);
|
|
}
|
|
}
|
|
|
|
/* End of os/win32/l1attach.c */
|