Merge branch 'master' of git://localhost/acess2
[tpg/acess2.git] / Usermode / Applications / irc_src / main.c
index 20223bb..16eee39 100644 (file)
@@ -8,8 +8,6 @@
 #include <net.h>\r
 #include <readline.h>\r
 \r
-#define BUFSIZ 1023\r
-\r
 // === TYPES ===\r
 typedef struct sServer {\r
        struct sServer  *Next;\r
@@ -80,7 +78,7 @@ char  *gsNickname = "acess";
 tServer        *gpServers;\r
 tWindow        gWindow_Status = {\r
        NULL, NULL, NULL,       // No next, empty list, no server\r
-       0, ""   // No activity, empty name (rendered as status)\r
+       0, {""} // No activity, empty name (rendered as status)\r
 };\r
 tWindow        *gpWindows = &gWindow_Status;\r
 tWindow        *gpCurrentWindow = &gWindow_Status;\r
@@ -104,8 +102,8 @@ int main(int argc, const char *argv[], const char *envp[])
        \r
        atexit(ExitHandler);\r
        \r
-       giTerminal_Width = ioctl(1, 5, NULL);   // getset_width\r
-       giTerminal_Height = ioctl(1, 6, NULL);  // getset_height\r
+       giTerminal_Width = _SysIOCtl(1, 5, NULL);       // getset_width\r
+       giTerminal_Height = _SysIOCtl(1, 6, NULL);      // getset_height\r
        \r
        printf("\x1B[?1047h");\r
        printf("\x1B[%i;%ir", 0, giTerminal_Height-1);\r
@@ -115,10 +113,12 @@ int main(int argc, const char *argv[], const char *envp[])
        \r
        // HACK: Static server entry\r
        // UCC (University [of Western Australia] Computer Club) IRC Server\r
-//     gWindow_Status.Server = Server_Connect( "UCC", "130.95.13.18", 6667 );\r
-       gWindow_Status.Server = Server_Connect( "Freenode", "89.16.176.16", 6667 );\r
+       gWindow_Status.Server = Server_Connect( "UCC", "130.95.13.18", 6667 );\r
+       // Freenode (#osdev)\r
+//     gWindow_Status.Server = Server_Connect( "Freenode", "89.16.176.16", 6667 );\r
 //     gWindow_Status.Server = Server_Connect( "Host", "10.0.2.2", 6667 );\r
-//     gWindow_Status.Server = Server_Connect( "BitlBee", "192.168.1.34", 6667 );\r
+       // Local server\r
+//     gWindow_Status.Server = Server_Connect( "BitlBee", "192.168.1.39", 6667 );\r
        \r
        if( !gWindow_Status.Server )\r
                return -1;\r
@@ -194,7 +194,7 @@ int main(int argc, const char *argv[], const char *envp[])
        {\r
                tServer *srv;\r
                for( srv = gpServers; srv; srv = srv->Next )\r
-                       close(srv->FD);\r
+                       _SysClose(srv->FD);\r
        }\r
        return 0;\r
 }\r
@@ -207,6 +207,9 @@ int ParseArguments(int argc, const char *argv[])
        return 0;\r
 }\r
 \r
+/**\r
+ * \brief Handle a line from the prompt\r
+ */\r
 int ParseUserCommand(char *String)\r
 {\r
        if( String[0] == '/' )\r
@@ -359,8 +362,7 @@ tMessage *Message_Append(tServer *Server, int Type, const char *Source, const ch
        // Determine if it's a channel or PM message\r
        else if( Dest[0] == '#' || Dest[0] == '&' )     // TODO: Better determining here\r
        {\r
-               tWindow *prev = NULL;\r
-               for(win = gpWindows; win; prev = win, win = win->Next)\r
+               for(win = gpWindows; win; win = win->Next)\r
                {\r
                        if( win->Server == Server && strcmp(win->Name, Dest) == 0 )\r
                        {\r
@@ -522,11 +524,12 @@ void ParseServerLine(tServer *Server, char *Line)
         int    pos = 0;\r
        char    *ident, *cmd;\r
 \r
-       _SysDebug("Server %s: Line = %s", Server->Name, Line);  \r
+       _SysDebug("[%s] %s", Server->Name, Line);       \r
        \r
        // Message?\r
        if( *Line == ':' )\r
        {\r
+               pos ++;\r
                ident = GetValue(Line, &pos);   // Ident (user or server)\r
                cmd = GetValue(Line, &pos);\r
                \r
@@ -550,18 +553,29 @@ void ParseServerLine(tServer *Server, char *Line)
                        \r
                        switch(num)\r
                        {\r
+                       case 332:       // Topic\r
+                               user = message; // Channel\r
+                               message = Line + pos + 1;       // Topic\r
+                               Message_AppendF(Server, MSG_TYPE_SERVER, user, user, "Topic: %s", message);\r
+                               break;\r
+                       case 333:       // Topic set by\r
+                               user = message; // Channel\r
+                               message = GetValue(Line, &pos); // User\r
+                               GetValue(Line, &pos);   // Timestamp\r
+                               Message_AppendF(Server, MSG_TYPE_SERVER, user, user, "Set by %s", message);\r
+                               break;\r
                        case 353:       // /NAMES list\r
                                // <user> = <channel> :list\r
-//                             GetValue(Line, &pos);   // '='\r
+                               // '=' was eaten in and set to message\r
                                user = GetValue(Line, &pos);    // Actually channel\r
                                message = Line + pos + 1;       // List\r
-                               Message_AppendF(Server, MSG_TYPE_SERVER, user, "", "Names: %s", message);\r
+                               Message_AppendF(Server, MSG_TYPE_SERVER, user, user, "Names: %s", message);\r
                                break;\r
                        case 366:       // end of /NAMES list\r
                                // <user> <channel> :msg\r
                                user = message;\r
                                message = Line + pos + 1;\r
-                               Message_Append(Server, MSG_TYPE_SERVER, user, "", message);\r
+                               Message_Append(Server, MSG_TYPE_SERVER, user, user, message);\r
                                break;\r
                        case 372:       // MOTD Data\r
                        case 376:       // MOTD End\r
@@ -577,6 +591,7 @@ void ParseServerLine(tServer *Server, char *Line)
                        char    *class, *message;\r
                        \r
                        class = GetValue(Line, &pos);\r
+                       _SysDebug("NOTICE class='%s'", class);\r
                        \r
                        if( Line[pos] == ':' ) {\r
                                message = Line + pos + 1;\r
@@ -599,13 +614,17 @@ void ParseServerLine(tServer *Server, char *Line)
                        else {\r
                                message = GetValue(Line, &pos);\r
                        }\r
+\r
+                       // TODO: Catch when the privmsg is addressed to the user\r
+\r
 //                     Cmd_PRIVMSG(Server, dest, ident, message);\r
+                       *strchr(ident, '!') = '\0';     // Hello SIGSEGV\r
                        Message_Append(Server, MSG_TYPE_STANDARD, ident, dest, message);\r
                }\r
                else if( strcmp(cmd, "JOIN" ) == 0 )\r
                {\r
                        char    *channel;\r
-                       channel = GetValue(Line, &pos) + 1;\r
+                       channel = Line + pos + 1;\r
                        Window_Create(Server, channel);\r
                }\r
                else\r
@@ -640,11 +659,11 @@ int ProcessIncoming(tServer *Server)
        // ioctl#8 on a TCP client gets the number of bytes in the recieve buffer\r
        // - Used to avoid blocking\r
        #if NON_BLOCK_READ\r
-       while( (len = ioctl(Server->FD, 8, NULL)) > 0 )\r
+       while( (len = _SysIOCtl(Server->FD, 8, NULL)) > 0 )\r
        {\r
        #endif\r
                // Read data\r
-               len = read(Server->FD, &Server->InBuf[Server->ReadPos], BUFSIZ - Server->ReadPos);\r
+               len = _SysRead(Server->FD, &Server->InBuf[Server->ReadPos], BUFSIZ - Server->ReadPos);\r
                if( len == -1 ) {\r
                        return -1;\r
                }\r
@@ -698,7 +717,7 @@ int writef(int FD, const char *Format, ...)
                vsnprintf(buf, len+1, Format, args);\r
                va_end(args);\r
                \r
-               return write(FD, buf, len);\r
+               return _SysWrite(FD, buf, len);\r
        }\r
 }\r
 \r
@@ -708,49 +727,32 @@ int writef(int FD, const char *Format, ...)
 int OpenTCP(const char *AddressString, short PortNumber)\r
 {\r
         int    fd, addrType;\r
-       char    *iface;\r
        char    addrBuffer[8];\r
        \r
        // Parse IP Address\r
        addrType = Net_ParseAddress(AddressString, addrBuffer);\r
        if( addrType == 0 ) {\r
                fprintf(stderr, "Unable to parse '%s' as an IP address\n", AddressString);\r
+               _SysDebug("Unable to parse '%s' as an IP address\n", AddressString);\r
                return -1;\r
        }\r
        \r
        // Finds the interface for the destination address\r
-       iface = Net_GetInterface(addrType, addrBuffer);\r
-       if( iface == NULL ) {\r
-               fprintf(stderr, "Unable to find a route to '%s'\n", AddressString);\r
-               return -1;\r
-       }\r
-       \r
-//     printf("iface = '%s'\n", iface);\r
-       \r
-       // Open client socket\r
-       // TODO: Move this out to libnet?\r
-       {\r
-                int    len = snprintf(NULL, 100, "/Devices/ip/%s/tcpc", iface);\r
-               char    path[len+1];\r
-               snprintf(path, 100, "/Devices/ip/%s/tcpc", iface);\r
-               fd = open(path, OPENFLAG_READ|OPENFLAG_WRITE);\r
-       }\r
-       \r
-       free(iface);\r
-       \r
+       fd = Net_OpenSocket(addrType, addrBuffer, "tcpc");\r
        if( fd == -1 ) {\r
-               fprintf(stderr, "Unable to open TCP Client for reading\n");\r
+               fprintf(stderr, "Unable to open TCP Client to '%s'\n", AddressString);\r
+               _SysDebug("Unable to open TCP client to '%s'\n", AddressString);\r
                return -1;\r
        }\r
        \r
        // Set remote port and address\r
 //     printf("Setting port and remote address\n");\r
-       ioctl(fd, 5, &PortNumber);\r
-       ioctl(fd, 6, addrBuffer);\r
+       _SysIOCtl(fd, 5, &PortNumber);\r
+       _SysIOCtl(fd, 6, addrBuffer);\r
        \r
        // Connect\r
 //     printf("Initiating connection\n");\r
-       if( ioctl(fd, 7, NULL) == 0 ) {\r
+       if( _SysIOCtl(fd, 7, NULL) == 0 ) {\r
                // Shouldn't happen :(\r
                fprintf(stderr, "Unable to start connection\n");\r
                return -1;\r
@@ -795,7 +797,7 @@ int SetCursorPos(int Row, int Col)
                Row = Col / giTerminal_Width;\r
                Col = Col % giTerminal_Width;\r
        }\r
-       rv = ioctl(1, 9, NULL); // Ugh, constants\r
+       rv = _SysIOCtl(1, 9, NULL);     // Ugh, constants\r
        printf("\x1B[%i;%iH", Col, Row);\r
        return rv;\r
 }\r

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