From: Mark Wooding Date: Sat, 12 May 2018 09:44:14 +0000 (+0100) Subject: server/: Record port number with UDP socket, rather than querying. X-Git-Tag: 1.5.0~36 X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/commitdiff_plain/8d4c29d2d46656f85b1ef29ce0020c83fdc8ecf2?hp=063c9648a6d4650c800a780c79a2171450c5a030 server/: Record port number with UDP socket, rather than querying. The old `p_port' function queried getsockname(2) at runtime, and bailed in the (very unlikely) event that it failed. Avoid this situation by recording the port number when the socket is set up and just using the recorded value when it's needed. This was the only remaining abnormal exit after the server has started. --- diff --git a/server/admin.c b/server/admin.c index 24f83977..85e8c236 100644 --- a/server/admin.c +++ b/server/admin.c @@ -1879,7 +1879,7 @@ static void acmd_port(admin *a, unsigned ac, char *av[]) if (udpsock[i].sf.fd >= 0) goto found; abort(); } - a_info(a, "%u", p_port(i), A_END); + a_info(a, "%u", udpsock[i].port, A_END); a_ok(a); } diff --git a/server/peer.c b/server/peer.c index d4155670..377dcc59 100644 --- a/server/peer.c +++ b/server/peer.c @@ -871,13 +871,15 @@ void p_init(struct addrinfo *ailist) sel_initfile(&sel, &udpsock[i].sf, fd, SEL_READ, p_read, 0); sel_addfile(&udpsock[i].sf); T( trace(T_PEER, "peer: created %s socket", aftab[i].name); ) - if (!port) { + if (port) + udpsock[i].port = port; + else { sz = sizeof(a); if (getsockname(fd, &a.sa, &sz)) { die(EXIT_FAILURE, "failed to read local socket address: %s", strerror(errno)); } - lastport = getport(&a); + udpsock[i].port = lastport = getport(&a); } } @@ -885,23 +887,6 @@ void p_init(struct addrinfo *ailist) am_create(&byaddr); } -/* --- @p_port@ --- * - * - * Arguments: @int i@ = address family index to retrieve - * - * Returns: Port number used for socket. - */ - -unsigned p_port(int i) -{ - addr a; - socklen_t sz = sizeof(addr); - - if (getsockname(udpsock[i].sf.fd, &a.sa, &sz)) - die(EXIT_FAILURE, "couldn't read port number: %s", strerror(errno)); - return (getport(&a)); -} - /* --- @p_keepalive@ --- * * * Arguments: @struct timeval *now@ = the current time diff --git a/server/tripe.h b/server/tripe.h index a083b719..1effb952 100644 --- a/server/tripe.h +++ b/server/tripe.h @@ -678,6 +678,7 @@ typedef struct peer_iter { sym_iter i; } peer_iter; typedef struct udpsocket { sel_file sf; /* Selector for the socket */ + unsigned port; /* Chosen port number */ } udpsocket; typedef struct ping { @@ -1649,15 +1650,6 @@ extern const addr *p_addr(peer */*p*/); extern void p_init(struct addrinfo */*ailist*/); -/* --- @p_port@ --- * - * - * Arguments: @int i@ = address family index to retrieve - * - * Returns: Port number used for socket. - */ - -extern unsigned p_port(int /*i*/); - /* --- @p_create@ --- * * * Arguments: @peerspec *spec@ = information about this peer