From: Sam Smith Date: Sun, 24 Apr 2022 20:23:24 +0000 (-0700) Subject: New parser X-Git-Url: https://git.patchysicp.xyz/?a=commitdiff_plain;h=188b6702caa46f9c52c0d360f0f599b684eb75dd;p=patchyircd.git New parser --- diff --git a/common.h b/common.h index 7bbd8d9..b8f5cd1 100644 --- 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 --- 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 --- 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 --- 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;jtype == 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;iFD); - 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 --- 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