for (int i = 0; i < descriptor->handler->sockcount; i++) {
if (descriptor->handler->pollfds[i].fd == descriptor->fd) {
if (pause_read) {
- descriptor->handler->pollfds[i].events &= POLLIN;
- descriptor->handler->pollfds[i].events |= POLLOUT;
+ descriptor->handler->pollfds[i].events = POLLOUT;
} else {
- descriptor->handler->pollfds[i].events |= POLLIN;
+ descriptor->handler->pollfds[i].events = POLLIN;
}
break;
}
const struct Descriptor *descriptor = (const struct Descriptor*)desc;
return (uint64_t)descriptor->fd;
}
-static void* sock_clone(const void* desc) {
- const struct Descriptor *descriptor = (const struct Descriptor*)desc;
+static void sock_cloned(LDKSocketDescriptor *NONNULL_PTR ldk_desc) {
+ const struct Descriptor *descriptor = (const struct Descriptor*)ldk_desc->this_arg;
struct Descriptor *new_desc = malloc(sizeof(struct Descriptor));
new_desc->handler = descriptor->handler;
new_desc->fd = descriptor->fd;
- return new_desc;
+ ldk_desc->this_arg = (void*) new_desc;
}
static void sock_free(void* desc) {
free(desc);
.disconnect_socket = sock_disconnect,
.eq = sock_eq,
.hash = sock_hash,
- .clone = sock_clone,
+ .cloned = sock_cloned,
.free = sock_free,
};
return ret;
}
+static LDKCOption_SocketAddressZ get_remote_network_address(int fd) {
+ struct sockaddr_storage sockaddr;
+ socklen_t remote_addr_len = sizeof(sockaddr);
+ if (getpeername(fd, (struct sockaddr*)&sockaddr, &remote_addr_len) == -1) {
+ return COption_SocketAddressZ_none();
+ }
+
+ switch (sockaddr.ss_family) {
+ case AF_INET: {
+ const struct sockaddr_in *remote_addr = (struct sockaddr_in*)&sockaddr;
+ LDKFourBytes addr;
+ memcpy(&addr, &remote_addr->sin_addr.s_addr, 4);
+ return COption_SocketAddressZ_some(SocketAddress_tcp_ip_v4(addr, ntohs(remote_addr->sin_port)));
+ }
+ case AF_INET6: {
+ const struct sockaddr_in6 *remote_addr = (struct sockaddr_in6*)&sockaddr;
+ LDKSixteenBytes addr;
+ memcpy(&addr, &remote_addr->sin6_addr.s6_addr, 16);
+ return COption_SocketAddressZ_some(SocketAddress_tcp_ip_v6(addr, ntohs(remote_addr->sin6_port)));
+ }
+ default:
+ return COption_SocketAddressZ_none();
+ }
+}
+
static void *sock_thread_fn(void* arg) {
struct SocketHandler *handler = (struct SocketHandler*) arg;
if (newfd >= 0) {
// Received a new connection, register it!
LDKSocketDescriptor new_descriptor = get_descriptor(handler, newfd);
- LDKCResult_NonePeerHandleErrorZ con_res = PeerManager_new_inbound_connection(&handler->ldk_peer_manager, new_descriptor);
+ LDKCResult_NonePeerHandleErrorZ con_res = PeerManager_new_inbound_connection(&handler->ldk_peer_manager, new_descriptor, get_remote_network_address(newfd));
if (con_res.result_ok) {
if (register_socket(handler, newfd, 0))
shutdown(newfd, SHUT_RDWR);
if (*res.contents.result) {
lockres = pthread_mutex_lock(&handler->sockets_mutex);
assert(lockres == 0);
- assert(handler->pollfds[i - 1].fd == pollfds[i].fd); // Only we change fd order!
- handler->pollfds[i - 1].events &= POLLIN;
- handler->pollfds[i - 1].events |= POLLOUT;
+ assert(handler->pollfds[i].fd == pollfds[i].fd); // Only we change fd order!
+ handler->pollfds[i].events = POLLOUT;
lockres = pthread_mutex_unlock(&handler->sockets_mutex);
assert(lockres == 0);
}
if (register_socket(handler, fd, 0)) return -4;
LDKSocketDescriptor descriptor = get_descriptor(handler, fd);
- LDKCResult_CVec_u8ZPeerHandleErrorZ con_res = PeerManager_new_outbound_connection(&handler->ldk_peer_manager, pubkey, descriptor);
+ LDKCResult_CVec_u8ZPeerHandleErrorZ con_res = PeerManager_new_outbound_connection(&handler->ldk_peer_manager, pubkey, descriptor, get_remote_network_address(fd));
if (con_res.result_ok) {
ssize_t write_count = send(fd, con_res.contents.result->data, con_res.contents.result->datalen, MSG_NOSIGNAL);
if (write_count != con_res.contents.result->datalen)