IPStack - Bugfixing (and testing IRC client)
[tpg/acess2.git] / Usermode / Applications / irc_src / main.c
index 30c579c..b4892e7 100644 (file)
@@ -38,10 +38,13 @@ int main(int argc, const char *argv[], const char *envp[])
        \r
        memset(&srv, 0, sizeof(srv));\r
        \r
+       // Parse Command line\r
+       // - Sets the server configuration globals\r
        if( (tmp = ParseArguments(argc, argv)) ) {\r
                return tmp;\r
        }\r
        \r
+       // Connect to the remove server\r
        srv.FD = OpenTCP( gsRemoteAddress, giRemotePort );\r
        if( srv.FD == -1 ) {\r
                fprintf(stderr, "Unable to create socket\n");\r
@@ -49,11 +52,17 @@ int main(int argc, const char *argv[], const char *envp[])
        }\r
        \r
        printf("Connection opened\n");\r
+       ProcessIncoming(&srv);\r
        \r
        writef(srv.FD, "USER %s %s %s : %s\n", gsUsername, gsHostname, gsRemoteAddress, gsRealName);\r
-       writef(srv.FD, "NICK %s", gsNickname);\r
+       writef(srv.FD, "NICK %s\n", gsNickname);\r
        \r
-       ProcessIncoming(&srv);\r
+       printf("Processing\n");\r
+       \r
+       for( ;; )\r
+       {\r
+               ProcessIncoming(&srv);\r
+       }\r
        \r
        close(srv.FD);\r
        return 0;\r
@@ -83,6 +92,8 @@ char *GetValue(char *Src, int *Ofs)
        char    *ret = Src + pos;\r
        char    *end;\r
        \r
+       if( !Src )      return NULL;\r
+       \r
        while( *ret == ' ' )    ret ++;\r
        \r
        end = strchr(ret, ' ');\r
@@ -101,7 +112,7 @@ char *GetValue(char *Src, int *Ofs)
  */\r
 void ParseServerLine(tServer *Server, char *Line)\r
 {\r
-        int    pos;\r
+        int    pos = 0;\r
        char    *ident, *cmd;\r
        if( *Line == ':' ) {\r
                // Message\r
@@ -140,10 +151,12 @@ void ProcessIncoming(tServer *Server)
        // process it line by line\r
        // ioctl#8 on a TCP client gets the number of bytes in the recieve buffer\r
        // - Used to avoid blocking\r
-       while( ioctl(Server->FD, 8, NULL) )\r
+       #if NON_BLOCK_READ\r
+       while( (len = ioctl(Server->FD, 8, NULL)) > 0 )\r
        {\r
+       #endif\r
                // Read data\r
-               len = read(Server->FD, BUFSIZ - Server->ReadPos, Server->InBuf + Server->ReadPos);\r
+               len = read(Server->FD, BUFSIZ - Server->ReadPos, &Server->InBuf[Server->ReadPos]);\r
                Server->InBuf[Server->ReadPos + len] = '\0';\r
                \r
                // Break into lines\r
@@ -158,13 +171,19 @@ void ProcessIncoming(tServer *Server)
                \r
                // Handle incomplete lines\r
                if( ptr - Server->InBuf < len + Server->ReadPos ) {\r
-                       Server->ReadPos = ptr - Server->InBuf;\r
+                       // Update the read position\r
+                       // InBuf ReadPos    ptr          ReadPos+len\r
+                       // | old | new used | new unused |\r
+                       Server->ReadPos = len + Server->ReadPos - (ptr - Server->InBuf);\r
+                       // Copy stuff back (moving "new unused" to the start of the buffer)\r
                        memcpy(Server->InBuf, ptr, Server->ReadPos);\r
                }\r
                else {\r
                        Server->ReadPos = 0;\r
                }\r
+       #if NON_BLOCK_READ\r
        }\r
+       #endif\r
 }\r
 \r
 /**\r
@@ -232,12 +251,12 @@ int OpenTCP(const char *AddressString, short PortNumber)
        }\r
        \r
        // Set remote port and address\r
-       printf("Setting port and remote address");\r
+       printf("Setting port and remote address\n");\r
        ioctl(fd, 5, &PortNumber);\r
        ioctl(fd, 6, addrBuffer);\r
        \r
        // Connect\r
-       printf("Initiating connection");\r
+       printf("Initiating connection\n");\r
        if( ioctl(fd, 7, NULL) == 0 ) {\r
                // Shouldn't happen :(\r
                fprintf(stderr, "Unable to start connection\n");\r

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