]> PatchyGit - patchyircd.git/commitdiff
Added QUIT (sorta)
authorSam Smith <sam@patchysicp.xyz>
Thu, 28 Apr 2022 15:44:54 +0000 (08:44 -0700)
committerSam Smith <sam@patchysicp.xyz>
Thu, 28 Apr 2022 15:44:54 +0000 (08:44 -0700)
irc.c
irc.h
net.c

diff --git a/irc.c b/irc.c
index 83cba8b..67480ab 100644 (file)
--- a/irc.c
+++ b/irc.c
@@ -1,6 +1,6 @@
 #include "irc.h"
 
-void processPacket(struct client_data *client) {
+int processPacket(struct client_data *client) {
        char *packet = client->buf;
        //size_t packetLen = client->bufLen;
        if(strncmp(packet, "PING", 4) == 0) {
@@ -36,7 +36,11 @@ void processPacket(struct client_data *client) {
                data[1+client->nickLen] = ' ';
                strcpy(data+2+client->nickLen, packet);
                sendall_log(client->FD, data, strlen(data), 0);
+       } else if(strncmp(packet, "QUIT", 4) == 0) {
+               killConnection(client);
+               return 1;
        }
+       return 0;
 }
 
 void newUser(struct client_data *client) {
diff --git a/irc.h b/irc.h
index 324dc5d..04b5fb6 100644 (file)
--- a/irc.h
+++ b/irc.h
@@ -4,7 +4,7 @@
 #include "common.h"
 #include "net.h"
 
-void processPacket(struct client_data *client);
+int 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/net.c b/net.c
index e226102..d529297 100644 (file)
--- a/net.c
+++ b/net.c
@@ -1,5 +1,6 @@
 #include "net.h"
 #include "irc.h"
+#include <stdbool.h>
 
 void sendall_log(SOCKET socket, const char *buffer, size_t length, int flags) {
        int i;
@@ -22,7 +23,17 @@ struct client_data *allocClient(){
 void killConnection(struct client_data *cl) {
        int i;
        char client_addr[100];
+       bool valid=false;
        if(cl == 0) return;
+       for(i=0;i<CLIENTS;i++) {
+               if(clients[i] == cl) {
+                       clients[i] = 0;
+                       valid=true;
+               }
+       }
+       if(!valid){
+               return;
+       }
 #ifdef SUPPORT_IPV4
        if(cl->type == 4) {
                getpeername(cl->FD,(struct sockaddr*)&serverAddrV4,(socklen_t*)&serverAddrV4len);  
@@ -39,11 +50,7 @@ void killConnection(struct client_data *cl) {
                fflush(stdout);
        }
 #endif
-       for(i=0;i<CLIENTS;i++) {
-               if(clients[i] == cl) {
-                       clients[i] = 0;
-               }
-       }
+       shutdown(cl->FD, SHUT_RDWR);
        closesocket(cl->FD);
        free(cl);
 }
@@ -52,6 +59,7 @@ void recvProc(struct client_data *cl) {
        ssize_t bytesRead;
        char *x;
        char tmp;
+       int packetReturn;
        while(1){
                // I hate you
                if(cl->bufLen == cl->bufCap) { killConnection(cl); return; }
@@ -75,7 +83,11 @@ void recvProc(struct client_data *cl) {
                        if(!x) break;
                        tmp = *(x+1);
                        *(x+1) = '\0';
-                       processPacket(cl);
+                       packetReturn = processPacket(cl);
+                       // Client QUIT
+                       if(packetReturn == 1) {
+                               return;
+                       }
                        *(x+1) = tmp;
                        memmove(cl->buf, x+1, cl->buf + cl->bufLen-(x+1));
                        cl->bufLen -= x+1 - cl->buf;