chiark / gitweb /
Portability: Use `socklen_t' throughout, if available.
[tripe] / server / admin.c
index 0fb57cd8645e6061f02bf8624ed1c8af6d2e0b41..ef5fddf3e24c49f5fe8f8db8e91671a402d9a38a 100644 (file)
@@ -51,7 +51,9 @@ unsigned tr_flags = 0;
 #endif
 
 static const trace_opt w_opts[] = {
+#ifndef NTRACE
   { 't',       AF_TRACE,       "trace messages" },
+#endif
   { 'n',       AF_NOTE,        "asynchronous notifications" },
   { 'w',       AF_WARN,        "warnings" },
   { 'A',       AF_ALLMSGS,     "all of the above" },
@@ -1250,6 +1252,7 @@ static void acmd_add(admin *a, unsigned ac, char *av[])
   add = xmalloc(sizeof(*add));
   add->peer.name = 0;
   add->peer.tag = 0;
+  add->peer.privtag = 0;
   add->peer.t_ka = 0;
   add->peer.tops = tun_default;
   add->peer.f = 0;
@@ -1279,6 +1282,11 @@ static void acmd_add(admin *a, unsigned ac, char *av[])
       add->peer.tag = xstrdup(arg);
     })
     OPT("-mobile", { add->peer.f |= PSF_MOBILE; })
+    OPTARG("-priv", arg, {
+      if (add->peer.privtag)
+       xfree(add->peer.privtag);
+      add->peer.privtag = xstrdup(arg);
+    })
   });
 
   /* --- Make sure someone's not got there already --- */
@@ -1304,6 +1312,7 @@ bad_syntax:
 fail:
   if (add->peer.name) xfree(add->peer.name);
   if (add->peer.tag) xfree(add->peer.tag);
+  if (add->peer.privtag) xfree(add->peer.privtag);
   xfree(add);
   return;
 }
@@ -1722,18 +1731,33 @@ static void acmd_algs(admin *a, unsigned ac, char *av[])
         "hash-sz=%lu", (unsigned long)algs->h->hashsz,
         A_END);
   a_info(a,
-        "cipher=%s", algs->c->name,
-        "cipher-keysz=%lu", (unsigned long)algs->cksz,
-        "cipher-blksz=%lu", (unsigned long)algs->c->blksz,
+        "bulk-transform=%s", algs->bulk->name,
+        "bulk-overhead=%lu", (unsigned long)algs->bulk->overhead(algs),
         A_END);
+  if (algs->c) {
+    a_info(a,
+          "cipher=%s", algs->c->name,
+          "cipher-keysz=%lu", (unsigned long)algs->cksz,
+          "cipher-blksz=%lu", (unsigned long)algs->c->blksz,
+          A_END);
+  }
   a_info(a,
         "cipher-data-limit=%lu", (unsigned long)algs->expsz,
         A_END);
-  a_info(a,
-        "mac=%s", algs->m->name,
-        "mac-keysz=%lu", (unsigned long)algs->mksz,
-        "mac-tagsz=%lu", (unsigned long)algs->tagsz,
-        A_END);
+  if (algs->m) {
+    a_info(a,
+          "mac=%s", algs->m->name,
+          "mac-keysz=%lu", (unsigned long)algs->mksz,
+          "mac-tagsz=%lu", (unsigned long)algs->tagsz,
+          A_END);
+  }
+  if (algs->b) {
+    a_info(a,
+          "blkc=%.*s", strlen(algs->b->name) - 4, algs->b->name,
+          "blkc-keysz=%lu", (unsigned long)algs->bksz,
+          "blkc-blksz=%lu", (unsigned long)algs->b->blksz,
+          A_END);
+  }
   a_ok(a);
 }
 
@@ -1824,11 +1848,16 @@ static void acmd_peerinfo(admin *a, unsigned ac, char *av[])
 {
   peer *p;
   const peerspec *ps;
+  const char *ptag;
 
   if ((p = a_findpeer(a, av[0])) != 0) {
     ps = p_spec(p);
     a_info(a, "tunnel=%s", ps->tops->name, A_END);
-    a_info(a, "key=%s", p_tag(p), A_END);
+    a_info(a, "key=%s", p_tag(p),
+          "current-key=%s", p->kx.kpub->tag, A_END);
+    if ((ptag = p_privtag(p)) == 0) ptag = "(default)";
+    a_info(a, "private-key=%s", ptag,
+          "current-private-key=%s", p->kx.kpriv->tag, A_END);
     a_info(a, "keepalive=%lu", ps->t_ka, A_END);
     a_ok(a);
   }
@@ -2208,7 +2237,7 @@ static void a_accept(int fd, unsigned mode, void *v)
 {
   int nfd;
   struct sockaddr_un sun;
-  size_t sz = sizeof(sun);
+  socklen_t sz = sizeof(sun);
 
   if ((nfd = accept(fd, (struct sockaddr *)&sun, &sz)) < 0) {
     if (errno != EINTR && errno != EAGAIN && errno != EWOULDBLOCK &&