X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Ftelnetd_src%2Fmain.c;h=16dac830adceae1e79871ec41b9ff1ea58a3c564;hb=ade876493f79b1b96a2fb529fc515a78964a1249;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..16dac830 100644 --- a/Usermode/Applications/telnetd_src/main.c +++ b/Usermode/Applications/telnetd_src/main.c @@ -1,9 +1,15 @@ /* + * Acess2 Telnet Server (TCP server test case) + * - By John Hodge (thePowersGang) + * + * main.c + * - All */ #include #include -#include #include +#include +#include // === TYPES === typedef struct sClient @@ -36,7 +42,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(); @@ -44,30 +56,34 @@ int main(int argc, char *argv[]) return 0; } +static void FD_SET_MAX(fd_set *set, int fd, int *maxfd) +{ + FD_SET(fd, set); + if(*maxfd < fd) *maxfd = fd; +} + void EventLoop(void) { fd_set fds; int maxfd; - void FD_SET_MAX(fd_set *set, int fd, int *maxfd) - { - FD_SET(fd, set); - if(*maxfd < fd) *maxfd = fd; - } - 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 +114,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 +127,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 +147,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 +157,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); }