{
unsigned i, j;
const char *tag = 0;
- admin_addop *add = 0;
+ admin_addop *add;
/* --- Set stuff up --- */
add = xmalloc(sizeof(*add));
- add->peer.name = xstrdup(av[0]);
+ add->peer.name = 0;
add->peer.t_ka = 0;
add->peer.tops = tun_default;
- /* --- Make sure someone's not got there already --- */
-
- if (p_find(av[0])) {
- a_fail(a, "peer-exists", "%s", av[0], A_END);
- goto fail;
- }
-
/* --- Parse options --- */
- i = 1;
+ i = 0;
for (;;) {
if (!av[i])
goto bad_syntax;
i++;
}
+ /* --- Make sure someone's not got there already --- */
+
+ if (!av[i])
+ goto bad_syntax;
+ if (p_find(av[i])) {
+ a_fail(a, "peer-exists", "%s", av[i], A_END);
+ goto fail;
+ }
+ add->peer.name = xstrdup(av[i++]);
+
/* --- Crank up the resolver --- */
a_resolve(a, &add->r, tag, a_doadd, ac - i, av + i);
/* --- Clearing up --- */
bad_syntax:
- a_fail(a, "bad-syntax", "add", "PEER [OPTIONS] ADDR ...", A_END);
+ a_fail(a, "bad-syntax", "add", "[OPTIONS] PEER ADDR ...", A_END);
fail:
- xfree(add->peer.name);
+ if (add->peer.name) xfree(add->peer.name);
xfree(add);
return;
}
static void acmd_help(admin */*a*/, unsigned /*ac*/, char */*av*/[]);
static const acmd acmdtab[] = {
- { "add", "PEER [OPTIONS] ADDR ...", 2, 0xffff, acmd_add },
+ { "add", "[OPTIONS] PEER ADDR ...", 2, 0xffff, acmd_add },
{ "addr", "PEER", 1, 1, acmd_addr },
{ "checkchal", "CHAL", 1, 1, acmd_checkchal },
{ "daemon", 0, 0, 0, acmd_daemon },