shithub: ircd

Download patch

ref: b579d46f62e61c4fbb97ed9edd024ddb26def34d
parent: e5bc78b0a0ede131eabfbe2aa15415a82319206d
author: sirjofri <sirjofri@sirjofri.de>
date: Sat Jul 19 11:09:05 EDT 2025

implements version with reply etc

--- a/cmd.c
+++ b/cmd.c
@@ -2,11 +2,18 @@
 #include <libc.h>
 #include "dat.h"
 #include "fns.h"
+#include "cmd.h"
+#include "version.h"
 
 static void
 cversion(Request *r)
 {
-	fprint(2, "running version command\n");
+	if (r->args[0]) {
+		fprint(2, "get version of '%s' (not implemented yet!)\n", r->args[0]);
+		reply(Enosuchserver, r->args[0]);
+		return;
+	}
+	reply(Rversion, getversion());
 }
 
 static Command commands[] = {
@@ -37,5 +44,7 @@
 		fprint(2, "cannot execute request: no command\n");
 		return;
 	}
+	if (debug)
+		fprint(2, "run command '%s'\n", r.cmd->name);
 	r.cmd->func(&r);
 }
--- a/cmd.h
+++ b/cmd.h
@@ -1,0 +1,9 @@
+Reply Rversion = {
+	.nr = 351,
+	.msg = "%s",
+};
+
+Reply Enosuchserver = {
+	.nr = 402,
+	.msg = "%s :No such server",
+};
--- a/dat.h
+++ b/dat.h
@@ -1,6 +1,7 @@
 typedef struct Prefix Prefix;
 typedef struct Request Request;
 typedef struct Command Command;
+typedef struct Reply Reply;
 
 #pragma varargck type "R" Request
 
@@ -23,3 +24,11 @@
 	char *name;
 	void (*func)(Request*);
 };
+
+struct Reply
+{
+	int nr;
+	char *msg;
+};
+
+extern int debug;
--- a/fns.h
+++ b/fns.h
@@ -5,4 +5,7 @@
 void execrequest(Request);
 void clearrequest(Request);
 
+void reply(Reply, ...);
+
 int Rfmt(Fmt *f);
+char *getversion(void);
--- a/ircd.c
+++ b/ircd.c
@@ -3,6 +3,7 @@
 #include <bio.h>
 #include "dat.h"
 #include "fns.h"
+#include "version.h"
 
 void
 usage(void)
@@ -12,17 +13,30 @@
 }
 
 static Biobuf *bio;
+static char *sysnameb = "nil";
+static char *versionstring = nil;
+int debug = 0;
 
+char*
+getversion()
+{
+	if (versionstring)
+		return versionstring;
+	
+	versionstring = smprint("%s.%d %s :%s", Vversion, debug, Vname, Vcomment);
+	return versionstring;
+}
+
 static void
 parselines(void)
 {
 	char *line;
-	Command *cmd;
 	Request parsedrequest;
 	
 	while (line = Brdstr(bio, '\n', 1)) {
 		parsedrequest = parseline(line);
-		fprint(2, "request: %R\n", parsedrequest);
+		if (debug > 1)
+			fprint(2, "request: %R\n", parsedrequest);
 		execrequest(parsedrequest);
 		free(line);
 	}
@@ -35,10 +49,30 @@
 	case 'h':
 		usage();
 		break;
+	case 'v':
+		fprint(2, "version: %s\n", getversion());
+		exits(nil);
+	case 'd':
+		debug++;
+		break;
 	}ARGEND;
 	
 	fmtinstall('R', Rfmt);
 	
+	sysnameb = sysname();
+	
 	bio = Bfdopen(0, OREAD);
 	parselines();
+}
+
+void
+reply(Reply repl, ...)
+{
+	char buf[511];
+	va_list arg;
+	
+	va_start(arg, repl);
+	vsnprint(buf, sizeof buf, repl.msg, arg);
+	va_end(arg);
+	print(":%s %03d %s\r\n", sysnameb, repl.nr, buf);
 }
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,12 @@
+</$objtype/mkfile
+
+TARG=ircd
+OFILES=\
+	ircd.$O\
+	cmd.$O\
+	parse.$O\
+	fmt.$O\
+
+HFILES=fns.h dat.h cmd.h
+
+</sys/src/cmd/mkone
--- /dev/null
+++ b/version.h
@@ -1,0 +1,3 @@
+#define Vversion "0"
+#define Vname    "ircd"
+#define Vcomment "Plan 9 irc server"
--