X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Ftelnetd_src%2Fmain.c;h=a4f5e0da67332370a58aaf2d1fb650d67312de9c;hb=04a050f42807686dc119838c82372409246d55bb;hp=198ddaaf3db35568e810e317ce3ce5b8b3577b86;hpb=31ca692f6ad721a25a48ef121534e02f6900efaf;p=tpg%2Facess2.git diff --git a/Usermode/Applications/telnetd_src/main.c b/Usermode/Applications/telnetd_src/main.c index 198ddaaf..a4f5e0da 100644 --- a/Usermode/Applications/telnetd_src/main.c +++ b/Usermode/Applications/telnetd_src/main.c @@ -1,9 +1,14 @@ /* + * Acess2 Telnet Server (TCP server test case) + * - By John Hodge (thePowersGang) + * + * main.c + * - All */ #include #include -#include #include +#include // === TYPES === typedef struct sClient @@ -36,7 +41,13 @@ int main(int argc, char *argv[]) gaClients = calloc(giConfig_MaxClients, sizeof(tClient)); // Open server - giServerFD = Net_OpenSocket(0, NULL, "tcps"); + { + uint8_t data[16]; + int addrtype = Net_ParseAddress("10.0.2.10", data); + int port = 23; + giServerFD = Net_OpenSocket(addrtype, data, "tcps"); + _SysIOCtl(giServerFD, 4, &port); // Set port and start listening + } // Event loop EventLoop(); @@ -57,17 +68,21 @@ void EventLoop(void) for( ;; ) { + FD_ZERO(&fds); maxfd = 0; // Fill select FD_SET_MAX(&fds, giServerFD, &maxfd); for( int i = 0; i < giConfig_MaxClients; i ++ ) { + if( gaClients[i].Socket == 0 ) continue ; + _SysDebug("Socket = %i, stdout = %i", + gaClients[i].Socket, gaClients[i].stdout); FD_SET_MAX(&fds, gaClients[i].Socket, &maxfd); FD_SET_MAX(&fds, gaClients[i].stdout, &maxfd); } // Select! - select( maxfd+1, &fds, NULL, NULL, NULL ); + _SysSelect( maxfd+1, &fds, NULL, NULL, NULL, 0 ); // Check events if( FD_ISSET(giServerFD, &fds) ) @@ -98,7 +113,7 @@ void Server_NewClient(int FD) if( giNumClients == giConfig_MaxClients ) { // Open, reject - close( _SysOpenChild(FD, "", O_RDWR) ); + _SysClose( _SysOpenChild(FD, "", OPENFLAG_READ) ); return ; } @@ -111,17 +126,18 @@ void Server_NewClient(int FD) } } // Accept the connection - clt->Socket = _SysOpenChild(FD, "", O_RDWR); - giNumClients ++; + clt->Socket = _SysOpenChild(FD, "", OPENFLAG_READ|OPENFLAG_WRITE); + giNumClients ++; // Create stdin/stdout - clt->stdin = open("/Devices/fifo", O_RDWR); - clt->stdout = open("/Devices/fifo", O_RDWR); + clt->stdin = _SysOpen("/Devices/fifo/anon", OPENFLAG_READ|OPENFLAG_WRITE); + clt->stdout = _SysOpen("/Devices/fifo/anon", OPENFLAG_READ|OPENFLAG_WRITE); // TODO: Arguments and envp { int fds[3] = {clt->stdin, clt->stdout, clt->stdout}; - _SysSpawn("/Acess/SBin/login", NULL, NULL, 3, fds); + const char *argv[] = {NULL}; + _SysSpawn("/Acess/SBin/login", argv, argv, 3, fds, NULL); } } @@ -130,8 +146,9 @@ void HandleServerBoundData(tClient *Client) char buf[BUFSIZ]; int len; - len = read(Client->Socket, buf, BUFSIZ); - write(Client->stdin, buf, len); + len = _SysRead(Client->Socket, buf, BUFSIZ); + if( len <= 0 ) return ; + _SysWrite(Client->stdin, buf, len); } void HandleClientBoundData(tClient *Client) @@ -139,7 +156,8 @@ void HandleClientBoundData(tClient *Client) char buf[BUFSIZ]; int len; - len = read(Client->stdout, buf, BUFSIZ); - write(Client->Socket, buf, len); + len = _SysRead(Client->stdout, buf, BUFSIZ); + if( len <= 0 ) return ; + _SysWrite(Client->Socket, buf, len); }