shithub: ircd

Download patch

ref: 3e1c35f04bc91f20cf8026b7eb03addd3744b19e
parent: 9922e90ae9072e72a7f61c8328ad1f71cee6cf0f
author: sirjofri <sirjofri@sirjofri.de>
date: Mon Jul 21 16:49:35 EDT 2025

basic nick handling, etc

--- a/client.c
+++ b/client.c
@@ -53,3 +53,13 @@
 	}
 	return nil;
 }
+
+Client*
+findnick(char *nick)
+{
+	for (Client *c = first; c; c = c->next) {
+		if (c->nick && strcmp(c->nick, nick) == 0)
+			return c;
+	}
+	return nil;
+}
--- a/cmd.c
+++ b/cmd.c
@@ -32,18 +32,62 @@
 		return;
 	}
 	u = adduser(r->args[0]);
+	u->realname = strdup(r->args[3]);
 	c->user = u;
 }
 
 static void
+cnick(Client *c, Request *r)
+{
+	if (!r->args[0]) {
+		reply(c, Enonicknamegiven);
+		return;
+	}
+	
+	if (findnick(r->args[0])) {
+		reply(c, Enicknameinuse, r->args[0]);
+		return;
+	}
+	
+	c->nick = strdup(r->args[0]);
+}
+
+static void
 cwhois(Client *c, Request *r)
 {
+	// TODO: implement remaining replies: (/lib/rfc/rfc2812:/^3.6.2)
+	int start = 0;
+	char *server = nil;
+	User *u;
+	Client *cl;
+	
 	if (!r->args[0]) {
-		/* information about self */
-		reply(c, Rwhoisuser, c->user->name, c->user->name, c->user->name, c->user->name);
+		reply(c, Enonicknamegiven);
 		return;
-		// TODO: fill with proper data!
 	}
+	if (r->args[1] && strcmp(r->args[1], ",")) {
+		server = r->args[0];
+		start = 2;
+	}
+	for (int i = start; i < 15; i += 2) {
+		/* args[i] is nick, args[i+1] is ',' */
+		if (!r->args[i])
+			break;
+		if (!server) {
+			cl = findnick(r->args[i]);
+			if (cl) {
+				u = cl->user;
+				if (!u)
+					goto Next;
+				reply(c, Rwhoisuser, cl->nick, u->name, sysnameb, u->realname);
+			} else
+				reply(c, Enosuchnick, r->args[i]);
+		} else {
+			// TODO: forward to server: send message to server
+		}
+Next:
+		reply(c, Rendofwhois, r->args[i]);
+	}
 }
 
 static Command commands[] = {
@@ -50,6 +94,7 @@
 	{ "whois", cwhois },
 	{ "version", cversion },
 	{ "user", cuser },
+	{ "nick", cnick },
 };
 int ncommands = sizeof(commands) / sizeof(Command);
 
--- a/cmd.h
+++ b/cmd.h
@@ -3,16 +3,36 @@
 	.msg = "%s %s %s * :%s",
 };
 
+Reply Rendofwhois = {
+	.nr = 318,
+	.msg = "%s :End of WHOIS list",
+};
+
 Reply Rversion = {
 	.nr = 351,
 	.msg = "%s",
 };
 
+Reply Enosuchnick = {
+	.nr = 401,
+	.msg = "%s :No such nick/channel",
+};
+
 Reply Enosuchserver = {
 	.nr = 402,
 	.msg = "%s :No such server",
 };
 
+Reply Enonicknamegiven = {
+	.nr = 431,
+	.msg = ":No nickname given",
+};
+
+Reply Enicknameinuse = {
+	.nr = 433,
+	.msg = "%s :Nickname is already in use",
+};
+
 Reply Eneedmoreparams = {
 	.nr = 461,
 	.msg = "%s :Not enough parameters",
@@ -21,4 +41,9 @@
 Reply Ealreadyregistered = {
 	.nr = 462,
 	.msg = ":Unauthorized command (already registered)",
+};
+
+Reply Erestricted = {
+	.nr = 484,
+	.msg = ":Your connection is restricted!",
 };
--- a/dat.h
+++ b/dat.h
@@ -44,6 +44,7 @@
 struct User
 {
 	char *name;
+	char *realname;
 	
 	User *prev;
 	User *next;
@@ -59,6 +60,7 @@
 	ulong fid;
 	Replybuffer replies;
 	User *user;
+	char *nick;
 	
 	Client *next;
 	Client *prev;
--- a/fns.h
+++ b/fns.h
@@ -5,7 +5,6 @@
 void execrequest(Client*, Request);
 void clearrequest(Request);
 
-void setuser(User*);
 void reply(Client*, Reply, ...);
 char *getreplies(Client*);
 void flushreplies(Client*);
@@ -19,4 +18,5 @@
 
 Client* addclient(ulong);
 Client* findclient(ulong);
+Client* findnick(char*);
 void delclient(Client*);
--- a/ircd.c
+++ b/ircd.c
@@ -49,12 +49,6 @@
 	return c;
 }
 
-void
-setuser(User *u)
-{
-	;
-}
-
 static void
 readproc(Req *r)
 {
@@ -118,12 +112,11 @@
 	r->ofcall.count = r->ifcall.count;
 	line[r->ifcall.count-1] = 0; /* last char is either \n or \r */
 	
-	c = strchr(line, '\n');
-	if (c) {
-		*c = 0;
-		c--;
-		if (*c == '
')
-			*c = 0;
+	c = strchr(line, '
');
+	if (c) *c = 0;
+	else {
+		c = strchr(line, '\n');
+		if (c) *c = 0;
 	}
 	
 	parsed = parseline(line);
--