]> PatchyGit - patchyircd.git/commitdiff
New parser
authorSam Smith <sam@patchysicp.xyz>
Sun, 24 Apr 2022 20:23:24 +0000 (13:23 -0700)
committerSam Smith <sam@patchysicp.xyz>
Sun, 24 Apr 2022 20:23:24 +0000 (13:23 -0700)
common.h
irc.c
irc.h
main.c
net.c
net.h

index 7bbd8d9..b8f5cd1 100644 (file)
--- a/common.h
+++ b/common.h
@@ -5,11 +5,18 @@
 
 struct client_data {
        SOCKET FD;
-       char type;
-       char nick[32];
+       char   type;
+       char   nick[32];
        size_t nickLen;
+       char   buf[2048];
+       size_t bufLen;
+       size_t bufCap;
 };
-extern struct client_data *clients[CLIENTS];
-extern fd_set readfds;
+extern struct client_data  *clients[CLIENTS];
+extern        fd_set       readfds;
+extern struct sockaddr_in  serverAddrV4;
+extern struct sockaddr_in6 serverAddrV6;
+extern size_t              serverAddrV4len;
+extern size_t              serverAddrV6len;
 
 #endif
diff --git a/irc.c b/irc.c
index b0c7411..b09c5b3 100644 (file)
--- a/irc.c
+++ b/irc.c
@@ -1,6 +1,8 @@
 #include "irc.h"
 
-void processPacket(struct client_data *client, char *packet, size_t packetLen) {
+void processPacket(struct client_data *client) {
+       char *packet = client->buf;
+       size_t packetLen = client->bufLen;
        if(strncmp(packet, "PING", 4) == 0) {
                packet[1] = 'O';
                send_log(client->FD, packet, packetLen, 0);
diff --git a/irc.h b/irc.h
index b8cdb40..324dc5d 100644 (file)
--- a/irc.h
+++ b/irc.h
@@ -4,7 +4,7 @@
 #include "common.h"
 #include "net.h"
 
-void processPacket(struct client_data *client, char *packet, size_t packetLen);
+void processPacket(struct client_data *client);
 void newUser(struct client_data *client);
 void sendMOTD(struct client_data *client);
 void setNick(struct client_data *client, char* nickname, size_t size);
diff --git a/main.c b/main.c
index a6e39bf..c64125a 100644 (file)
--- a/main.c
+++ b/main.c
@@ -7,6 +7,16 @@ struct client_data *clients[CLIENTS];
 // FDSET List
 fd_set readfds;
 
+
+#ifdef SUPPORT_IPV4
+       struct sockaddr_in serverAddrV4;
+       size_t serverAddrV4len;
+#endif
+#ifdef SUPPORT_IPV6
+       struct sockaddr_in6 serverAddrV6;
+       size_t serverAddrV6len;
+#endif
+
 int main() {
        int opt = 1;
        SOCKET serverSocketV4 = 0;
@@ -28,21 +38,19 @@ int main() {
 
        // Setup structs
 #ifdef SUPPORT_IPV4
-       struct sockaddr_in serverAddrV4;
        memset(&serverAddrV4, 0, sizeof(struct sockaddr_in));
        serverAddrV4.sin_addr.s_addr = INADDR_ANY;
        serverAddrV4.sin_port = htons(LISTENING_PORT);
        serverAddrV4.sin_family = AF_INET;
-       size_t serverAddrV4len = sizeof(serverAddrV4);
+       serverAddrV4len = sizeof(serverAddrV4);
 #endif
 #ifdef SUPPORT_IPV6
-       struct sockaddr_in6 serverAddrV6;
        memset(&serverAddrV6, 0, sizeof(struct sockaddr_in6));
        serverAddrV6.sin6_addr = in6addr_any;
        serverAddrV6.sin6_flowinfo = 0;
        serverAddrV6.sin6_port = htons(LISTENING_PORT);
        serverAddrV6.sin6_family = AF_INET6;
-       size_t serverAddrV6len = sizeof(serverAddrV6);
+       serverAddrV6len = sizeof(serverAddrV6);
 #endif
 #ifdef SUPPORT_IPV4
        // Create socket
@@ -156,6 +164,7 @@ int main() {
                                        clients[i] = allocClient();
                                        clients[i]->FD = newSocket;
                                        clients[i]->type = 4;
+                                       clients[i]->bufCap = sizeof(clients[i]->buf);
                                        // Set nonblock
                                        net_nonblock(clients[i]->FD);
                                        break;
@@ -180,6 +189,7 @@ int main() {
                                        clients[i] = allocClient();
                                        clients[i]->FD = newSocket;
                                        clients[i]->type = 6;
+                                       clients[i]->bufCap = sizeof(clients[i]->buf);
                                        // Set nonblock
                                        net_nonblock(clients[i]->FD);
                                        break;
@@ -192,54 +202,7 @@ int main() {
                        if(clients[i] == 0) continue;
                        SD = clients[i]->FD;
                        if(FD_ISSET(SD, &readfds)) {
-                               //bytesRead = read(SD, buffer, sizeof(buffer));
-                               bytesRead = recv_log(SD,buffer,sizeof(buffer), 0);
-
-                               if(bytesRead == -1) {
-                                       if(net_wouldblock()) {
-                                               goto endOfLoop;
-                                       }
-                                       net_perror("RECV");
-                               }
-
-                               // Disconnect
-                               if(bytesRead == 0) {
-#ifdef SUPPORT_IPV4
-                                       if(clients[i]->type == 4) {
-                                               getpeername(SD,(struct sockaddr*)&serverAddrV4,(socklen_t*)&serverAddrV4len);  
-                                               inet_ntop(AF_INET, &(serverAddrV4.sin_addr), client_addr, sizeof(client_addr));
-                                               printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", SD, client_addr, ntohs(serverAddrV4.sin_port));
-                                               fflush(stdout);
-                                       }
-#endif
-#ifdef SUPPORT_IPV6
-                                       if(clients[i]->type == 6) {
-                                               getpeername(SD,(struct sockaddr*)&serverAddrV6,(socklen_t*)&serverAddrV6len);  
-                                               inet_ntop(AF_INET6, &(serverAddrV6.sin6_addr), client_addr, sizeof(client_addr));
-                                               printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", SD, client_addr, ntohs(serverAddrV6.sin6_port));
-                                               fflush(stdout);
-                                       }
-#endif
-                                       killConnection(clients[i]);
-                               }  else {
-                                       // Add null byte
-                                       buffer[bytesRead] = '\0';
-
-                                       int j;
-                                       char *buffer2 = buffer;
-                                       char tmp;
-                                       for(j=0;j<bytesRead;j++){
-                                               if(buffer[j] == '\n'){
-                                                       char tmp = buffer[j+1];
-                                                       buffer[j+1] = 0;
-                                                       //Send to processing
-                                                       processPacket(clients[i], buffer2, strlen(buffer2));
-                                                       buffer[j+1] = tmp;
-                                                       buffer2 = &(buffer[j+1]);
-                                               }
-                                       }
-                               }
-                               endOfLoop:;
+                               recvProc(clients[i]);
                        }
                }
        }
diff --git a/net.c b/net.c
index 772cd6a..70c2cc0 100644 (file)
--- a/net.c
+++ b/net.c
@@ -1,4 +1,5 @@
 #include "net.h"
+#include "irc.h"
 
 void sendall_log(SOCKET socket, const char *buffer, size_t length, int flags) {
        int i;
@@ -18,13 +19,66 @@ struct client_data *allocClient(){
        return NewClient;
 };
 
-void killConnection(struct client_data *client) {
+void killConnection(struct client_data *cl) {
        int i;
+       char client_addr[100];
+       if(cl == 0) return;
+#ifdef SUPPORT_IPV4
+       if(cl->type == 4) {
+               getpeername(cl->FD,(struct sockaddr*)&serverAddrV4,(socklen_t*)&serverAddrV4len);  
+               inet_ntop(AF_INET, &(serverAddrV4.sin_addr), client_addr, sizeof(client_addr));
+               printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", cl->FD, client_addr, ntohs(serverAddrV4.sin_port));
+               fflush(stdout);
+       }
+#endif
+#ifdef SUPPORT_IPV6
+       if(cl->type == 6) {
+               getpeername(cl->FD,(struct sockaddr*)&serverAddrV6,(socklen_t*)&serverAddrV6len);  
+               inet_ntop(AF_INET6, &(serverAddrV6.sin6_addr), client_addr, sizeof(client_addr));
+               printf("Client disconnected from Socket: %"PRISocket", IP: %s PORT: %d\n", cl->FD, client_addr, ntohs(serverAddrV6.sin6_port));
+               fflush(stdout);
+       }
+#endif
        for(i=0;i<CLIENTS;i++) {
-               if(clients[i] == client) {
+               if(clients[i] == cl) {
                        clients[i] = 0;
                }
        }
-       closesocket(client->FD);
-       free(client);
+       closesocket(cl->FD);
+       free(cl);
+}
+
+void recvProc(struct client_data *cl) {
+       ssize_t bytesRead;
+       char *x;
+       char tmp;
+       while(1){
+               // I hate you
+               if(cl->bufLen == cl->bufCap) killConnection(cl);
+               bytesRead = recv_log(cl->FD,cl->buf + cl->bufLen,cl->bufCap - cl->bufLen, 0);
+               switch(bytesRead){
+                       // Disconnect
+                       case 0:
+                               killConnection(cl);
+                               return;
+                       // Error
+                       case -1:
+                               if(!net_wouldblock()){
+                                       killConnection(cl);
+                                       net_perror("RECV");
+                               }
+                               return;
+               }
+               cl->bufLen += bytesRead;
+               while(1){
+                       x = memchr(cl->buf, '\n', cl->bufLen);
+                       if(!x) break;
+                       tmp = *(x+1);
+                       *(x+1) = '\0';
+                       processPacket(cl);
+                       *(x+1) = tmp;
+                       memmove(cl->buf, x+1, cl->buf + cl->bufLen-(x+1));
+                       cl->bufLen -= x+1 - cl->buf;
+               }
+       }
 }
diff --git a/net.h b/net.h
index 5df0459..30d601e 100644 (file)
--- a/net.h
+++ b/net.h
@@ -5,5 +5,6 @@
 void sendall_log(SOCKET socket, const char *buffer, size_t length, int flags);
 struct client_data *allocClient();
 void killConnection(struct client_data *client);
+void recvProc(struct client_data *cl);
 
 #endif