server/tests.at: Abstract out the wait-for-knock machinery.
[tripe] / server / admin.c
index b653522..4bab440 100644 (file)
@@ -890,7 +890,7 @@ static void a_jobdestroy(admin_svcop *svc)
   IF_TRACING(T_ADMIN, {
     trace(T_ADMIN, "admin: destroying job %s (%u)", a_jobidencode(svc), i);
   })
-  assert(j->v[i].u.op = svc);
+  assert(j->v[i].u.op == svc);
   j->v[i].u.next = j->free;
   j->v[i].seq++;
   j->free = i;
@@ -1593,7 +1593,7 @@ static void a_ping(admin *a, unsigned ac, char *av[],
   return;
 
 bad_syntax:
-  a_fail(a, "bad-syntax", "%s", cmd, "[OPTIONS] PEER", cmd, A_END);
+  a_fail(a, "bad-syntax", "%s", cmd, "[OPTIONS] PEER", A_END);
 fail:
   if (pg) xfree(pg);
   return;
@@ -2101,21 +2101,40 @@ static void acmd_stats(admin *a, unsigned ac, char *av[])
 static void acmd_kill(admin *a, unsigned ac, char *av[])
 {
   peer *p;
+  int bye = 1;
 
+  OPTIONS(ac, av, {
+    OPT("-quiet", { bye = 0; })
+  });
+  if (!*av || av[1]) goto bad_syntax;
   if ((p = a_findpeer(a, av[0])) != 0) {
-    p_destroy(p, 1);
+    p_destroy(p, bye);
     a_ok(a);
   }
+  return;
+
+bad_syntax:
+  a_fail(a, "bad-syntax", "kill", "[OPTIONS] PEER", A_END);
 }
 
 static void acmd_forcekx(admin *a, unsigned ac, char *av[])
 {
   peer *p;
+  int quiet = 0;
 
+  OPTIONS(ac, av, {
+    OPT("-quiet", { quiet = 1; })
+  });
+  if (!*av || av[1]) goto bad_syntax;
   if ((p = a_findpeer(a, av[0])) != 0) {
-    kx_start(&p->kx, 1);
+    if (!quiet) kx_start(&p->kx, 1);
+    else { p->kx.t_valid = time(0) - T_VALID - 1; }
     a_ok(a);
   }
+  return;
+
+bad_syntax:
+  a_fail(a, "bad-syntax", "forcekx", "[OPTIONS] PEER", A_END);
 }
 
 static void acmd_reload(admin *a, unsigned ac, char *av[])
@@ -2159,13 +2178,13 @@ static const acmd acmdtab[] = {
   { "checkchal", "CHAL",               1,      1,      acmd_checkchal },
   { "daemon",  0,                      0,      0,      acmd_daemon },
   { "eping",   "[OPTIONS] PEER",       1,      0xffff, acmd_eping },
-  { "forcekx", "PEER",                 1,      1,      acmd_forcekx },
+  { "forcekx", "[OPTIONS] PEER",       1,      0xffff, acmd_forcekx },
   { "getchal", 0,                      0,      0,      acmd_getchal },
   { "greet",   "PEER CHAL",            2,      2,      acmd_greet },
   { "help",    0,                      0,      0,      acmd_help },
   { "ifname",  "PEER",                 1,      1,      acmd_ifname },
   { "jobs",    0,                      0,      0,      acmd_jobs },
-  { "kill",    "PEER",                 1,      1,      acmd_kill },
+  { "kill",    "[OPTIONS] PEER",       1,      0xffff, acmd_kill },
   { "list",    0,                      0,      0,      acmd_list },
   { "notify",  "MESSAGE ...",          1,      0xffff, acmd_notify },
   { "peerinfo",        "PEER",                 1,      1,      acmd_peerinfo },