ref: 4161df5fd7487feaf4758b93a8d8371bec433471
dir: /cmd.c/
#include <u.h> #include <libc.h> #include "dat.h" #include "fns.h" #include "cmd.h" #include "version.h" static void cversion(User *u, Request *r) { if (r->args[0]) { fprint(2, "get version of '%s' (not implemented yet!)\n", r->args[0]); reply(u, Enosuchserver, r->args[0]); return; } reply(u, Rversion, getversion()); } static void cuser(User *u, Request *r) { // TODO: how to respond without knowing the user? if (!r->args[3]) { fprint(2, "user without enough args%R\n", *r); // reply(u, Eneedmoreparams, r->cmd.name); return; } u = finduser(r->args[0]); if (u) { fprint(2, "user already registered%R\n", *r); // reply(u, Ealreadyregistered); return; } u = adduser(r->args[0]); setuser(u); } static Command commands[] = { { "version", cversion }, { "user", cuser }, }; int ncommands = sizeof(commands) / sizeof(Command); Command* findcommand(char *s) { for (int i = 0; i < ncommands; i++) { if (cistrcmp(commands[i].name, s) == 0) return &commands[i]; } return nil; } Command* findcommandn(int n) { return nil; } void execrequest(User *u, Request r) { if (!(r.cmd && r.cmd->func)) { fprint(2, "cannot execute request: no command\n"); return; } if (debug) fprint(2, "run command '%s'\n", r.cmd->name); r.cmd->func(u, &r); }