diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-05 00:35:09 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-05 00:35:09 +0100 |
commit | 7c7955cb5dbd2a403e31906242e20e038dd4206a (patch) | |
tree | afc1e04e02485406dcd8f09ee5b5191b4d613aa2 /src | |
parent | 58489789baf2b3a2319333c80433accb6b5aaac0 (diff) |
actually bind to the interfaces
this server is now truly multi-interface
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 15 | ||||
-rw-r--r-- | src/util.rs | 17 |
2 files changed, 20 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs index 18e88e2..082a5f2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -62,24 +62,29 @@ fn run(link: String, subnet_id: u8) -> Result<()> { let sock = Socket::new(Domain::IPV4, Type::DGRAM, None)?; - let address = SocketAddr::from_str("0.0.0.0:67")?; - sock.bind(&address.into())?; - sock.set_broadcast(true)?; sock.set_reuse_port(true)?; + sock.set_reuse_address(true)?; // Bind socket to interface. unsafe { - let link_index = libc::if_nametoindex(CString::new(link.clone())?.into_raw()); + let link_index = CString::new(link.clone())?.into_raw(); setsockopt( sock.as_raw_fd(), - libc::IPPROTO_IP, + libc::SOL_SOCKET, libc::SO_BINDTODEVICE, link_index, + link.len() as i32, )?; + + // Prevent memory leak. + let _ = CString::from_raw(link_index); } + let address = SocketAddr::from_str("0.0.0.0:67")?; + sock.bind(&address.into())?; + loop { let mut buf = [MaybeUninit::new(0); 1024]; let (n, remote) = sock.recv_from(&mut buf)?; diff --git a/src/util.rs b/src/util.rs index 7fa8f5e..d131753 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,10 +1,8 @@ use crate::error::{Error, Result}; -use std::ffi::c_int; +use std::ffi::{c_char, c_int}; use std::io; -use std::mem; use std::net::Ipv4Addr; -use std::ptr; /// Helper macro to execute a system call that returns an `io::Result`. macro_rules! syscall { @@ -35,14 +33,19 @@ pub fn local_ip(link: &str) -> Result<Ipv4Addr> { } #[allow(clippy::missing_safety_doc)] -pub unsafe fn setsockopt<T>(fd: c_int, opt: c_int, val: c_int, payload: T) -> io::Result<()> { - let payload = ptr::addr_of!(payload).cast(); +pub unsafe fn setsockopt( + fd: c_int, + opt: c_int, + val: c_int, + payload: *const c_char, + optlen: c_int, +) -> io::Result<()> { syscall!(setsockopt( fd, opt, val, - payload, - mem::size_of::<T>() as libc::socklen_t + payload.cast(), + optlen as libc::socklen_t )) .map(|_| ()) } |