TheNetNode-CB/src/l1ipconv.c

747 lines
20 KiB
C
Executable File

#include "tnn.h"
#ifdef L1IPCONV
/* Zeiger auf das Aktuelle Interface. */
static T_INTERFACE *ifpp;
/* Anzahl der aktuellen IP-CONVERS-Routen auf 0 setzen. */
int ip_tbl_top = 0;
#ifdef OS_IPLINK
/******************************************************************************/
/* */
/* IPC-Routen ausgeben. */
/* */
/******************************************************************************/
static void ShowIpcEntry(struct iptbl iPC, MBHEAD *buf)
{
char TmpCall[10];
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(ShowIpcEntry)";
#endif /* DEBUG_MODUS */
buf->l4time = buf->mbpc; /* erst mal merken, wo wir sind */
call2str(TmpCall, iPC.name); /* Konvertiere Rufzeichen. */
putprintf(buf, "%s", TmpCall);
putspa(10, buf);
show_ip_addr(Ntohl(iPC.ipaddr), buf); /* IP-Adresse ausgeben. */
putspa(27, buf);
putnum(iPC.port, buf); /* TCP-Port ausgeben. */
putspa(33, buf);
putprintf(buf, "%s\r", (iPC.linkflag ? "LINK" : "USER")); /* Status ausgeben*/
}
#endif /* OS_IPLINK */
/* IP-CONVERS-Server Einstellung aendern/setzen. */
void ccpipconv(void)
{
MBHEAD *mbp;
#ifdef OS_IPLINK
struct hostent *he;
UBYTE tip[4];
unsigned char tmpip[IPADDR + 1];
unsigned char tmphost[HNLEN];
unsigned int tmptport;
register int i;
char tmpcall[L2IDLEN];
BOOLEAN tmplink = FALSE;
#endif /* OS_IPLINK */
char ch;
int tmp_fd = EOF;
int newloglevel = 0;
unsigned int new_tcp_port = 0;
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(ccpipconv)";
#endif /* DEBUG_MODUS */
ifpp = &ifp[CVS_ID]; /* Zeiger auf das IPCONV-Interface. */
/* Sysop will aendern? */
if (issyso() && skipsp(&clicnt, &clipoi))
{
clicnt--;
ch = toupper(*clipoi++);
switch (ch)
{
/* Sysop will IPCONV-Port aendern */
case 'P':
if (!skipsp(&clicnt, &clipoi))
{
putmsg("Invalid Parameter\r");
return;
}
/* Neuen TCP Port einlesen. */
new_tcp_port = nxtlong(&clicnt, &clipoi);
if ( (new_tcp_port <= 0)
||(new_tcp_port > 65535))
{
#ifdef SPEECH
putmsg(speech_message(328));
#else
putmsg("IPCONV-Port not valid, not changed !!!\r");
#endif
return;
}
/* Wenn NEUER TCP-Port und ALTER TCP-Port */
/* GLEICH sind, brauchen wir nix aendern. */
if (ifpp->tcpport == Htons((unsigned short)new_tcp_port))
{
putmsg("TCP-Port successfully changed\r");
return;
}
/* Ist IPCONV-Server aktiv ? */
if (ifpp->actively == FALSE)
{
#ifdef SPEECH
putmsg(speech_message(327));
#else
putmsg("TCP-Port haven not switched on!\r");
#endif
return;
}
if ((tmp_fd = SetupTCP(ifpp->name, (unsigned short)new_tcp_port)) != EOF)
{
#ifdef OS_STACK
int tmp_fd_OS;
if ((tmp_fd_OS = SetupOS(ifpp, (unsigned short)new_tcp_port)) != EOF)
{
/* alten Socket schliessen */
close(ifpp->OsSock);
/* Neuen Socket merken */
ifpp->OsSock = tmp_fd_OS;
}
else
{
Close(tmp_fd);
putmsg("ERROR: Changing UDP-Port failed, Port not changed !!!\r");
return;
}
#endif /* OS_STACK */
Close(ifpp->ISock); /* Alten Socket schliessen. */
ifpp->ISock = tmp_fd ; /* Neuen Socket merken */
}
else
{ /* Neuen TCP-Port liess sich nicht Initialisieren. */
putmsg("ERROR: Changing UDP-Port failed, Port not changed !!!\r");
return;
}
/* TCP-Port OK, dann markieren wir neuen TCP-Port. */
ifpp->tcpport = Htons((unsigned short)new_tcp_port);
#ifdef SPEECH
putmsg(speech_message(330));
#else
putmsg("TCP-Port successfully changed\r");
#endif
return;
/* Sysop will LOGLevel aendern */
case 'L':
if (!skipsp(&clicnt, &clipoi))
{
/* Keine Parameter angegeben, */
/* status Loglevel anzeigen. */
mbp = putals("IPCONVER-Server:\r");
#ifdef SPEECH
putprintf(mbp, speech_message(299),ifpp->log);
#else
putprintf(mbp, "My LogLevel: %d\r",ifpp->log);
#endif
prompt(mbp);
seteom(mbp);
return;
}
/* Markiere neuen Loglevel */
newloglevel = nxtnum(&clicnt, &clipoi);
if ( (newloglevel < 0)
||(newloglevel > 3))
{
mbp = putals("IPCONVERS-Server:\r");
#ifdef SPEECH
putprintf(mbp, speech_message(325));
#else
putprintf(mbp, "Fehler: Loglevel werte von 0 bis 3!\r");
#endif
prompt(mbp);
seteom(mbp);
return;
}
/* Neuen Loglevel Sysop setzen. */
ifpp->log = newloglevel;
mbp = putals("IPCONVERS-Server:\r");
#ifdef SPEECH
putprintf(mbp, speech_message(299), ifpp->log);
#else
putprintf(mbp, "My Loglevel: %d\r", ifpp->log);
#endif
prompt(mbp);
seteom(mbp);
return;
break;
#ifdef OS_IPLINK
/* Route eintragen/loeschen. */
case 'R':
/* Steht noch was im Buffer? */
if (!skipsp(&clicnt, &clipoi))
{
putmsg("Invalid Parameter\r");
return;
}
/* Leerzeile loeschen. */
clicnt--;
switch (*clipoi++)
{
/* Route loeschen? */
case '-':
/* Steht noch was im Buffer? */
if (!skipsp(&clicnt, &clipoi))
{
putmsg("Invalid Parameter\r");
return;
}
/* IPConver-Route loeschen. */
IPConvDelTBL(clipoi);
break;
/* Neue Route eintragen. */
case '+':
/* Steht noch was im Buffer? */
if (!skipsp(&clicnt, &clipoi))
{
putmsg("Invalid Parameter\r");
return;
}
/* Call lesen */
if (getcal(&clicnt, &clipoi, TRUE, (char *)tmpcall) != YES)
{
invcal();
return;
}
/* Steht noch was im Buffer? */
if (!skipsp(&clicnt, &clipoi))
{
putmsg("Invalid Parameter\r");
return;
}
/* Hostname/IP-Adresse einlesen. */
for (i = 0; i < HNLEN; ++i)
{
/* Keine Zeichen oder leerzeichen? */
if (!clicnt || *clipoi == ' ')
/* Schleife abbrechen. */
break;
clicnt--;
/* Aktuelles zeichen in TBL schreiben. */
tmphost[i] = *clipoi++;
}
tmphost[i] = NUL;
/* Hostname oder IP-Adresse pruefen. */
he = gethostbyname((char *)tmphost);
/* IP-Adresse OK? */
if (he == NULL)
{
/* Hostname nicht bekannt oder */
/* IP-Adresse ungueltig. */
putmsg("Invalid Parameter\r");
return;
}
(void)memcpy(tip, he->h_addr_list[0], 4);
/* Kopiere IP-Adresse in TBL. */
sprintf((char *)tmpip, "%d.%d.%d.%d"
,tip[0]
,tip[1]
,tip[2]
,tip[3]);
/* Steht noch was im Buffer? */
if (!skipsp(&clicnt, &clipoi))
{
putmsg("Invalid Parameter\r");
return;
}
/* TCP-Port einlesen. */
tmptport = nxtlong(&clicnt, &clipoi);
/* Pruefen ob der TCP-Port gueltig ist. */
if ( tmptport <= 0
||tmptport > 65535)
{
putmsg("Invalid Parameter\r");
return;
}
/* Steht noch was im Buffer? */
if (!skipsp(&clicnt, &clipoi))
tmplink = FALSE;
else
if (!strncasecmp(clipoi, "LINK", clicnt))
tmplink = TRUE;
else
tmplink = FALSE;
/* Neue IPC-Route hinzufuegen. */
IPConvAddTBL(tmpcall, /* Rufzeichen. */
tmphost, /* Hostname/IP-Adresse. */
he, /* IP-Adresse. */
(unsigned short)tmptport, /* TCP-Port. */
tmplink); /* Status: USER/LINK-Modus. */
}
break;
#endif /* OS_IPLINK */
default:
putmsg("Invalid Parameter\r");
return;
}
}
mbp = putals("IPCONVERS-Server");
putprintf(mbp,":(%d/%d):\r", ip_tbl_top, MAX_ROUTEN);
#ifdef OS_IPLINK
putstr("Name------IP---------------Port--Status-\r", mbp);
for (i = 0; i < ip_tbl_top; ++i)
ShowIpcEntry(ip_tbl[i], mbp);
putstr("\r", mbp);
#endif /* OS_IPLINK */
#ifdef SPEECH
putprintf(mbp, speech_message(299), ifpp->log);
putprintf(mbp, speech_message(326), Ntohs(ifpp->tcpport));
#else
putprintf(mbp, "My Loglevel: %u\r", ifpp->log);
putprintf(mbp, "My TCP-Port: %u\r", Ntohs(ifpp->tcpport));
#endif
prompt(mbp);
seteom(mbp);
}
/******************************************************************************/
/* */
/* Im Convers anmelden. */
/* */
/******************************************************************************/
void IPConvLogin(void)
{
PTCENT *ptcp;
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvLogin)";
#endif /* DEBUG_MODUS */
cpyid(usrcal, tcppoi->Upcall); /* Usercall setzen fuer CVS. */
clipoi = tcppoi->cmd; /* ggf. Channel setzen. */
clicnt = tcppoi->cmdlen; /* laenge setzen. */
ptcp = ptctab + g_uid(tcppoi, TCP_USER);/* User aus der patchcord ermitteln.*/
ptcp->state = C_IPLINK; /* Option fuer USER-Ausgabe setzen. */
userpo = ptcp->ublk; /* Userblock-Zeiger lesen. */
userpo->convflag = 1; /* Connect von aussen!. */
#ifdef L1IRC
userpo->IrcMode = tcppoi->IrcMode;
#endif /* L1IRC */
ccpcvs(); /* Login in den Convers. */
ifpp = SetInterface(tcppoi->Interface); /* akt. Interface setzen. */
/* ggf. Logbuch fuehren. */
T_LOGL2(TRUE, "(IPConvogin):%s\n.Login in den Convermodus.\n"
, tcppoi-> ip);
return;
}
/* Aktuelle Zeichen auswerten. */
TRILLIAN GetContensCVS(char contens)
{
int i = 0;
char s[RXLEN];
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(GetContensCVS)";
#endif /* DEBUG_MODUS */
/* Linkpartner? */
if (tcppoi->CVSlink)
{
/* Alles auf 0 setzen. */
tcppoi->cmdlen = 0;
tcppoi->rxc = 0;
/* Alle Zeichen vom Socket holen. */
while (tcppoi->rxc < tcppoi->RecvLen)
{
/* Aktuelle Zeichen. */
s[i] = tcppoi->rxbuf[tcppoi->rxc++];
/* Zeichen ein Return? */
if (s[i] == CR)
/* zum naechsten Zeichen. */
continue;
/* Zeichen ein Return? */
if (s[i] == LF)
{
tcppoi->cmd[tcppoi->cmdlen++] = CR;
/* zum naechsten Zeichen. */
continue;
}
/* Aktuelles Zeichen setzen. */
tcppoi->cmd[tcppoi->cmdlen++] = s[i++];
}
/* Nullzeichen setzen. */
tcppoi->cmd[tcppoi->cmdlen] = 0;
/* Frame ist komplett. */
return(YES);
}
else
/* User */
{
/* Zeichen ein Return? */
if (contens == CR)
/* Markiere es das es ein Return gibt. */
tcppoi->cr = TRUE;
/* Zeichen ein LF-Return? */
if (contens == LF)
/* LF moegen wir nicht. */
/* zum naechsten Zeichen. */
return(NO);
/* Alle Zeichen durch. */
if (contens == (int)NULL)
{
/* War ein Return dabei? */
if (tcppoi->cr)
{
tcppoi->cr = FALSE;
/* Frame ist komplett. */
return(YES);
}
else
/* Return fehlt, */
return(ERRORS);
}
/* User noch nicht eingeloggt? */
if (!tcppoi->login)
{
/* Zeichen auf Gueltigkeit pruefen. */
if (CheckContens(contens))
{
/* Ist es ein Linkpartner? */
if (!strncmp(tcppoi->cmd, "ppconvers", 9))
tcppoi->CVSlink = TRUE;
else
/* Ungueltiges Zeichen. */
/* zum naechsten Zeichen. */
return(NO);
}
}
/* Aktuelle Zeichen setzen. */
tcppoi->cmd[tcppoi->cmdlen++] = contens;
/* Zum naechsten Zeichen. */
return(NO);
}
return(ERRORS);
}
#ifdef OS_IPLINK
/* Speichern der IPCONV-Routen. */
void IPConvDump(MBHEAD *mbp)
{
int i;
char tmp[10];
char *linkstatus[] = {"User","Link"};
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvDump)";
#endif /* DEBUG_MODUS */
putstr("; IPConv Routen\r;\r",mbp);
for (i = 0; i < ip_tbl_top; i++)
{
call2str(tmp, (char *)ip_tbl[i].name);
putprintf(mbp,"IPC R + %s %s %u %s\r"
,tmp
,ip_tbl[i].hostname
,ip_tbl[i].port
,ip_tbl[i].linkflag ? linkstatus[ip_tbl[i].linkflag] : linkstatus[ip_tbl[i].linkflag]);
}
putstr(";\r", mbp);
}
/******************************************************************************/
/* */
/* IPC-Route in TBL suchen. */
/* */
/******************************************************************************/
int IPConvIS(char *name, DEST *dest)
{
register int i;
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvIS)";
#endif /* DEBUG_MODUS */
for (i = 0; i < ip_tbl_top; i++) /* Alle Eintraege durch gehen. */
{
if (cmpid(name, (char *)ip_tbl[i].name)) /* Rufzeichenvergleich. */
{
cpyid(dest->call, (char *)ip_tbl[i].name); /* Rufzeichen setzen. */
dest->port = ip_tbl[i].l2port; /* L2-Port setzen. */
dest->via[0] = 0; /* defaultwerte setzen. */
dest->typ = 'U';
dest->eax = 0;
return(TRUE); /* Eintrag gefunden. */
}
}
return(FALSE); /* Kein eintrag gefunden. */
}
/* Rufzeichen in der IPC-TBL suchen. */
int IPConvSearch(char *call)
{
register int i = 0;
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvSearch)";
#endif /* DEBUG_MODUS */
/* Alle Eintraege durch gehen. */
for (i = 0; i < ip_tbl_top; ++i)
{
/* Vergleiche Call/SSID. */
if (cmpid(call, (char *)ip_tbl[i].name))
/* i = TBL-Nummer vom CALL. */
return(i);
}
/* Es gibt keinen Eintrag mit dem */
/* gesuchten Rufzeichen. */
return(EOF);
}
/*****************************************************************************/
/* */
/* Neue IPC-Route hinzufuegen */
/* */
/*****************************************************************************/
void IPConvAddTBL(char *call,
unsigned char *host,
struct hostent *hstent,
unsigned short tport,
BOOLEAN link)
{
register int i;
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvAddTBL)";
#endif /* DEBUG_MODUS */
/* Suche Rufzeichen in der TBL. */
if ((i = IPConvSearch(call)) != EOF)
{ /* IPC-Route Aktualisieren. */
(void)memcpy(ip_tbl[i].hostname, host, HNLEN); /* Hostname setzen. */
ip_tbl[i].l2port = ifp[CVS_ID].l2port; /* L2-Port setzen. */
ip_tbl[i].port = tport; /* TCP-Port setzen. */
ip_tbl[i].linkflag = link; /* Status: User/Link setzen. */
}
else /* IPC-Route hinzufuegen. */
{
cpyid(ip_tbl[ip_tbl_top].name, call); /* Rufzeichen setzen*/
(void)memcpy(ip_tbl[ip_tbl_top].hostname, host, HNLEN);/* Hostname setzen.*/
(void)memcpy((unsigned char*)&ip_tbl[ip_tbl_top].ipaddr, (unsigned char *)&hstent->h_addr_list[0][0], 4);
ip_tbl[ip_tbl_top].l2port = ifp[CVS_ID].l2port; /* L2-Port eintragen. */
ip_tbl[ip_tbl_top].port = tport; /* TCP-Port eintragen. */
ip_tbl[ip_tbl_top].linkflag = link; /* Status: User/Link setzen. */
ip_tbl_top++; /* Ein Tabelleneintrag mehr */
}
}
/* IPCONV-Route loeschen. */
BOOLEAN IPConvDelTBL(char *name)
{
register int i;
register int j;
char tmp[10];
char *tmppoi = name;
WORD tmpcnt = strlen(name);
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvDelTBL)";
#endif /* DEBUG_MODUS */
getcal(&tmpcnt, &tmppoi, TRUE, tmp);
for (i = 0; i < ip_tbl_top; ++i)
{
if (cmpid(tmp, (char *)ip_tbl[i].name))
{
for (j = i; j < ip_tbl_top; ++j)
ip_tbl[j] = ip_tbl[j+1];
/* Ein Tabelleneintrag weniger */
ip_tbl_top--;
return(TRUE);
}
}
return(FALSE);
}
/* IPConvers-Hostname lesen. */
BOOLEAN IPConvGetName(WORD *len, char **inbuf, BOOLEAN flag, char *outbuf)
{
char name[NAMESIZE + 1];
char *nampoi;
char zeichen;
char *p = *inbuf, *save_inbuf = *inbuf;
WORD n = *len, save_len = *len;
int plen = FALSE;
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvGetName)";
#endif /* DEBUG_MODUS */
skipsp(&n, &p);
nampoi = name;
if (n)
{
while (n > 0)
{
zeichen = (char) toupper(*p);
if (zeichen == ' ')
break;
if ( ((zeichen >= '0') && (zeichen <= '9'))
|| ((zeichen >= 'A') && (zeichen <= 'Z')))
{
*nampoi++ = zeichen;
p++;
n--;
plen++;
if (plen > NAMESIZE)
return(FALSE);
continue;
}
n--;
p++;
}
name[plen] = 0;
strncpy(outbuf, name, NAMESIZE);
if (flag)
{
*len = save_len;
*inbuf = save_inbuf;
}
else
{
*len = n;
*inbuf = p;
}
return(TRUE);
}
return(FALSE);
}
/* IPConvers IP-Adresse lesen,. */
BOOLEAN IPConvGetIP(WORD *laenge, char **inbuf, unsigned char *outbuf)
{
char ipadresse[16 + 1];
char *ipaddrpoi;
char zeichen;
char *p = *inbuf;
WORD n = *laenge;
int len = FALSE;
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvGetIP)";
#endif /* DEBUG_MODUS */
skipsp(&n, &p);
ipaddrpoi = ipadresse;
if (n)
{
while (n > 0)
{
zeichen = (char) toupper(*p);
if (zeichen == ' ')
break;
if ( (zeichen == '.')
|| ((zeichen >= '0') && (zeichen <= '9')))
{
*ipaddrpoi++ = zeichen;
p++;
n--;
len++;
if (len > 16)
return(FALSE);
continue;
}
p++;
n--;
}
ipadresse[len] = 0;
strncpy((char *)outbuf, (char *)ipadresse, 16);
*laenge = n;
*inbuf = p;
return(TRUE);
}
return(FALSE);
}
int IPConvConnect(char *call, char *upcall, BOOLEAN flag)
{
#ifdef DEBUG_MODUS
lastfunc = "l1ipconv(IPConvConnect)";
#endif /* DEBUG_MODUS */
if (IPConvConnectOS(call, upcall, flag))
return(TRUE);
return(FALSE);
}
#endif /* OS_IPLINK */
#endif /* L1IPCONV */
/* End of os/win32/ipconv.c */