aboutsummaryrefslogtreecommitdiffstats
path: root/src/platform/linux/udp.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/linux/udp.rs')
-rw-r--r--src/platform/linux/udp.rs76
1 files changed, 66 insertions, 10 deletions
diff --git a/src/platform/linux/udp.rs b/src/platform/linux/udp.rs
index 52e4c45..d3d61b6 100644
--- a/src/platform/linux/udp.rs
+++ b/src/platform/linux/udp.rs
@@ -1,26 +1,82 @@
use super::super::bind::*;
use super::super::Endpoint;
-use std::net::SocketAddr;
+use std::io;
+use std::net::{SocketAddr, UdpSocket};
+use std::sync::Arc;
-pub struct LinuxEndpoint {}
+#[derive(Clone)]
+pub struct LinuxBind(Arc<UdpSocket>);
-pub struct LinuxBind {}
+pub struct LinuxOwner(Arc<UdpSocket>);
-impl Endpoint for LinuxEndpoint {
+impl Endpoint for SocketAddr {
fn clear_src(&mut self) {}
fn from_address(addr: SocketAddr) -> Self {
- LinuxEndpoint {}
+ addr
}
fn into_address(&self) -> SocketAddr {
- "127.0.0.1:6060".parse().unwrap()
+ *self
}
}
-/*
-impl Bind for PlatformBind {
- type Endpoint = PlatformEndpoint;
+impl Reader<SocketAddr> for LinuxBind {
+ type Error = io::Error;
+
+ fn read(&self, buf: &mut [u8]) -> Result<(usize, SocketAddr), Self::Error> {
+ self.0.recv_from(buf)
+ }
+}
+
+impl Writer<SocketAddr> for LinuxBind {
+ type Error = io::Error;
+
+ fn write(&self, buf: &[u8], dst: &SocketAddr) -> Result<(), Self::Error> {
+ self.0.send_to(buf, dst)?;
+ Ok(())
+ }
+}
+
+impl Owner for LinuxOwner {
+ type Error = io::Error;
+
+ fn get_port(&self) -> u16 {
+ 1337
+ }
+
+ fn get_fwmark(&self) -> Option<u32> {
+ None
+ }
+
+ fn set_fwmark(&mut self, value: Option<u32>) -> Option<Self::Error> {
+ None
+ }
+}
+
+impl Drop for LinuxOwner {
+ fn drop(&mut self) {}
+}
+
+impl Bind for LinuxBind {
+ type Error = io::Error;
+ type Endpoint = SocketAddr;
+ type Reader = LinuxBind;
+ type Writer = LinuxBind;
+}
+
+impl PlatformBind for LinuxBind {
+ type Owner = LinuxOwner;
+
+ fn bind(port: u16) -> Result<(Vec<Self::Reader>, Self::Writer, Self::Owner), Self::Error> {
+ let socket = UdpSocket::bind(format!("0.0.0.0:{}", port))?;
+ let socket = Arc::new(socket);
+
+ Ok((
+ vec![LinuxBind(socket.clone())],
+ LinuxBind(socket.clone()),
+ LinuxOwner(socket),
+ ))
+ }
}
-*/