From a34f24b2bf2cf970ce161a013d97e3ca081b647c Mon Sep 17 00:00:00 2001 From: Sam Smith Date: Thu, 28 Apr 2022 08:44:54 -0700 Subject: [PATCH] Added QUIT (sorta) --- irc.c | 6 +++++- irc.h | 2 +- net.c | 24 ++++++++++++++++++------ 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/irc.c b/irc.c index 83cba8b..67480ab 100644 --- 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 --- 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 --- a/net.c +++ b/net.c @@ -1,5 +1,6 @@ #include "net.h" #include "irc.h" +#include 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;itype == 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;iFD, 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; -- 2.56.0