]> andersk Git - moira.git/blobdiff - server/mr_scall.c
Allow users who are status 8 to be deleted, too.
[moira.git] / server / mr_scall.c
index 116efbb6353d2f6daeb08f6c6600fd794674b657..a3f1fa846e10952a8cc1b40e3015a9f42e1e2a99 100644 (file)
@@ -32,6 +32,8 @@ extern char *whoami;
 
 extern int dbms_errno, mr_errcode;
 
+int max_version;
+
 void do_call(client *cl);
 void free_rtn_tuples(client *cp);
 int retr_callback(int argc, char **argv, void *p_cl);
@@ -39,6 +41,7 @@ int list_users(client *cl);
 void do_retr(client *cl);
 void do_access(client *cl);
 void get_motd(client *cl);
+void do_version(client *cl);
 
 char *procnames[] = {
   "noop",
@@ -48,6 +51,8 @@ char *procnames[] = {
   "access",
   "dcm",
   "motd",
+  "proxy",
+  "version",
 };
 
 int newqueries;
@@ -72,8 +77,7 @@ void client_read(client *cl)
     {
       com_err(whoami, 0, "procno out of range");
       client_reply(cl, MR_UNKNOWN_PROC);
-      mr_destroy_reply(cl->req);
-      return;
+      goto out;
     }
   log_args(procnames[pn], 2, cl->req.mr_argc, cl->req.mr_argv);
 
@@ -81,8 +85,7 @@ void client_read(client *cl)
     {
       client_reply(cl, MR_DOWN);
       com_err(whoami, MR_DOWN, "(query refused)");
-      mr_destroy_reply(cl->req);
-      return;
+      goto out;
     }
 
   /* make sure this gets cleared before every operation */
@@ -117,7 +120,17 @@ void client_read(client *cl)
     case MR_MOTD:
       get_motd(cl);
       break;
+
+    case MR_PROXY:
+      do_proxy(cl);
+      break;
+
+    case MR_SETVERSION:
+      do_version(cl);
+      break;
     }
+
+out:
   mr_destroy_reply(cl->req);
   memset(&cl->req, 0, sizeof(mr_params));
 }
@@ -242,6 +255,23 @@ void do_access(client *cl)
   com_err(whoami, 0, "Access check complete.");
 }
 
+void do_version(client *cl)
+{
+  if (cl->req.mr_argc != 1)
+    {
+      client_reply(cl, MR_ARGS);
+      com_err(whoami, MR_ARGS, "incorrect number of arguments");
+      return;
+    }
+
+  cl->version = atoi(cl->req.mr_argv[0]);
+  if (cl->version == -1)
+    cl->version = max_version;
+
+  client_reply(cl, cl->version == max_version ? MR_SUCCESS :
+              cl->version < max_version ? MR_VERSION_LOW : MR_VERSION_HIGH);
+}
+
 void get_motd(client *cl)
 {
   int motd;
This page took 0.057548 seconds and 4 git commands to generate.