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"
--
⑨