return (result);
}
+isc_sockaddr_t
+isc_nmsocket_getaddr(isc_nmsocket_t *sock) {
+ REQUIRE(VALID_NMSOCK(sock));
+ return (sock->iface);
+}
+
#if ISC_NETMGR_TRACE
/*
* Dump all active sockets in netmgr. We output to stderr
return (result);
}
+ /* copy the actual port we're listening on into sock->iface */
+ if (isc_sockaddr_getport(iface) == 0) {
+ listener->iface = listener->outer->iface;
+ }
+
listener->result = result;
atomic_store(&listener->active, true);
atomic_store(&listener->listening, true);
int r, flags = 0;
isc_result_t result = ISC_R_UNSET;
isc_loop_t *loop = sock->worker->loop;
+ struct sockaddr_storage ss;
(void)isc__nm_socket_min_mtu(sock->fd, sa_family);
(void)isc__nm_socket_tcp_maxseg(sock->fd, NM_MAXSEG);
atomic_store(&sock->listening, true);
+ if (sock->tid == 0) {
+ r = uv_tcp_getsockname(&sock->uv_handle.tcp,
+ (struct sockaddr *)&ss,
+ &(int){ sizeof(ss) });
+ if (r != 0) {
+ goto done;
+ }
+
+ result = isc_sockaddr_fromsockaddr(&sock->parent->iface,
+ (struct sockaddr *)&ss);
+ if (result != ISC_R_SUCCESS) {
+ goto done_result;
+ }
+ }
+
done:
result = isc_uverr2result(r);
+
+done_result:
atomic_fetch_add(&sock->parent->rchildren, 1);
if (result != ISC_R_SUCCESS) {
return (result);
}
+ /* copy the actual port we're listening on into sock->iface */
+ if (isc_sockaddr_getport(iface) == 0) {
+ tlssock->iface = tlssock->outer->iface;
+ }
+
/* wait for listen result */
isc__nmsocket_attach(tlssock->outer, &tsock);
tlssock->result = result;