From 8d4c29d2d46656f85b1ef29ce0020c83fdc8ecf2 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 12 May 2018 10:44:14 +0100 Subject: [PATCH] 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. --- server/admin.c | 2 +- server/peer.c | 23 ++++------------------- server/tripe.h | 10 +--------- 3 files changed, 6 insertions(+), 29 deletions(-) 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 -- 2.11.0