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.
if (udpsock[i].sf.fd >= 0) goto found;
abort();
}
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);
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); )
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)
+ 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));
}
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);
-/* --- @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
/* --- @p_keepalive@ --- *
*
* Arguments: @struct timeval *now@ = the current time
typedef struct udpsocket {
sel_file sf; /* Selector for the socket */
typedef struct udpsocket {
sel_file sf; /* Selector for the socket */
+ unsigned port; /* Chosen port number */
} udpsocket;
typedef struct ping {
} udpsocket;
typedef struct ping {
extern void p_init(struct addrinfo */*ailist*/);
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
/* --- @p_create@ --- *
*
* Arguments: @peerspec *spec@ = information about this peer