Update CI/Cargo.toml references to 0.0.122
[ldk-c-bindings] / ldk-net / ldk_net.c
index fb349ae1368ccddba0da8b242bdbfcb5802d0236..fcc0e527e214b89f05e7ad7c40519d053a495967 100644 (file)
@@ -38,7 +38,7 @@
 
 #define MAX_CONNS 1024
 struct SocketHandler {
-       const struct LDKPeerManager *ldk_peer_manager;
+       struct LDKPeerManager ldk_peer_manager;
        pthread_t socket_thread;
        bool should_exit;
        int pipefds[2];
@@ -111,10 +111,9 @@ static uintptr_t sock_send_data(void* desc, struct LDKu8slice data, bool resume_
                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;
                        }
@@ -142,12 +141,12 @@ static uint64_t sock_hash(const void* desc) {
        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);
@@ -163,12 +162,37 @@ static inline LDKSocketDescriptor get_descriptor(struct SocketHandler *handler,
                .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;
 
@@ -215,7 +239,7 @@ static void *sock_thread_fn(void* 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);
@@ -237,14 +261,13 @@ static void *sock_thread_fn(void* arg) {
                                                                .data = readbuf,
                                                                .datalen = readlen,
                                                        };
-                                                       LDKCResult_boolPeerHandleErrorZ res = PeerManager_read_event(handler->ldk_peer_manager, &descriptor, data);
+                                                       LDKCResult_boolPeerHandleErrorZ res = PeerManager_read_event(&handler->ldk_peer_manager, &descriptor, data);
                                                        if (res.result_ok) {
                                                                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);
                                                                }
@@ -255,7 +278,7 @@ static void *sock_thread_fn(void* arg) {
                                                }
                                        }
                                        if (pollfds[i].revents & POLLOUT) {
-                                               LDKCResult_NonePeerHandleErrorZ res = PeerManager_write_buffer_space_avail(handler->ldk_peer_manager, &descriptor);
+                                               LDKCResult_NonePeerHandleErrorZ res = PeerManager_write_buffer_space_avail(&handler->ldk_peer_manager, &descriptor);
                                                if (!res.result_ok) {
                                                        close_socks[close_socks_count++] = i;
                                                }
@@ -274,7 +297,7 @@ static void *sock_thread_fn(void* arg) {
                // as we walk.
                for (int i = 0; i < close_socks_count; i++) {
                        LDKSocketDescriptor descriptor = get_descriptor(handler, handler->pollfds[close_socks[i]].fd);
-                       PeerManager_socket_disconnected(handler->ldk_peer_manager, &descriptor);
+                       PeerManager_socket_disconnected(&handler->ldk_peer_manager, &descriptor);
                        SocketDescriptor_free(descriptor);
                }
 
@@ -294,14 +317,14 @@ static void *sock_thread_fn(void* arg) {
                lockres = pthread_mutex_unlock(&handler->sockets_mutex);
                assert(lockres == 0);
 
-               PeerManager_process_events(handler->ldk_peer_manager);
+               PeerManager_process_events(&handler->ldk_peer_manager);
        }
 
        lockres = pthread_mutex_lock(&handler->sockets_mutex);
        assert(lockres == 0);
        for (int i = 0; i < handler->sockcount; i++) {
                LDKSocketDescriptor descriptor = get_descriptor(handler, handler->pollfds[i].fd);
-               PeerManager_socket_disconnected(handler->ldk_peer_manager, &descriptor);
+               PeerManager_socket_disconnected(&handler->ldk_peer_manager, &descriptor);
                SocketDescriptor_free(descriptor);
        }
 
@@ -326,7 +349,7 @@ void* init_socket_handling(const struct LDKPeerManager *NONNULL_PTR ldk_peer_man
        handler->pipefds[0] = -1;
        handler->pipefds[1] = -1;
 
-       handler->ldk_peer_manager = ldk_peer_manager;
+       handler->ldk_peer_manager = *ldk_peer_manager;
        handler->should_exit = false;
 
        if (pipe(handler->pipefds) != 0) goto err;
@@ -380,7 +403,7 @@ int socket_connect(void* arg, LDKPublicKey pubkey, struct sockaddr *addr, size_t
        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)