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[])
{ "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 },