TheNetNode-CB/os/linux/osipconv.c

200 lines
5.7 KiB
C
Executable file

#include "tnn.h"
#ifdef OS_IPLINK
/* Zeiger auf das Aktuelle Interface. */
static T_INTERFACE *ifpp;
/* Struktur (sockaddr_in) fuer Server definieren. */
struct sockaddr_in myaddr_in;
/* Struktur (sockaddr_in) fuer client definieren. */
struct sockaddr_in peeraddr_in;
/* Ein Connect zum TCPIP-Nachbarn aufbauen. */
int IPConvConnectOS(char *call, char *upcall, BOOLEAN flag)
{
SENDTX *STx = NULL;
int fd = EOF;
int ch = FALSE;
register int i = EOF;
struct hostent *h;
long addr;
char tmp[10];
#ifdef DEBUG_MODUS
lastfunc = "osipconv(IPConvConnectOS)";
#endif /* DEBUG_MODUS */
ifpp = &ifp[CVS_ID]; /* Zeiger auf das IPCONV-Interface. */
/* IPConvers aktiv? */
if (ifpp->actively == FALSE)
{
/* ggf. Logbuch fuehren. */
T_LOGL1(TRUE, "(IPConvConnectOS):\nIPConvConnectOS: Kein IPConvers-Port geoeffnet!\n");
/* Nein, abbrechen. */
return(TRUE);
}
/* Suche Rufzeichen in der IPC-TBL. */
if ((i = IPConvSearch(call)) == EOF)
{
/* ggf. Logbuch fuehren. */
T_LOGL1(TRUE, "(IPConvConnectOS):\nRufzeichen (%s) wurde nicht gefunden!\n"
, call);
/* Nix gefunden, abbrechen. */
return(TRUE);
}
/* Konvertiere Rufzeichen OHNE SSID!. */
callss2str(tmp, upcall);
/* Konvertiere IP-Adresse. */
if ( (addr = inet_addr((const char *)ip_tbl[i].hostname)) == EOF)
{
/* Hostname aufloesen. */
if ((h = gethostbyname((char *)ip_tbl[i].hostname)) == FALSE)
{
/* ggf. Logbuch fuehren. */
T_LOGL1(TRUE, "(IPConvConnectOS):\nIP-Adresse/Hostname (%s) konnte nicht aufgeloest werden!\n"
, ip_tbl[i].hostname);
/* Hostname/IP-Adresse ungueltig, abbrechen. */
return(TRUE);
}
/* IP-Adresse zuweisen. */
addr = ((struct in_addr*)h->h_addr)->s_addr;
}
/* Adressstruktur loeschen */
memset(&myaddr_in, 0, sizeof(myaddr_in));
/* Adressstruktur fuellen */
myaddr_in.sin_family = AF_INET;
/* Auf tcp_port lauschen. */
myaddr_in.sin_port = htons(ip_tbl[i].port);
/* Jedes netzwerk-taugliche Geraet abfragen. */
myaddr_in.sin_addr.s_addr = addr;
/* Socket erstellen. */
if ((fd = socket (AF_INET, SOCK_STREAM, 0)) == EOF)
{
/* ggf. Logbuch fuehren. */
T_LOGL1(TRUE, "(IPConvConnectOS):%s\nNeuen Socket konnte nicht erstellt werden!\n"
, ip_tbl[i].hostname);
#ifdef SPEECH
printf(speech_message(335));
#else
printf("Error: Socket cannot be constructed!\r");
#endif
return(TRUE);
}
/* Connnect Initialisieren. */
if (connect (fd, (struct sockaddr *) &myaddr_in, sizeof (struct sockaddr_in)) == EOF)
{
/* ggf. Logbuch fuehren. */
T_LOGL1(TRUE, "(IPConvConnectOS):\nConnect nicht moeglich (IP-Addr: %s)!\n"
, ip_tbl[i].hostname);
/* Schliesse Socket. */
close(fd);
return(TRUE);
}
/* Neues TCPIP-Segment anlegen. */
if (AddUserOS(ifpp, fd, (char *)ip_tbl[i].hostname))
{
/* Schliesse Socket. */
close(fd);
return(TRUE);
}
/* Markiere Route als Linkpartner. */
tcppoi->CVSlink = TRUE;
/* Markiere das wir eingeloggt sind. */
tcppoi->login = TRUE;
/* Markiere, kein prompt senden. */
tcppoi->LoginPrompt = TRUE;
/* Maximalwert fuer die Statistik */
if (++nmbtcp > nmbtcp_max)
nmbtcp_max = nmbtcp;
/* Mit channel angabe? */
if (clicnt)
/* Hole channel. */
ch = atoi(clipoi);
/* Wenn Nachbar STATUS "User" hat, gleich durch connecten. */
if ( (!flag)
&&(ip_tbl[i].linkflag == TRUE))
{
/* ggf. Logbuch fuehren. */
T_LOGL2(TRUE, "(IPConvConnectOS):\nVerbindung zur IP-Adresse %s hergestellt.\n"
, ip_tbl[i].hostname);
return(FALSE);
}
if ((STx = (SENDTX *)allocb(ALLOC_L1IPCONV)) == NULL)/* TX-Segment besorgen. */
{
/* ggf. Logbuch fuehren. */
T_LOGL1(TRUE, "(IPConvConnectOS):%s\nSpeicher (%d) ist voll!\n"
, ip_tbl[i].hostname
, nmbfre);
/* Schliesse Socket. */
close(fd);
tcppoi->disflg |= 0x80; /* Segment auf Disconnect setzen. */
return(TRUE); /* Kein Segment frei, abbruch. */
}
if ((STx->Data = SetBuffer()) == NULL) /* Buffer besorgen. */
{
dealoc((MBHEAD *)ulink((LEHEAD *)STx)); /* TX-Segment entsorgen.*/
/* ggf. Logbuch fuehren. */
T_LOGL1(TRUE, "(IPConvConnectOS):%s\nSpeicher (%d) ist voll!\n"
, ip_tbl[i].hostname
, nmbfre);
/* Schliesse Socket. */
close(fd);
tcppoi->disflg |= 0x80; /* Segment auf Disconnect setzen. */
return(TRUE); /* Buffer ist voll, abbruch. */
}
STx->Sock = tcppoi->sock; /* Socket setzen. */
STx->Interface = tcppoi->Interface; /* Interface setzen. */
STx->Mode = tcppoi->mode; /* Stack-Mode setzen. */
/* Je nach Status von flag */
/* demenstsprechend reagieren. */
if (flag)
putprintf(STx->Data, "ppconvers/\377\200HOST %s %s %s\r", myhostname, myrev, myfeatures);
else
{
/* Wenn Nachbar STATUS "User" hat, gleich durch connecten. */
if (ip_tbl[i].linkflag == FALSE)
/* Loginstring vorbereiten. */
putprintf(STx->Data, "/na %s %d\r", tmp, ch);
}
rwndmb(STx->Data);
/* Umhaengen in die sendesliste. */
relink((LEHEAD *) STx, (LEHEAD *)rxflTX.tail);/* Umhaengen in die Sendeliste. */
/* ggf. Logbuch fuehren. */
T_LOGL2(TRUE, "(IPConvConnectOS):\nVerbindung zur IP-Adresse %s hergestellt.\n"
, ip_tbl[i].hostname);
return(FALSE);
}
#endif /* OS_IPLINK */
/* End of os/linux/osipconv.c */