From d98625f4404ba4fca4f395bc72f15d68043d75b4 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 16 Sep 2017 17:38:32 +0100 Subject: [PATCH] server/: Introduce accessor functions for reading and writing port numbers. There are still some raw accesses to port numbers outside of address- family switches, but these are all concerned with conversions between address structures and strings, and this will be fixed in a later change. --- server/admin.c | 5 ++--- server/peer.c | 3 +-- server/servutil.c | 26 ++++++++++++++++++++++++++ server/tripe.h | 13 +++++++++++++ 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/server/admin.c b/server/admin.c index c5fed8b0..0ec187ce 100644 --- a/server/admin.c +++ b/server/admin.c @@ -1030,7 +1030,7 @@ static void a_resolved(struct hostent *h, void *v) T( trace(T_ADMIN, "admin: resop %s ok", BGTAG(r)); ) r->sa.sin.sin_family = AF_INET; memcpy(&r->sa.sin.sin_addr, h->h_addr, sizeof(struct in_addr)); - r->sa.sin.sin_port = htons(r->port); + setport(&r->sa, r->port); r->func(r, ARES_OK); } sel_rmtimer(&r->t); @@ -1113,7 +1113,6 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, a_fail(a, "bad-addr-syntax", "[inet] ADDRESS [PORT]", A_END); goto fail; } - r->sa.sin.sin_family = AF_INET; r->addr = xstrdup(av[i]); if (!av[i + 1]) pt = TRIPE_PORT; @@ -1150,7 +1149,7 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag, if (inet_aton(av[i], &r->sa.sin.sin_addr)) { T( trace(T_ADMIN, "admin: resop %s done the easy way", BGTAG(r)); ) r->sa.sin.sin_family = AF_INET; - r->sa.sin.sin_port = htons(r->port); + setport(&r->sa, r->port); func(r, ARES_OK); xfree(r->addr); a_bgrelease(&r->bg); diff --git a/server/peer.c b/server/peer.c index ba8d7baf..ea6e09bb 100644 --- a/server/peer.c +++ b/server/peer.c @@ -830,8 +830,7 @@ unsigned p_port(int i) if (getsockname(udpsock[i].fd, &a.sa, &sz)) die(EXIT_FAILURE, "couldn't read port number: %s", strerror(errno)); - assert(a.sa.sa_family == AF_INET); - return (ntohs(a.sin.sin_port)); + return (getport(&a)); } /* --- @p_keepalive@ --- * diff --git a/server/servutil.c b/server/servutil.c index 70776dda..b6fbf5b8 100644 --- a/server/servutil.c +++ b/server/servutil.c @@ -160,4 +160,30 @@ socklen_t addrsz(const addr *a) } } +/* --- @getport@, @setport@ --- * + * + * Arguments: @addr *a@ = a network address + * @unsigned port@ = port number to set + * + * Returns: --- + * + * Use: Retrieves or sets the port number in an address structure. + */ + +unsigned getport(addr *a) +{ + switch (a->sa.sa_family) { + case AF_INET: return (ntohs(a->sin.sin_port)); break; + default: abort(); + } +} + +void setport(addr *a, unsigned port) +{ + switch (a->sa.sa_family) { + case AF_INET: a->sin.sin_port = htons(port); break; + default: abort(); + } +} + /*----- That's all, folks -------------------------------------------------*/ diff --git a/server/tripe.h b/server/tripe.h index baae9078..dd8205be 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -1780,6 +1780,19 @@ extern int afix(int af); extern socklen_t addrsz(const addr */*a*/); +/* --- @getport@, @setport@ --- * + * + * Arguments: @addr *a@ = a network address + * @unsigned port@ = port number to set + * + * Returns: --- + * + * Use: Retrieves or sets the port number in an address structure. + */ + +extern unsigned getport(addr */*a*/); +extern void setport(addr */*a*/, unsigned /*port*/); + /* --- @seq_reset@ --- * * * Arguments: @seqwin *s@ = sequence-checking window -- 2.11.0