diff --git a/Cargo.lock b/Cargo.lock index 9a29c28..9b5ff32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "amplify" -version = "4.0.1" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4707ab08f19a25ba492cbf61713591b7f022b54ee188f35457e6de22f367df4a" +checksum = "8629db306c0bbeb0a402e2918bdcf0026b5ddb24c46460f3bf5410b350d98710" dependencies = [ "amplify_derive", "amplify_num", @@ -26,9 +26,9 @@ dependencies = [ [[package]] name = "amplify_derive" -version = "3.0.1" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87df0f28e6eb1f2d355f29ba6793fa9ca643967528609608d5cbd70bd68f9d1" +checksum = "759dcbfaf94d838367a86d493ec34ccc8aa6fe365cb7880d6bf89006de24d9c1" dependencies = [ "amplify_syn", "proc-macro2", @@ -38,9 +38,12 @@ dependencies = [ [[package]] name = "amplify_num" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddce3bc63e807ea02065e8d8b702695f3d302ae4158baddff8b0ce5c73947251" +checksum = "9681187211554ab98f138ba159e90861b136c20afc680dcff2ba82d020721e27" +dependencies = [ + "wasm-bindgen", +] [[package]] name = "amplify_syn" @@ -72,18 +75,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" [[package]] -name = "bitcoin-private" -version = "0.1.0" +name = "bitcoin-internals" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73290177011694f38ec25e165d0387ab7ea749a4b81cd4c80dae5988229f7a57" +checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" [[package]] name = "bitcoin_hashes" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7066118b13d4b20b23645932dfb3a81ce7e29f95726c2036fa33cd7b092501" +checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" dependencies = [ - "bitcoin-private", + "bitcoin-internals", + "hex-conservative", ] [[package]] @@ -97,9 +101,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "cfg-if" @@ -144,31 +148,27 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -226,15 +226,15 @@ dependencies = [ [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "data-encoding-macro" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c904b33cc60130e1aeea4956ab803d08a3f4a0ca82d64ed757afac3891f2bb99" +checksum = "20c01c06f5f429efdf2bae21eb67c28b3df3cf85b7dd2d8ef09c0838dac5d33e" dependencies = [ "data-encoding", "data-encoding-macro-internal", @@ -242,9 +242,9 @@ dependencies = [ [[package]] name = "data-encoding-macro-internal" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fdf3fce3ce863539ec1d7fd1b6dcc3c645663376b43ed376bbf887733e4f772" +checksum = "0047d07f2c89b17dd631c80450d69841a6b5d7fb17278cbc43d7e4cfcf2576f3" dependencies = [ "data-encoding", "syn 1.0.109", @@ -302,15 +302,21 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", "wasi", ] +[[package]] +name = "hex-conservative" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed443af458ccb6d81c1e7e661545f94d3176752fb1df2f543b902a1e0f51e2" + [[package]] name = "inout" version = "0.1.3" @@ -322,9 +328,9 @@ dependencies = [ [[package]] name = "io-reactor" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850495a01d6f0b6d29adf5849a75b5a82449d9181bdd642cd681ce3d6f14b58c" +checksum = "2457e8fb1b1f298809fcd93cd15d485f52ef565f7ad47970583c7a80ae6c7e78" dependencies = [ "amplify", "crossbeam-channel", @@ -344,9 +350,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "log" @@ -359,9 +365,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "log", @@ -408,9 +414,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -446,18 +452,18 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.32" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -494,9 +500,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -521,9 +527,9 @@ checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys", @@ -558,9 +564,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.28" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -569,15 +575,15 @@ dependencies = [ [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "universal-hash" @@ -591,9 +597,9 @@ dependencies = [ [[package]] name = "value-bag" -version = "1.4.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92ccd67fb88503048c01b59152a04effd0782d035a83a6d256ce6085f08f4a3" +checksum = "7cdbaf5e132e593e9fc1de6a15bbec912395b11fb9719e061cf64f804524c503" [[package]] name = "version_check" @@ -609,9 +615,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -619,24 +625,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -644,22 +650,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.28", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "windows-sys" @@ -672,9 +678,9 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1eeca1c172a285ee6c2c84c341ccea837e7c01b12fbb2d0fe3c9e550ce49ec8" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", @@ -687,48 +693,48 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10d0c968ba7f6166195e13d593af609ec2e3d24f916f081690695cf5eaffb2f" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "571d8d4e62f26d4932099a9efe89660e8bd5087775a2ab5cdd8b747b811f1058" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2229ad223e178db5fbbc8bd8d3835e51e566b8474bfca58d2e6150c48bb723cd" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600956e2d840c194eedfc5d18f8242bc2e17c7775b6684488af3a9fff6fe3287" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea99ff3f8b49fb7a8e0d305e5aec485bd068c2ba691b6e277d29eaeac945868a" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1a05a1ece9a7a0d5a7ccf30ba2c33e3a61a30e042ffd247567d1de1d94120d" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" -version = "0.48.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d419259aba16b663966e29e6d7c6ecfa0bb8425818bb96f6f1f3c3eb71a6e7b9" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "zeroize" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/Cargo.toml b/Cargo.toml index 3cae601..873741c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,18 +13,18 @@ license = "Apache-2.0" readme = "README.md" [dependencies] -amplify = "4.0.0" -io-reactor = { version = "0.2.0", optional = true } +amplify = "4.5.0" +io-reactor = { version = "0.3.0", optional = true } cyphernet = { version = "0.4.1", features = ["ed25519", "pem", "multibase", "noise_sha2", "noise_x25519", "noise-framework", "mixnets", "dns"] } -mio = { version = "0.8.6", optional = true } -socket2 = { version = "0.5.2", optional = true, features = ["all"] } -libc = "0.2.138" +mio = { version = "0.8.10", optional = true } +socket2 = { version = "0.5.5", optional = true, features = ["all"] } +libc = "0.2.152" log_crate = { package = "log", version = "0.4.17", optional = true } rand = "0.8.5" # Used in SplitIo shared secret [dev-dependencies] cyphernet = { version = "0.4.1", features = ["ed25519"] } -bitcoin_hashes = "0.12.0" +bitcoin_hashes = "0.13.0" log_crate = { package = "log", version = "0.4.17" } [features] diff --git a/src/resource.rs b/src/resource.rs index 9bbb126..7e7c2d4 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -41,7 +41,7 @@ use std::time::Duration; use std::{fmt, io, net}; use reactor::poller::IoType; -use reactor::{Io, Resource, WriteAtomic, WriteError}; +use reactor::{Io, Resource, ResourceId, WriteAtomic, WriteError}; use crate::{Direction, NetConnection, NetListener, NetSession, READ_BUFFER_SIZE}; @@ -151,11 +151,8 @@ impl, S: NetSession> NetAccept { impl, S: NetSession> Resource for NetAccept where S: Send { - type Id = net::SocketAddr; type Event = ListenerEvent; - fn id(&self) -> Self::Id { self.listener.local_addr() } - fn interests(&self) -> IoType { IoType::read_only() } fn handle_io(&mut self, io: Io) -> Option { @@ -172,7 +169,7 @@ where S: Send /// An event happening for a [`NetTransport`] network transport and delivered to /// a [`reactor::Handler`]. pub enum SessionEvent { - Established(S::Artifact), + Established(RawFd, S::Artifact), Data(Vec), Terminated(io::Error), } @@ -202,6 +199,14 @@ pub enum TransportState { Terminated, } +/// Error indicating that method [`NetTransport::set_resource_id`] was called more than once. +#[derive(Copy, Clone, Eq, PartialEq, Debug, Display, Error)] +#[display("an attempt to re-assign resource id to {new} for net transport {current}.")] +pub struct ResIdReassigned { + current: ResourceId, + new: ResourceId, +} + /// Net transport is an adaptor around specific [`NetSession`] (implementing /// session management, including optional handshake, encoding etc) to be used /// as a transport resource in a [`reactor::Reactor`]. @@ -298,6 +303,8 @@ impl NetTransport { }) } + pub fn display(&self) -> impl Display { self.session.display() } + pub fn state(&self) -> TransportState { self.state } pub fn is_active(&self) -> bool { self.state == TransportState::Active } @@ -345,7 +352,7 @@ impl NetTransport { .contains(&err.kind()) => { #[cfg(feature = "log")] - log::warn!(target: "transport", "Resource {} was not able to consume any data even though it has announced its write readiness", self.id()); + log::warn!(target: "transport", "Resource {} was not able to consume any data even though it has announced its write readiness", self.display()); self.write_intent = true; None } @@ -379,7 +386,7 @@ impl NetTransport { fn flush_buffer(&mut self) -> io::Result<()> { let orig_len = self.write_buffer.len(); #[cfg(feature = "log")] - log::trace!(target: "transport", "Resource {} is flushing its buffer of {orig_len} bytes", self.id()); + log::trace!(target: "transport", "Resource {} is flushing its buffer of {orig_len} bytes", self.display()); let len = self.session.write(self.write_buffer.make_contiguous()).or_else(|err| { match err.kind() { @@ -388,23 +395,23 @@ impl NetTransport { | io::ErrorKind::WriteZero | io::ErrorKind::Interrupted => { #[cfg(feature = "log")] - log::warn!(target: "transport", "Resource {} kernel buffer is fulled (system message is '{err}')", self.id()); + log::warn!(target: "transport", "Resource {} kernel buffer is fulled (system message is '{err}')", self.display()); Ok(0) }, _ => { #[cfg(feature = "log")] - log::error!(target: "transport", "Resource {} failed write operation with message '{err}'", self.id()); + log::error!(target: "transport", "Resource {} failed write operation with message '{err}'", self.display()); Err(err) }, } })?; if orig_len > len { #[cfg(feature = "log")] - log::debug!(target: "transport", "Resource {} was able to consume only a part of the buffered data ({len} of {orig_len} bytes)", self.id()); + log::debug!(target: "transport", "Resource {} was able to consume only a part of the buffered data ({len} of {orig_len} bytes)", self.display()); self.write_intent = true; } else { #[cfg(feature = "log")] - log::trace!(target: "transport", "Resource {} was able to consume all of the buffered data ({len} of {orig_len} bytes)", self.id()); + log::trace!(target: "transport", "Resource {} was able to consume all of the buffered data ({len} of {orig_len} bytes)", self.display()); self.write_intent = false; } self.write_buffer.drain(..len); @@ -413,12 +420,8 @@ impl NetTransport { } impl Resource for NetTransport { - // TODO: Use S::Artifact instead - type Id = RawFd; type Event = SessionEvent; - fn id(&self) -> Self::Id { self.session.as_connection().as_raw_fd() } - fn interests(&self) -> IoType { match self.state { TransportState::Init => IoType::write_only(), @@ -474,6 +477,7 @@ impl Resource for NetTransport { self.write_intent = true; self.state = TransportState::Active; Some(SessionEvent::Established( + self.as_raw_fd(), self.session.artifact().expect("session is established"), )) } else { diff --git a/src/tunnel.rs b/src/tunnel.rs index 3bace5a..bff8503 100644 --- a/src/tunnel.rs +++ b/src/tunnel.rs @@ -73,8 +73,8 @@ impl Tunnel { let int_fd = stream.as_raw_fd(); let ext_fd = self.session.as_connection().as_raw_fd(); - poller.register(&int_fd, IoType::read_only()); - poller.register(&ext_fd, IoType::read_only()); + let int_id = poller.register(&int_fd, IoType::read_only()); + let ext_id = poller.register(&ext_fd, IoType::read_only()); let mut in_buf = VecDeque::::new(); let mut out_buf = VecDeque::::new(); @@ -116,7 +116,7 @@ impl Tunnel { log::warn!(target: "tunnel", "Tunnel {listener_addr} timed out with client {socket_addr}"); return Err(io::ErrorKind::TimedOut.into()); } - while let Some((fd, res)) = poller.next() { + while let Some((id, res)) = poller.next() { let ev = match res { Ok(ev) => ev, Err(IoFail::Connectivity(code)) => { @@ -130,7 +130,7 @@ impl Tunnel { return Err(io::ErrorKind::BrokenPipe.into()); } }; - if fd == int_fd { + if id == int_id { if ev.write { #[cfg(feature = "log")] log::trace!(target: "tunnel", "attempting to write {} bytes received from the remote {socket_addr}", in_buf.len()); @@ -140,7 +140,7 @@ impl Tunnel { in_buf.drain(..written); in_count += written; if in_buf.is_empty() { - poller.set_interest(&int_fd, IoType::read_only()); + poller.set_interest(int_id, IoType::read_only()); } #[cfg(feature = "log")] log::trace!(target: "tunnel", "{socket_addr} received {written} bytes from local out of {} buffered", in_buf.len()); @@ -152,12 +152,12 @@ impl Tunnel { handle!(stream.read(&mut buf), |read| { out_buf.extend(&buf[..read]); - poller.set_interest(&ext_fd, IoType::read_write()); + poller.set_interest(ext_id, IoType::read_write()); #[cfg(feature = "log")] log::trace!(target: "tunnel", "{socket_addr} read {read} bytes from local ({} total in the buffer)", out_buf.len()); }); } - } else if fd == ext_fd { + } else if id == ext_id { if ev.write { #[cfg(feature = "log")] log::trace!(target: "tunnel", "attempting to write {} bytes received from {socket_addr} to remote", out_buf.len()); @@ -167,7 +167,7 @@ impl Tunnel { out_buf.drain(..written); out_count += written; if out_buf.is_empty() { - poller.set_interest(&ext_fd, IoType::read_only()); + poller.set_interest(ext_id, IoType::read_only()); } #[cfg(feature = "log")] log::trace!(target: "tunnel", "{socket_addr} sent {written} bytes to remote out of {} buffered", out_buf.len()); @@ -179,7 +179,7 @@ impl Tunnel { handle!(self.session.read(&mut buf), |read| { in_buf.extend(&buf[..read]); - poller.set_interest(&int_fd, IoType::read_write()); + poller.set_interest(int_id, IoType::read_write()); #[cfg(feature = "log")] log::trace!(target: "tunnel", "{socket_addr} read {read} bytes from remote ({} total in the buffer)", in_buf.len()); });