From cb2c2bfcff87c4d6959fe3ccf47a4b509f933e9c Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Mon, 4 Sep 2017 02:25:41 +0100 Subject: [PATCH] server/: Calculate address size on demand, rather than tracking it. It's fine when the address is just in the peer spec, but this isn't going to be the case forever. --- server/admin.c | 2 -- server/peer.c | 4 +++- server/servutil.c | 15 +++++++++++++++ server/tripe.h | 10 +++++++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/server/admin.c b/server/admin.c index 867c4247..aafe0b9c 100644 --- a/server/admin.c +++ b/server/admin.c @@ -1110,7 +1110,6 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, goto fail; } r->sa.sin.sin_family = AF_INET; - r->sasz = sizeof(r->sa.sin); r->addr = xstrdup(av[i]); if (!av[i + 1]) pt = TRIPE_PORT; @@ -1223,7 +1222,6 @@ static void a_doadd(admin_resop *r, int rc) T( trace(T_ADMIN, "admin: done add op %s", BGTAG(add)); ) if (rc == ARES_OK) { - add->peer.sasz = add->r.sasz; add->peer.sa = add->r.sa; if (p_findbyaddr(&add->r.sa)) a_bgfail(&add->r.bg, "peer-addr-exists", "?ADDR", &add->r.sa, A_END); diff --git a/server/peer.c b/server/peer.c index f74b977d..891888b0 100644 --- a/server/peer.c +++ b/server/peer.c @@ -481,6 +481,8 @@ static void p_setkatimer(peer *); static int p_dotxend(peer *p) { + socklen_t sasz = addrsz(&p->spec.sa); + if (!BOK(&p->b)) { a_warn("PEER", "?PEER", p, "packet-build-failed", A_END); return (0); @@ -488,7 +490,7 @@ static int p_dotxend(peer *p) IF_TRACING(T_PEER, trace_block(T_PACKET, "peer: sending packet", BBASE(&p->b), BLEN(&p->b)); ) if (sendto(sock.fd, BBASE(&p->b), BLEN(&p->b), - 0, &p->spec.sa.sa, p->spec.sasz) < 0) { + 0, &p->spec.sa.sa, sasz) < 0) { a_warn("PEER", "?PEER", p, "socket-write-error", "?ERRNO", A_END); return (0); } else { diff --git a/server/servutil.c b/server/servutil.c index e4772c4c..70721396 100644 --- a/server/servutil.c +++ b/server/servutil.c @@ -121,4 +121,19 @@ int mystrieq(const char *x, const char *y) } } +/* --- @addrsz@ --- * + * + * Arguments: @const addr *a@ = a network address + * + * Returns: The size of the address, for passing into the sockets API. + */ + +socklen_t addrsz(const addr *a) +{ + switch (a->sa.sa_family) { + case AF_INET: return (sizeof(a->sin)); + default: abort(); + } +} + /*----- That's all, folks -------------------------------------------------*/ diff --git a/server/tripe.h b/server/tripe.h index 3402776f..fa5333bd 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -595,7 +595,6 @@ typedef struct peerspec { const tunnel_ops *tops; /* Tunnel operations */ unsigned long t_ka; /* Keep alive interval */ addr sa; /* Socket address to speak to */ - size_t sasz; /* Socket address size */ unsigned f; /* Flags for the peer */ #define PSF_KXMASK 255u /* Key-exchange flags to set */ #define PSF_MOBILE 256u /* Address may change rapidly */ @@ -1730,6 +1729,15 @@ extern const char *timestr(time_t /*t*/); extern int mystrieq(const char */*x*/, const char */*y*/); +/* --- @addrsz@ --- * + * + * Arguments: @const addr *a@ = a network address + * + * Returns: The size of the address, for passing into the sockets API. + */ + +extern socklen_t addrsz(const addr */*a*/); + /* --- @seq_reset@ --- * * * Arguments: @seqwin *s@ = sequence-checking window -- 2.11.0