]> PatchyGit - patchyircd.git/commitdiff
Append_Text
authorSam Smith <sam@patchysicp.xyz>
Sun, 1 May 2022 01:05:09 +0000 (18:05 -0700)
committerSam Smith <sam@patchysicp.xyz>
Sun, 1 May 2022 01:05:09 +0000 (18:05 -0700)
irc.c
irc.h
main.c
net.c
util.c [new file with mode: 0644]
util.h [new file with mode: 0644]

diff --git a/irc.c b/irc.c
index d760479..a25ae7f 100644 (file)
--- a/irc.c
+++ b/irc.c
@@ -1,14 +1,15 @@
 #include "irc.h"
 
+struct dynarr databuf;
+
 int processPacket(struct client_data *client) {
        char *packet = client->buf;
        //size_t packetLen = client->bufLen;
+       databuf.len = 0;
        if(strncmp(packet, "PING", 4) == 0) {
-               char data[1024];
-               strcpy(data, ":irc.patchysicp.xyz PONG irc.patchysicp.xyz ");
-               strcpy(data+strlen(":irc.patchysicp.xyz PONG irc.patchysicp.xyz :"), packet+5);
-               data[strlen(":irc.patchysicp.xyz PONG irc.patchysicp.xyz ")] = ':';
-               send_log(client->FD, data, strlen(data), 0);
+               append_str(&databuf, ":irc.patchysicp.xyz PONG irc.patchysicp.xyz :");
+               append_str(&databuf, packet+5);
+               send_log(client->FD, databuf.buf, databuf.len, 0);
        } else if(strncmp(packet, "NICK ", 5) == 0) {
                // User now registered
                setNick(client, packet+5, 32);
@@ -22,54 +23,55 @@ int processPacket(struct client_data *client) {
                sendMOTD(client);
        // Horrible join but it works and its funny
        } else if(strncmp(packet, "JOIN ", 5) == 0) {
-               char data[256];
-               data[0] = ':';
                char *i;
-               strcpy(data+1, client->nick);
-               strcpy(data+1+client->nickLen, " JOIN :");
+               append_str(&databuf, ":");
+               append_str(&databuf, client->nick);
+               append_str(&databuf, " JOIN :");
+               // Start GitHub Copilot
                if(packet[5] == ':') {
                        i = packet+6;
                } else {
                        i = packet+5;
                }
-               strcpy(data+8+client->nickLen, i);
-               // Start GitHub Copilot
-               i = data+8+client->nickLen;
+               append_str(&databuf, i);
+               i = databuf.buf+8+client->nickLen;
                while(*i != '\0') {
-                       if(*i == ' ') {
+                       // Fuck you and multiple channels at once
+                       // TODO: actually implement multiple channels
+                       if(*i == ' ' || *i == ',') {
                                *i = '\n';
-                               *(i+1) = '\0';
+                               *(i+1) = 0;
                                break;
                        }
                        i++;
                }
+               databuf.len = strlen(databuf.buf);
                // End GitHub Copilot
-               send_log(client->FD, data, strlen(data), 0);
-               sendall_log(client->FD, data, strlen(data), 0);
+               send_log(client->FD, databuf.buf, databuf.len, 0);
+               sendall_log(client->FD, databuf.buf, databuf.len, 0);
        } else if(strncmp(packet, "PRIVMSG ", 8) == 0) {
-               char data[256];
-               data[0] = ':';
-               strcpy(data+1, client->nick);
-               data[1+client->nickLen] = ' ';
-               strcpy(data+2+client->nickLen, packet);
-               sendall_log(client->FD, data, strlen(data), 0);
+               append_str(&databuf, ":");
+               append_str(&databuf, client->nick);
+               append_str(&databuf, " ");
+               append_str(&databuf, packet);
+               sendall_log(client->FD, databuf.buf, databuf.len, 0);
        // Start GitHub Copilot - this shit actually be copy pasting my code lmao
        } else if(strncmp(packet, "QUIT", 4) == 0) {
-               char data[256];
-               data[0] = ':';
-               strcpy(data+1, client->nick);
-               strcpy(data+1+client->nickLen, " QUIT :");
-               strcpy(data+8+client->nickLen, packet+5);
-               sendall_log(client->FD, data, strlen(data), 0);
+               append_str(&databuf, ":");
+               append_str(&databuf, client->nick);
+               append_str(&databuf, " QUIT :");
+               if(packet[4] == ' ') {
+                       if(packet[5] == ':') {
+                               append_str(&databuf, packet+6);
+                       } else {
+                               append_str(&databuf, packet+5);
+                       }
+               } else {
+                       append_str(&databuf, "Client Quit\n");
+               }
+               sendall_log(client->FD, databuf.buf, databuf.len, 0);
                killConnection(client, true);
                return 1;
-       } else if(strncmp(packet, "PART ", 5) == 0) {
-               char data[256];
-               data[0] = ':';
-               strcpy(data+1, client->nick);
-               strcpy(data+1+client->nickLen, " PART :");
-               strcpy(data+8+client->nickLen, packet+5);
-               sendall_log(client->FD, data, strlen(data), 0);
        } else if(strncmp(packet, "PONG", 4) == 0) {
                // Do nothing
        } else {
@@ -123,24 +125,62 @@ void sendMOTD(struct client_data *client) {
 }
 
 void setNick(struct client_data *client, char* nickname, size_t size) {
+       size_t i;
        // TODO: perform basic sanitization
-       strncpy(client->nick, nickname, size);
-       // Null term
-       client->nick[size-1] = 0;
+
        // Remove newline
-       size_t i;
        for(i=0;i<size;i++){
                // CR/^M
-               if(client->nick[i] == 13) {
-                       client->nick[i] = 0;
+               if(nickname[i] == 13) {
+                       nickname[i] = 0;
                        break;
                }
                // Newline
-               if(client->nick[i] == 10) {
-                       client->nick[i] = 0;
+               if(nickname[i] == 10) {
+                       nickname[i] = 0;
+                       break;
+               }
+               // Space
+               if(nickname[i] == ' ') {
+                       break;
+               }
+               // NULL
+               if(nickname[i] == 0) {
                        break;
                }
        }
+
+       // Start GitHub Copilot
+       // Check if the nickname is already taken
+       for(i=0;i<CLIENTS;i++) {
+               if(clients[i] == 0) continue;
+               if(strncmp(clients[i]->nick, nickname, size) == 0) {
+                       // Nickname is already taken
+                       databuf.len = 0;
+                       append_str(&databuf, ":irc.patchysicp.xyz 443 * ");
+                       append_str(&databuf, nickname);
+                       append_str(&databuf, " :Nickname is already in use\n");
+                       send_log(client->FD, databuf.buf, databuf.len, 0);
+                       return;
+               }
+       }
+       // End GitHub Copilot
+
+       // Update nickname
+       if(client->nickLen) {
+               databuf.len = 0;
+               append_str(&databuf, ":");
+               append_str(&databuf, client->nick);
+               append_str(&databuf, " NICK ");
+               append_str(&databuf, nickname);
+               append_str(&databuf, "\n");
+               send_log(client->FD, databuf.buf, databuf.len, 0);
+               sendall_log(client->FD, databuf.buf, databuf.len, 0);
+       }
+
+       strncpy(client->nick, nickname, size);
+       // Null term just incase
+       client->nick[size-1] = 0;
        // Set length
        client->nickLen = strlen(client->nick);
        return;
diff --git a/irc.h b/irc.h
index 04b5fb6..a48cc8c 100644 (file)
--- a/irc.h
+++ b/irc.h
@@ -3,10 +3,12 @@
 
 #include "common.h"
 #include "net.h"
+#include "util.h"
 
 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);
+extern struct dynarr databuf;
 
 #endif
diff --git a/main.c b/main.c
index 933df64..9c37ea7 100644 (file)
--- a/main.c
+++ b/main.c
@@ -30,6 +30,8 @@ int main() {
        fflush(stdout);
 
        net_init();
+       databuf.buf = malloc(sizeof(char) * 512);
+       databuf.cap = 512;
 
        // Zero stuff out
        memset(clients, 0, sizeof(clients));
diff --git a/net.c b/net.c
index a132388..370ab14 100644 (file)
--- a/net.c
+++ b/net.c
@@ -52,17 +52,20 @@ void killConnection(struct client_data *cl, bool byChoice) {
 #endif
        // Start GitHub Copilot
        if(!byChoice) {
-               strcpy(data, ":irc.patchysicp.xyz QUIT :");
-               strcpy(data+24, cl->nick);
-               strcpy(data+24+cl->nickLen, " has left the building\n");
-               sendall_log(cl->FD, data, strlen(data), 0);
+               databuf.len = 0;
+               append_str(&databuf, ":");
+               append_str(&databuf, cl->nick);
+               append_str(&databuf, " QUIT :");
+               append_str(&databuf, "Has left the building (Forced)\n");
+               sendall_log(cl->FD, databuf.buf, databuf.len, 0);
        }
        // Send error to client informing them that they will be disconnected
        // ERROR :Closing Link: NICK ()
-       strcpy(data, "ERROR :Closing Link: ");
-       strcpy(data+21, cl->nick);
-       strcpy(data+21+cl->nickLen, " ()\n");
-       send_log(cl->FD, data, strlen(data), 0);
+       databuf.len = 0;
+       append_str(&databuf, "ERROR :Closing Link: ");
+       append_str(&databuf, cl->nick);
+       append_str(&databuf, " ()\n");
+       send_log(cl->FD, databuf.buf, databuf.len, 0);
        // End GitHub Copilot
        shutdown(cl->FD, SHUT_RDWR);
        closesocket(cl->FD);
diff --git a/util.c b/util.c
new file mode 100644 (file)
index 0000000..62a5d30
--- /dev/null
+++ b/util.c
@@ -0,0 +1,16 @@
+#include "util.h"
+#include <stdio.h>
+#include <string.h>
+
+void append_str(struct dynarr *d, const char *s){
+       int len = strlen(s);
+       if (d->len + len > d->cap){
+               while (d->len + len > d->cap)
+                       d->cap *= 2;
+                       void* ndata=realloc(d->buf, d->cap);
+                       if(!ndata)abort();
+                       d->buf = ndata;
+       }
+       memcpy(d->buf + d->len, s, len);
+       d->len += len;
+}
diff --git a/util.h b/util.h
new file mode 100644 (file)
index 0000000..2896a6d
--- /dev/null
+++ b/util.h
@@ -0,0 +1,9 @@
+#include <stdlib.h>
+
+struct dynarr {
+       char *buf;
+       size_t len;
+       size_t cap;
+};
+
+void append_str(struct dynarr *d, const char *s);