Merge branch 'master' of git://localhost/acess2
[tpg/acess2.git] / Usermode / Applications / telnetd_src / main.c
index 198ddaa..a4f5e0d 100644 (file)
@@ -1,9 +1,14 @@
 /*
+ * Acess2 Telnet Server (TCP server test case)
+ * - By John Hodge (thePowersGang)
+ *
+ * main.c
+ * - All
  */
 #include <stddef.h>
 #include <net.h>
-#include <unistd.h>
 #include <stdio.h>
+#include <acess/sys.h>
 
 // === 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);
 }
 

UCC git Repository :: git.ucc.asn.au