708 lines
24 KiB
C
708 lines
24 KiB
C
|
|
||
|
#include "tnn.h"
|
||
|
#ifdef OS_STACK
|
||
|
|
||
|
static T_INTERFACE *ifpp; /* Zeiger auf das aktuelle Interface */
|
||
|
|
||
|
struct sockaddr_in myaddr_in;
|
||
|
struct sockaddr_in peeraddr_in;
|
||
|
|
||
|
|
||
|
/* Schliesse aktuellen Socket. */
|
||
|
BOOLEAN CloseSockOS(BOOLEAN ALL, WORD INTERFACE)
|
||
|
{
|
||
|
int i,
|
||
|
j = 0;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(CloseSockOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
/* ALLE Socket-Verbindungen schliessen. */
|
||
|
if (ALL == TRUE)
|
||
|
{
|
||
|
/* TCPIP-TBL durchgehen. */
|
||
|
for (i = 0, tcppoi = tcptbl; i < MAXTCPIP; ++i, ++tcppoi)
|
||
|
{
|
||
|
/* Ist Socket noch offen? */
|
||
|
if ( INTERFACE == tcppoi->Interface
|
||
|
&& tcppoi->sock > TRUE)
|
||
|
{
|
||
|
if (tcppoi->mode != OS_MODE) /* Segment kein OS-STACK, */
|
||
|
continue; /* zum naechsten Segment. */
|
||
|
|
||
|
/* Socket schliessen. */
|
||
|
close(tcppoi->sock);
|
||
|
|
||
|
/* TCPIP-User/link aus der Liste raushaengen */
|
||
|
/* bzw. Parameter wieder auf 0 setzen. */
|
||
|
DiscTCP();
|
||
|
}
|
||
|
|
||
|
/* Sind alle aktiven Sockets durchlaufen, */
|
||
|
if (((tcppoi->activ) && (j++ >= tcp_tbl_top)) || (j == tcp_tbl_top))
|
||
|
/* brechen wir ab. */
|
||
|
return(FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Socket schliessen. */
|
||
|
close(tcppoi->sock);
|
||
|
|
||
|
/* TCPIP-User/Link aus der Liste raushaengen */
|
||
|
/* bzw. Parameter wieder auf 0 setzen. */
|
||
|
DiscTCP();
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
/* TCPIP-Port Initialisierung. */
|
||
|
BOOLEAN L1InitOS(UWORD Interface, int l2port, unsigned short TCPPort)
|
||
|
{
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(L1InitOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
if (l2port == EOF) /* Keine Portangabe!!!. */
|
||
|
{
|
||
|
printf("(L1InitOS): Fehler, keine L2-Portangabe!!!\n");
|
||
|
return(FALSE);
|
||
|
}
|
||
|
/* Zeiger auf das aktuelle Interface. */
|
||
|
if ((ifpp = SearchIf(Interface)) == NULL)
|
||
|
{
|
||
|
printf("(L1InitOS): Fehler, Interface existiert nicht!!!\n");
|
||
|
return(FALSE); /* Abbrechen. */
|
||
|
}
|
||
|
/* Einen neuen Filedescriptor anlegen. */
|
||
|
if ((ifpp->OsSock = SetupOS(ifpp, htons(TCPPort))) == EOF)
|
||
|
return(FALSE); /* Abbrechen. */
|
||
|
|
||
|
ifpp->l2port = l2port; /* L2-Port setzen. */
|
||
|
ifpp->tcpport = TCPPort; /* akt. TCP-Port setzen. */
|
||
|
|
||
|
return(TRUE); /* Erfolgreich Socket erstellt. */
|
||
|
}
|
||
|
|
||
|
/* TCPIP-Interface schliessen. */
|
||
|
void L1ExitOS(UWORD Interface)
|
||
|
{
|
||
|
T_INTERFACE *ifpoi;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(L1ExitOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
/* Zeiger auf das aktuelle Interface. */
|
||
|
if ((ifpoi = SearchIf(Interface)) == NULL)
|
||
|
/* Aktuelles Interface ist deaktiv, */
|
||
|
/* dann zum naechsten Interface. */
|
||
|
return;
|
||
|
|
||
|
/* Alle TCPIP-Verbindungen auf den Interface schliessen. */
|
||
|
CloseSockOS(TRUE, ifpoi->Interface);
|
||
|
|
||
|
/* Interface ist nicht aktiv, */
|
||
|
if (ifpoi->actively == FALSE)
|
||
|
/* damit ist hier schon schluss. */
|
||
|
return;
|
||
|
|
||
|
/* TCPIP-Socket schliessen. */
|
||
|
close(ifpoi->OsSock);
|
||
|
|
||
|
/* Markiere TCPIP-Interface als deaktiv. */
|
||
|
ifpoi->actively = FALSE;
|
||
|
}
|
||
|
|
||
|
/* Einen Filedescriptor anlegen. */
|
||
|
int SetupOS(T_INTERFACE *ifpp, /* Zeiger auf das aktuelle Interface. */
|
||
|
unsigned short tcp_port) /* Neuer TCP-Port. */
|
||
|
{
|
||
|
int tmp_fd = EOF; /* Temporaerer Filedescriptor */
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(SetupOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
if (tcp_port == FALSE) /* Kein Port angegeben. */
|
||
|
{
|
||
|
T_LOGL1(TRUE, "(SetupOS):\nKein TCP-Port angegeben.\n");
|
||
|
return(EOF); /* Abbruch. */
|
||
|
}
|
||
|
|
||
|
memset(&myaddr_in, 0, sizeof(myaddr_in)); /* Adressstruktur loeschen */
|
||
|
memset(&peeraddr_in, 0, sizeof(peeraddr_in));
|
||
|
myaddr_in.sin_family = AF_INET; /* Adressstruktur fuellen */
|
||
|
myaddr_in.sin_port = htons(tcp_port); /* TCP-Port setzen. */
|
||
|
myaddr_in.sin_addr.s_addr = INADDR_ANY; /* Jedes Netzwerk Geraet abfragen. */
|
||
|
|
||
|
/* Socket erstellen. */
|
||
|
if ((tmp_fd = socket(AF_INET, SOCK_STREAM, 0)) == EOF)
|
||
|
{
|
||
|
printf("Error %s: Socket cannot be constructed!\r", ifpp->name);
|
||
|
|
||
|
T_LOGL1(TRUE, "(SetupOS):\nNeuer Socket kann nicht geoeffnet werden.\n");
|
||
|
return(EOF); /* Keine freien Socket's. */
|
||
|
}
|
||
|
|
||
|
/* Bind Initialisieren. */
|
||
|
if (bind (tmp_fd, (struct sockaddr *) &myaddr_in, sizeof (struct sockaddr_in)) == EOF)
|
||
|
{
|
||
|
printf("Error %s: Bind cannot be initialized!\n", ifpp->name);
|
||
|
close(tmp_fd); /* Schliesse Socket. */
|
||
|
|
||
|
T_LOGL1(TRUE, "(SetupOS):\nBind Initialisierung fehlgeschlagen.\n");
|
||
|
return(EOF); /* Fehler beim Bind . */
|
||
|
}
|
||
|
|
||
|
if (listen (tmp_fd, 3) == EOF) /* Listen Initialisieren. */
|
||
|
{
|
||
|
printf("Error %s: listen cannot be initialized!\n", ifpp->name);
|
||
|
close(tmp_fd); /* Schliesse Socket. */
|
||
|
|
||
|
T_LOGL1(TRUE, "(SetupOS):\nListen Initialisierung fehlgeschlagen.\n");
|
||
|
return(EOF); /* Fehler beim Listen. */
|
||
|
}
|
||
|
|
||
|
T_LOGL1(TRUE, "(SetupOS):\nTCP-Port (%d) erfolgreich gesetzt.\n"
|
||
|
, ntohs(tcp_port));
|
||
|
return(tmp_fd); /* Aktuelle Filedescriptor. */
|
||
|
}
|
||
|
|
||
|
|
||
|
/* Anhand des Sockets den User aus der Liste holen. */
|
||
|
TCPIP *FdReadOS(fd_set *fds)
|
||
|
{
|
||
|
int i,
|
||
|
j = 0;
|
||
|
LHEAD *h_llp;
|
||
|
|
||
|
h_llp = &tcpactl;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(FdReadOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
/* TCPIP-TBL durchgehen. */
|
||
|
for (i = 0, tcppoi = tcptbl; i < MAXTCPIP; ++i, ++tcppoi)
|
||
|
{
|
||
|
if (tcppoi->mode != OS_MODE)
|
||
|
continue;
|
||
|
|
||
|
/* Nur wenn aktiv! */
|
||
|
if (tcppoi->activ)
|
||
|
{
|
||
|
/* Vergleiche die Sockets */
|
||
|
if (FD_ISSET(tcppoi->sock, fds))
|
||
|
{
|
||
|
/* wir haben einen Link gefunden */
|
||
|
ulink((LEHEAD *)tcppoi);
|
||
|
relink((LEHEAD *)tcppoi, (LEHEAD *)h_llp->tail);
|
||
|
return(tcppoi);
|
||
|
}
|
||
|
}
|
||
|
/* Sind alle aktiven Sockets durchlaufen, */
|
||
|
if (((tcppoi->activ) && (j++ >= tcp_tbl_top)) || (j == tcp_tbl_top))
|
||
|
/* brechen wir ab. */
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
/* Keinen Eintrag gefunden. */
|
||
|
return(NULL);
|
||
|
}
|
||
|
|
||
|
int ReadSockOS(void) /* Empfangene TCPIP Packete. */
|
||
|
{
|
||
|
fd_set fdsI;
|
||
|
struct timeval timevalue;
|
||
|
int ret = EOF;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(ReadSockOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
if (tcppoi->rxc >= tcppoi->RecvLen) /* Sind alle Zeichen verarbeitet. */
|
||
|
{
|
||
|
if (!tcppoi->mode) /* OS-Stack. */
|
||
|
{
|
||
|
FD_ZERO(&fdsI); /* Inhalt loeschen. */
|
||
|
FD_SET((unsigned)tcppoi->sock, &fdsI); /* Socket setzen. */
|
||
|
|
||
|
timevalue.tv_usec = 0;
|
||
|
timevalue.tv_sec = 0;
|
||
|
/* Pruefe auf aktivitaet. */
|
||
|
ret = select(tcppoi->sock + 1, &fdsI, NULL , NULL ,&timevalue);
|
||
|
|
||
|
if (ret <= 0)
|
||
|
return((int)NULL); /* Keine aktivitaet auf den Socket. */
|
||
|
else
|
||
|
/* Zeichen vom Socket empfangen. */
|
||
|
tcppoi->RecvLen = recv (tcppoi->sock, tcppoi->rxbuf, RXLEN,0);
|
||
|
}
|
||
|
|
||
|
if (tcppoi->RecvLen < 1) /* Fehler beim Empfang. */
|
||
|
{
|
||
|
if (tcppoi->RecvLen == EOF) /* Socket wurde mittlerweile geloes. */
|
||
|
{
|
||
|
ifpp = SetInterface(tcppoi->Interface); /* akt. Interface setzen. */
|
||
|
/* ggf. Logbuch fuehren. */
|
||
|
T_LOGL1(TRUE, "(ReadSockOS):%s\n (Recv) Fehler beim empfang, Segment wird auf DISC gesetzt!\n"
|
||
|
, tcppoi->ip);
|
||
|
|
||
|
tcppoi->disflg |= 0x80; /* Segment auf DISC stellen. */
|
||
|
return((int)NULL);
|
||
|
}
|
||
|
|
||
|
if ( (ret)
|
||
|
&&(tcppoi->RecvLen == 0))
|
||
|
{
|
||
|
ifpp = SetInterface(tcppoi->Interface); /* akt. Interface setzen. */
|
||
|
/* ggf. Logbuch fuehren. */
|
||
|
T_LOGL1(TRUE, "(ReadSockOS):%s\n(Recv) Keine Zeichen, Segment wird auf DISC gesetzt!\n"
|
||
|
, tcppoi->ip);
|
||
|
|
||
|
tcppoi->disflg |= 0x80; /* Segment auf DISC stellen. */
|
||
|
return((int)NULL);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tcppoi->rxc = 0; /* RX-Zaehler auf 0 setzen. */
|
||
|
tcppoi->rxbuf[tcppoi->RecvLen] = 0; /* Nullzeichen setzen. */
|
||
|
/* ggf. Logbuch fuehren. */
|
||
|
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
T_LOGL3(TRUE, "(ReadSockOS):%s\nInput:\r%s\r"
|
||
|
, tcppoi->ip
|
||
|
, tcppoi->rxbuf);
|
||
|
}
|
||
|
|
||
|
ret = tcppoi->rxbuf[tcppoi->rxc++]; /* Zeichen vom rxbuf holen. */
|
||
|
|
||
|
return(ret); /* Aktuelle Zeichen weiterreichen. */
|
||
|
}
|
||
|
|
||
|
static int OsStackReadIndicationsSock(void) /* Zeichen vom Socket einlesen. */
|
||
|
{
|
||
|
TRILLIAN ok = ERRORS;
|
||
|
char s;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(OsStackReadIndicationsSock)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
while(1) /* Alle Zeichen von Socket einlesen. */
|
||
|
{
|
||
|
s = ReadSockOS(); /* Zeichen vom Socket. */
|
||
|
|
||
|
if (tcppoi->cmdlen >= RXLEN) /* Maximale Buffergroesse erreicht, */
|
||
|
{
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
T_LOGL1(TRUE, "(OsStackReadIndicationsSock):%s\nMaximale Buffergroesse erreicht!\n"
|
||
|
, tcppoi->ip);
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
switch(tcppoi->Interface) /* Interface. */
|
||
|
{
|
||
|
#ifdef L1TELNET
|
||
|
case KISS_TELNET : /* TELNET-Server. */
|
||
|
if ((ok = GetContensTEL(s)) == ERRORS) /* Aktuelle Zeichen auswerten.*/
|
||
|
break; /* Zeichen verarbeitet, kein Return. */
|
||
|
else
|
||
|
if (ok == YES) /* Zeichen verarbeitet und Return. */
|
||
|
{
|
||
|
tcppoi->cmd[tcppoi->cmdlen] = 0; /* Nullzeichen setzen. */
|
||
|
return(TRUE); /* Frame ist komplett. */
|
||
|
}
|
||
|
else
|
||
|
continue; /* Sind noch Zeichen im RXBUF, */
|
||
|
/* zum naechsten Zeichen. */
|
||
|
break;
|
||
|
#endif /* L1TELNET. */
|
||
|
|
||
|
#ifdef L1HTTPD
|
||
|
case KISS_HTTPD : /* HTTPD-Server. */
|
||
|
if ((ok = GetContensHTP(s)) == ERRORS) /* Aktuelle Zeichen auswerten.*/
|
||
|
break; /* Zeichen verarbeitet, kein Return. */
|
||
|
else
|
||
|
if (ok == YES) /* Zeichen verarbeitet und Return. */
|
||
|
{
|
||
|
tcppoi->cmd[tcppoi->cmdlen] = 0; /* Nullzeichen setzen. */
|
||
|
return(TRUE); /* Frame ist komplett. */
|
||
|
}
|
||
|
else
|
||
|
continue; /* Sind noch Zeichen im RXBUF, */
|
||
|
/* zum naechsten Zeichen. */
|
||
|
break;
|
||
|
#endif /* L1HTTPD. */
|
||
|
|
||
|
#ifdef L1IPCONV
|
||
|
/* IPCONV */
|
||
|
case KISS_IPCONV :
|
||
|
/* Aktuelle Zeichen auswerten. */
|
||
|
if ((ok = GetContensCVS(s)) == ERRORS)
|
||
|
/* Alle Zeichen verarbeitet, aber kein Return. */
|
||
|
break;
|
||
|
else
|
||
|
/* Alle Zeichen verarbeitet und Return? */
|
||
|
if (ok == YES)
|
||
|
{
|
||
|
/* User/Link noch kein Login. */
|
||
|
if (!tcppoi->login)
|
||
|
{
|
||
|
/* Pruefe auf Login. */
|
||
|
if (!strncmp(tcppoi->cmd, "/na", 3))
|
||
|
/* Kein Prompt senden. */
|
||
|
tcppoi->LoginPrompt = TRUE;
|
||
|
}
|
||
|
tcppoi->cmd[tcppoi->cmdlen] = 0;
|
||
|
/* Frame komplett. */
|
||
|
return(TRUE);
|
||
|
}
|
||
|
else
|
||
|
/* Sind noch Zeichen im RXBUF,*/
|
||
|
/* zum naechsten Zeichen. */
|
||
|
continue;
|
||
|
|
||
|
break;
|
||
|
#endif /* L1IPCONV */
|
||
|
|
||
|
#ifdef L1IRC
|
||
|
/* IPCONV */
|
||
|
case KISS_IRC :
|
||
|
/* Aktuelle Zeichen auswerten. */
|
||
|
if ((ok = GetContensCVS(s)) == ERRORS)
|
||
|
/* Alle Zeichen verarbeitet, aber kein Return. */
|
||
|
break;
|
||
|
else
|
||
|
/* Alle Zeichen verarbeitet und Return? */
|
||
|
if (ok == YES)
|
||
|
{
|
||
|
/* User/Link noch kein Login. */
|
||
|
if (!tcppoi->login)
|
||
|
{
|
||
|
/* Pruefe auf Login. */
|
||
|
if (!strncmp(tcppoi->cmd, "/na", 3))
|
||
|
/* Kein Prompt senden. */
|
||
|
tcppoi->LoginPrompt = TRUE;
|
||
|
}
|
||
|
tcppoi->cmd[tcppoi->cmdlen] = 0;
|
||
|
/* Frame komplett. */
|
||
|
return(TRUE);
|
||
|
}
|
||
|
else
|
||
|
/* Sind noch Zeichen im RXBUF,*/
|
||
|
/* zum naechsten Zeichen. */
|
||
|
continue;
|
||
|
|
||
|
break;
|
||
|
#endif /* L1IPCONV */
|
||
|
|
||
|
default : /* Ungueltiges Interface. */
|
||
|
break; /* Hier werden wir nie kommen. */
|
||
|
}
|
||
|
|
||
|
return(FALSE); /* Frame noch nicht komplett. */
|
||
|
}
|
||
|
|
||
|
return(FALSE); /* Frame noch nicht komplett. */
|
||
|
}
|
||
|
|
||
|
void ServOS(void) /* Empfangene Zeichen in Frames packen. */
|
||
|
{
|
||
|
READRX *SRx;
|
||
|
register int i;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(ServOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
if (OsStackReadIndicationsSock()) /* Empfangene Zeichen analysieren. */
|
||
|
{
|
||
|
if(tcppoi->cmdlen > 0) /* Es sind Zeichen im Buffer.*/
|
||
|
{
|
||
|
if ((SRx = (READRX *)allocb(ALLOC_L1TCPIP)) == NULL)/* RX-Seg. besorgen */
|
||
|
{
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
T_LOGL1(TRUE, "(ServOS):%s\nSpeicher (%d) ist voll!\n"
|
||
|
, tcppoi->ip
|
||
|
, nmbfre);
|
||
|
tcppoi->disflg |= 0x80; /* Segment auf Disconnect setzen. */
|
||
|
return; /* Kein Segment frei, abbruch. */
|
||
|
}
|
||
|
|
||
|
if ((SRx->Data = SetBuffer()) == NULL) /* Buffer besorgen. */
|
||
|
{
|
||
|
dealoc((MBHEAD *)ulink((LEHEAD *)SRx)); /* RX-Segment entsorgen. */
|
||
|
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
T_LOGL1(TRUE, "(ServOS):%s\nSpeicher (%d) ist voll!\n"
|
||
|
, tcppoi->ip
|
||
|
, nmbfre);
|
||
|
tcppoi->disflg |= 0x80; /* Segment auf Disconnect setzen. */
|
||
|
return; /* Buffer ist voll, abbruch. */
|
||
|
}
|
||
|
|
||
|
SRx->Sock = tcppoi->sock; /* Socket setzen. */
|
||
|
SRx->Interface = tcppoi->Interface; /* Inetrface setzen. */
|
||
|
SRx->Mode = tcppoi->mode; /* Stack-Mode setzen. */
|
||
|
|
||
|
for (i = 0; i < tcppoi->cmdlen; ++i)
|
||
|
putchr(tcppoi->cmd[i], SRx->Data); /* Buffer fuellen. */
|
||
|
|
||
|
tcppoi->cmdlen = 0; /* Buffer-Zaehler zuruecksetzen. */
|
||
|
tcppoi->cmd[0] = 0; /* Nullzeichen setzen. */
|
||
|
|
||
|
if (tcppoi->activ) /* Nur wenn Socket aktiv. */
|
||
|
relink((LEHEAD *) SRx, (LEHEAD *)rxflRX.tail);/* Ab in die Empf.-liste*/
|
||
|
else
|
||
|
{
|
||
|
ifpp = SetInterface(tcppoi->Interface); /* akt. Interface setzen. */
|
||
|
T_LOGL1(TRUE, "(ServOS):%s\nSegment ist nicht mehr aktiv!\n"
|
||
|
, tcppoi->ip);
|
||
|
|
||
|
if (SRx->Data != NULL)
|
||
|
dealmb(SRx->Data); /* Buffer entsorgen. */
|
||
|
|
||
|
dealoc((MBHEAD *)ulink((LEHEAD *)SRx)); /* RX-Segment entsorgen.*/
|
||
|
} /* Socket ist nicht mehr aktiv. */
|
||
|
} /* kein Zeichen im buffer. */
|
||
|
} /* Frame ist noch nicht komplett. */
|
||
|
}
|
||
|
|
||
|
/* Neue User hinzufuegen, vorrausgesetzt es sind noch freie Sockets vorhanden.*/
|
||
|
int AddUserOS(T_INTERFACE *ifpoi, /* TCP-Interface. */
|
||
|
unsigned NewSocket, /* Neuer Socket. */
|
||
|
char *ip) /* IP-Adresse. */
|
||
|
{
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(AddUserOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
while ((LHEAD *)tcpfrel.head != &tcpfrel)
|
||
|
{
|
||
|
tcppoi = (TCPIP *)ulink((LEHEAD *)tcpfrel.head);
|
||
|
SetDefaultWorthTCP(NewSocket, /* Defaultwerte setzen, neuer Socket. */
|
||
|
ip, /* IP-Adresse. */
|
||
|
ifpoi->l2port, /* L2-Port. */
|
||
|
ifpoi->Interface, /* TCPIP-Interface. */
|
||
|
OS_MODE); /* OS-STack. */
|
||
|
|
||
|
ServOS(); /* Empfangene Zeichen in Frames packen. */
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
ifpp = SetInterface(ifpoi->Interface); /* akt. Interface setzen. */
|
||
|
/* ggf. Logbuch fuehren. */
|
||
|
T_LOGL1(TRUE, "(AddUserOS):%s\nKann kein neues TCPIP-Segment anlegen !\n"
|
||
|
, ip);
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
void ListenTCP_OS(void)
|
||
|
{
|
||
|
fd_set rmask;
|
||
|
struct timeval timevalue;
|
||
|
UWORD Interface = KISS_TCPIP;
|
||
|
int max_fd;
|
||
|
register int i;
|
||
|
int count,
|
||
|
j = 0;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(ListenTCP_OS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
max_fd = 0;
|
||
|
FD_ZERO(&rmask);
|
||
|
|
||
|
/* Interface-Socket's setzen. */
|
||
|
for (i = 0; i < MAXINTERFACE; i++, Interface++)
|
||
|
{
|
||
|
/* Zeiger auf das aktuelle Interface. */
|
||
|
if ((ifpp = SearchIf(Interface)) == NULL)
|
||
|
continue;
|
||
|
|
||
|
if (ifpp->actively == FALSE)
|
||
|
continue;
|
||
|
|
||
|
/* Interface-Socket setzen. */
|
||
|
FD_SET((unsigned)ifpp->OsSock, &rmask);
|
||
|
|
||
|
if (ifpp->OsSock > max_fd - 1)
|
||
|
max_fd = ifpp->OsSock + 1;
|
||
|
}
|
||
|
|
||
|
/* User-Socket's setzen. */
|
||
|
for (i = 0, tcppoi = tcptbl; i < MAXTCPIP; ++i, ++tcppoi)
|
||
|
{
|
||
|
if (tcppoi->activ) /* Nur wenn Interface Socket aktiv! */
|
||
|
{
|
||
|
if (tcppoi->mode != OS_MODE) /* Kein OS-STACK, */
|
||
|
continue; /* zum naechsten Segment. */
|
||
|
|
||
|
if (tcppoi->sock < 1) /* Kein Socket gesetzt, */
|
||
|
continue; /* zum naechsten Segment. */
|
||
|
|
||
|
FD_SET((unsigned)tcppoi->sock, &rmask); /* Socket setzen */
|
||
|
|
||
|
if (tcppoi->sock > max_fd - 1)
|
||
|
max_fd = tcppoi->sock + 1;
|
||
|
}
|
||
|
|
||
|
if ( ((tcppoi->activ) /* Sind alle aktiven Sockets durchlaufen, */
|
||
|
&& (j++ >= tcp_tbl_top))
|
||
|
|| (j == tcp_tbl_top))
|
||
|
break; /* brechen wir ab. */
|
||
|
}
|
||
|
|
||
|
timevalue.tv_usec = 0;
|
||
|
timevalue.tv_sec = 0;
|
||
|
|
||
|
count = select(max_fd, &rmask, NULL, NULL, &timevalue);
|
||
|
|
||
|
if (count < 1)
|
||
|
return;
|
||
|
|
||
|
Interface = KISS_TCPIP;
|
||
|
|
||
|
for (i = 0; i < MAXINTERFACE; i++, Interface++)
|
||
|
{
|
||
|
if ((ifpp = SearchIf(Interface)) == NULL) /* Ungueltiges Interface, */
|
||
|
continue; /* zum naechsten Interface. */
|
||
|
|
||
|
if (ifpp->actively == FALSE) /* Interface nicht aktiv, */
|
||
|
continue; /* zum naechsten Interface. */
|
||
|
|
||
|
|
||
|
if (FD_ISSET(ifpp->OsSock, &rmask)) /* Interface-Socketvergleich. */
|
||
|
{
|
||
|
char ip[IPADDR + 1];
|
||
|
int NewSock;
|
||
|
socklen_t addrlen;
|
||
|
ULONG peerip = 0;
|
||
|
char *p = (char *)&peerip;
|
||
|
|
||
|
addrlen = sizeof peeraddr_in;
|
||
|
|
||
|
if ((NewSock = accept(ifpp->OsSock, (struct sockaddr *) &peeraddr_in, &addrlen)) != EOF)
|
||
|
{
|
||
|
peerip = peeraddr_in.sin_addr.s_addr;
|
||
|
sprintf (ip, "%d.%d.%d.%d",(p[0] & 255)
|
||
|
,(p[1] & 255)
|
||
|
,(p[2] & 255)
|
||
|
,(p[3] & 255));
|
||
|
/* Einen Neuen TCPIP-User/Link hinzufuegen. Bekannt */
|
||
|
/* ist das Interface, der Socket und die IP-Adresse. */
|
||
|
if (AddUserOS(ifpp, NewSock, ip))
|
||
|
{
|
||
|
close(NewSock);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/* ggf. Logbuch fuehren. */
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
T_LOGL2(TRUE, "(ListenTCP_OS):\n"
|
||
|
"Verbindung zur IP-Adresse %s angenommen.\n"
|
||
|
"Neu erzeugter Socket ist (%d).\n"
|
||
|
, ip
|
||
|
, NewSock);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Anhand des Sockets den User aus der Liste Holen */
|
||
|
if ((tcppoi = FdReadOS(&rmask)) != NULL)
|
||
|
{
|
||
|
/* ggf. Logbuch fuehren. */
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
|
||
|
T_LOGL3(TRUE, "(ListenTCP_OS):%s\nAktuellen Socket (%d) in der Liste gefunden.\n"
|
||
|
, tcppoi->ip
|
||
|
, tcppoi->sock);
|
||
|
|
||
|
/* TCPIP Packete empfangen/bearbeiten/senden */
|
||
|
ServOS();
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/* Frame aus der Sendeliste senden. */
|
||
|
int PutflushSockOS(void)
|
||
|
{
|
||
|
int ok = FALSE;
|
||
|
int ret = FALSE;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(PutflushSockOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
if (tcppoi->txc) /* Gibt es was zu senden. */
|
||
|
{
|
||
|
while (1) /* Gibt es was zu senden. */
|
||
|
{
|
||
|
fd_set wfdsI;
|
||
|
struct timeval Tv;
|
||
|
|
||
|
FD_ZERO(&wfdsI); /* Loesche inhalt. */
|
||
|
FD_SET((unsigned)tcppoi->sock, &wfdsI); /* Socket setzen. */
|
||
|
|
||
|
if (select(tcppoi->sock + 1, NULL, &wfdsI , NULL ,&Tv))/* Sender frei.*/
|
||
|
{
|
||
|
if (tcppoi->txstatus == TCP_TX_BUSY) /* Sender ist auf Busy. */
|
||
|
tcppoi->txstatus = TCP_TX_FREE; /* Sender auf frei stellen. */
|
||
|
|
||
|
/* Frame senden */
|
||
|
if ((ok = send(tcppoi->sock, tcppoi->txbuf + tcppoi->sum, tcppoi->txc - tcppoi->sum,0)) < 0)
|
||
|
{
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
T_LOGL1(TRUE, "(PutflushSockTCP):%s\nFrame senden fehlgeschlagen!\n"
|
||
|
, tcppoi->ip);
|
||
|
|
||
|
tcppoi->disflg |= 0x80; /* Segment auf Disconnect setzen. */
|
||
|
return(TRUE); /* Abbruch. */
|
||
|
}
|
||
|
|
||
|
ifpp = SetInterface(tcppoi->Interface); /* ggf. Logbuch fuehren. */
|
||
|
T_LOGL3(TRUE, "(PutflushSockOS):%s\nOutput:\r%s\r"
|
||
|
, tcppoi->ip
|
||
|
, tcppoi->txbuf);
|
||
|
|
||
|
tcppoi->sum += ok; /* Markiere, gesendete Zeichen. */
|
||
|
|
||
|
if (tcppoi->sum == tcppoi->txc) /* Alle Zeichen gesendet. */
|
||
|
break; /* Schleife verlassen. */
|
||
|
|
||
|
}
|
||
|
|
||
|
if (ret == FALSE) /* Sender ist nicht frei. */
|
||
|
{
|
||
|
tcppoi->txstatus = TCP_TX_BUSY; /* Sender auf Busy stellen. */
|
||
|
return(FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tcppoi->sum = 0; /* Zuruecksetzen. */
|
||
|
tcppoi->txc = 0;
|
||
|
tcppoi->txbuf[0] = 0;
|
||
|
}
|
||
|
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
BOOLEAN CheckSocketOS(void)
|
||
|
{
|
||
|
int ok = EOF;
|
||
|
#ifdef DEBUG_MODUS
|
||
|
lastfunc = "ostcpip(CheckSocketOS)";
|
||
|
#endif /* DEBUG_MODUS */
|
||
|
|
||
|
if ((ok = send(tcppoi->sock, "", 0, 0)) < 0) /* Socket noch aktiv. */
|
||
|
{
|
||
|
ifpp = SetInterface(tcppoi->Interface);
|
||
|
T_LOGL1(TRUE, "(CheckSocket):%s\nSocket ist nicht mehr aktiv!\n"
|
||
|
, tcppoi->ip);
|
||
|
|
||
|
tcppoi->disflg |= 0x80; /* Segment auf DISC setzen. */
|
||
|
return(TRUE); /* Socket ist nicht mehr aktiv */
|
||
|
}
|
||
|
else
|
||
|
return(FALSE); /* Socket ist aktiv. */
|
||
|
}
|
||
|
|
||
|
#endif /* OS_STACK */
|
||
|
|
||
|
/* End of os/linux/ostcpip.h */
|