200 lines
5.7 KiB
C
Executable file
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 */
|