diff --git a/src/fruity/device-monitor.vala b/src/fruity/device-monitor.vala index d478bb78e..ad7f4ebfc 100644 --- a/src/fruity/device-monitor.vala +++ b/src/fruity/device-monitor.vala @@ -1190,6 +1190,7 @@ namespace Frida.Fruity { ncm_peer = yield NcmPeer.locate (usb_device, cancellable); tunnel = new PortableUsbTunnel (usb_device, ncm_peer, pairing_store); + tunnel.lost.connect (on_tunnel_lost); try { yield tunnel.open (cancellable); } catch (Error e) { @@ -1208,6 +1209,10 @@ namespace Frida.Fruity { throw_api_error (e); } } + + private void on_tunnel_lost () { + tunnel_request = null; + } } private class NcmPeer { @@ -1420,6 +1425,8 @@ namespace Frida.Fruity { } private sealed class PortableUsbTunnel : Object, Tunnel { + public signal void lost (); + public UsbDevice usb_device { get; construct; @@ -1474,6 +1481,7 @@ namespace Frida.Fruity { var pairing_service = yield PairingService.open (pairing_transport, pairing_store, cancellable); TunnelConnection tc = yield pairing_service.open_tunnel (ncm_peer.ip, netstack, cancellable); + tc.close.connect (on_tunnel_connection_close); var rsd_endpoint = (InetSocketAddress) Object.new (typeof (InetSocketAddress), address: tc.remote_address, @@ -1505,6 +1513,10 @@ namespace Frida.Fruity { ); return yield netstack.open_tcp_connection (endpoint, cancellable); } + + private void on_tunnel_connection_close () { + lost (); + } } private sealed class PortableCoreDeviceNetworkTransport : Object, Transport { diff --git a/src/fruity/xpc.vala b/src/fruity/xpc.vala index 50309b0e6..c7f0a12ca 100644 --- a/src/fruity/xpc.vala +++ b/src/fruity/xpc.vala @@ -1753,6 +1753,8 @@ namespace Frida.Fruity { } public sealed class TunnelConnection : Object, AsyncInitable { + public signal void close (); + public InetSocketAddress address { get; construct; @@ -2021,6 +2023,8 @@ namespace Frida.Fruity { } public void cancel () { + if (connection != null) + close (); connection = null; socket = null;