shithub: ircd

Download patch

ref: a80ed8b66a6fe7445c83907cbfdc82a397d29c52
parent: b7b579414649750ca39b3ba85bb17dc32bdfb6da
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Jul 21 18:27:38 EDT 2025

implements ll for client handling

--- a/client.c
+++ b/client.c
@@ -3,11 +3,10 @@
 #include <String.h>
 #include "dat.h"
 #include "fns.h"
+#include "ll.h"
 
-// TODO: generalize doubly linked list, or use other structure
+static Linked *clients = nil;
 
-static Client *first = nil;
-
 Client*
 addclient(ulong fid)
 {
@@ -16,50 +15,51 @@
 	n->fid = fid;
 	n->replies.reply = s_new();
 	
-	if (!first) {
-		first = n;
-		return n;
-	}
-	n->next = first;
-	first->prev = n;
-	first = n;
+	ladd(&clients, n);
 	return n;
 }
 
-void
-delclient(Client *c)
+static void
+freeclient(void *ptr)
 {
 	String *s;
-	if (!c->prev) {
-		first = c->next;
-		if (c->next)
-			c->next->prev = nil;
-	} else {
-		c->prev->next = c->next;
-		if (c->next)
-			c->next->prev = c->prev;
-	}
+	Client *c = ptr;
 	s = c->replies.reply;
 	s_free(s);
 	free(c);
 }
 
+void
+delclient(Client *c)
+{
+	ldel(&clients, c, freeclient);
+}
+
+static int
+findbyfid(void *ptr, void *aux)
+{
+	ulong *fid = aux;
+	Client *c = ptr;
+	return *fid == c->fid;
+}
+
 Client*
 findclient(ulong fid)
 {
-	for (Client *c = first; c; c = c->next) {
-		if (fid == c->fid)
-			return c;
-	}
-	return nil;
+	Client *c = lfind(&clients, findbyfid, &fid);
+	return c;
 }
 
+static int
+findbynick(void *ptr, void *aux)
+{
+	char *nick = aux;
+	Client *c = ptr;
+	return c->nick && strcmp(c->nick, nick) == 0;
+}
+
 Client*
 findnick(char *nick)
 {
-	for (Client *c = first; c; c = c->next) {
-		if (c->nick && strcmp(c->nick, nick) == 0)
-			return c;
-	}
-	return nil;
+	return lfind(&clients, findbynick, nick);
 }
--- a/ircd.c
+++ b/ircd.c
@@ -105,6 +105,10 @@
 	}
 	
 	cl = getclient(r);
+	if (!cl) {
+		respond(r, "client not found!");
+		return;
+	}
 	if (r->ifcall.count > 512) {
 		respond(r, "too many bytes");
 		return;
--- a/reply.c
+++ b/reply.c
@@ -35,5 +35,8 @@
 	va_end(arg);
 	
 	snprint(&buf[i], sizeof(buf) - i, "\r\n");
+	
+	if (debug > 1)
+		fprint(2, "reply: '%s'\n", buf);
 	s_append(s, buf);
 }
--