X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/01c2190311b3eab8e861014d57ddca6160998e69..f4c9c08fb4a558d880d183b65a12de3770c3860b:/server/peer.c diff --git a/server/peer.c b/server/peer.c index 308ab1d1..57891e7b 100644 --- a/server/peer.c +++ b/server/peer.c @@ -204,10 +204,9 @@ static int p_decrypt(peer **pp, addr *a, size_t n, p = q; goto match; } - T( trace(T_PEER, "peer: failed to decrypt: try other mobile peers...", - p_name(q)); ) + T( trace(T_PEER, "peer: failed to decrypt: try other mobile peers..."); ) } else if (nmobile) - T( trace(T_PEER, "peer: unknown source: trying mobile peers..."); ) + T( trace(T_PEER, "peer: unknown source: trying mobile peers...") ); else { p = 0; goto searched; @@ -307,14 +306,14 @@ static void p_read(int fd, unsigned mode, void *v) { peer *p = 0; addr a; - size_t sz; + socklen_t sz; ssize_t n; int ch; buf b, bb; /* --- Read the data --- */ - TIMER; + QUICKRAND; sz = sizeof(addr); n = recvfrom(fd, buf_i, sizeof(buf_i), 0, &a.sa, &sz); if (n < 0) { @@ -659,7 +658,7 @@ void p_tun(peer *p, buf *b) { buf *bb = p_txstart(p, MSG_PACKET); - TIMER; + QUICKRAND; p_encrypt(p, MSG_PACKET, b, bb); if (BOK(bb) && BLEN(bb)) { p->st.n_ipout++; @@ -799,7 +798,7 @@ void p_init(struct in_addr addr, unsigned port) unsigned p_port(void) { addr a; - size_t sz = sizeof(addr); + socklen_t sz = sizeof(addr); if (getsockname(sock.fd, &a.sa, &sz)) die(EXIT_FAILURE, "couldn't read port number: %s", strerror(errno)); @@ -820,6 +819,7 @@ unsigned p_port(void) static void p_keepalive(struct timeval *now, void *pv) { peer *p = pv; + p_txstart(p, MSG_MISC | MISC_NOP); p_dotxend(p); T( trace(T_PEER, "peer: sent keepalive to %s", p->spec.name); ) p_setkatimer(p); @@ -871,8 +871,8 @@ peer *p_create(peerspec *spec) T( trace(T_PEER, "peer: creating new peer `%s'", spec->name); ) p->spec = *spec; p->spec.name = (/*unconst*/ char *)SYM_NAME(p->byname); - if (spec->tag) - p->spec.tag = xstrdup(spec->tag); + if (spec->tag) p->spec.tag = xstrdup(spec->tag); + if (spec->privtag) p->spec.privtag = xstrdup(spec->privtag); p->ks = 0; p->pings = 0; p->ifname = 0; @@ -902,8 +902,7 @@ peer *p_create(peerspec *spec) return (p); tidy_4: - if (spec->t_ka) - sel_rmtimer(&p->tka); + if (spec->t_ka) sel_rmtimer(&p->tka); xfree(p->ifname); p->t->ops->destroy(p->t); tidy_3: @@ -911,6 +910,7 @@ tidy_3: tidy_2: am_remove(&byaddr, p->byaddr); if (p->spec.tag) xfree(p->spec.tag); + if (p->spec.privtag) xfree(p->spec.privtag); tidy_1: sym_remove(&byname, p->byname); tidy_0: @@ -938,6 +938,16 @@ const char *p_name(peer *p) const char *p_tag(peer *p) { return (p->spec.tag ? p->spec.tag : p->spec.name); } +/* --- @p_privtag@ --- * + * + * Arguments: @peer *p@ = pointer to a peer block + * + * Returns: A pointer to the peer's private key tag. + */ + +const char *p_privtag(peer *p) + { return (p->spec.privtag ? p->spec.privtag : tag_priv); } + /* --- @p_spec@ --- * * * Arguments: @peer *p@ = pointer to a peer block @@ -1002,15 +1012,12 @@ void p_destroy(peer *p) a_notify("KILL", "%s", p->spec.name, A_END); ksl_free(&p->ks); kx_free(&p->kx); - if (p->spec.f & PSF_MOBILE) - nmobile--; - if (p->ifname) - xfree(p->ifname); - if (p->spec.tag) - xfree(p->spec.tag); + if (p->spec.f & PSF_MOBILE) nmobile--; + if (p->ifname) xfree(p->ifname); + if (p->spec.tag) xfree(p->spec.tag); + if (p->spec.privtag) xfree(p->spec.privtag); p->t->ops->destroy(p->t); - if (p->spec.t_ka) - sel_rmtimer(&p->tka); + if (p->spec.t_ka) sel_rmtimer(&p->tka); for (pg = p->pings; pg; pg = ppg) { ppg = pg->next; p_pingdone(pg, PING_PEERDIED);