server/: Introduce accessor functions for reading and writing port numbers.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 16 Sep 2017 16:38:32 +0000 (17:38 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Thu, 28 Jun 2018 23:26:40 +0000 (00:26 +0100)
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
server/peer.c
server/servutil.c
server/tripe.h

index c5fed8b..0ec187c 100644 (file)
@@ -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);
index ba8d7ba..ea6e09b 100644 (file)
@@ -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@ --- *
index 70776dd..b6fbf5b 100644 (file)
@@ -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 -------------------------------------------------*/
index baae907..dd8205b 100644 (file)
@@ -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