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);
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;
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);
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@ --- *
}
}
+/* --- @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 -------------------------------------------------*/
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