From: Sam Smith Date: Sun, 1 May 2022 01:05:09 +0000 (-0700) Subject: Append_Text X-Git-Url: https://git.patchysicp.xyz/?a=commitdiff_plain;h=bd9b430c2eccbfa312e6b09a38d3da0a660c3e2c;p=patchyircd.git Append_Text --- diff --git a/irc.c b/irc.c index d760479..a25ae7f 100644 --- 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;inick[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;inick, 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 --- 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 --- 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 --- 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 index 0000000..62a5d30 --- /dev/null +++ b/util.c @@ -0,0 +1,16 @@ +#include "util.h" +#include +#include + +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 index 0000000..2896a6d --- /dev/null +++ b/util.h @@ -0,0 +1,9 @@ +#include + +struct dynarr { + char *buf; + size_t len; + size_t cap; +}; + +void append_str(struct dynarr *d, const char *s);