From f9b3170f0ec4ad390285c8c77b31782c0cac226a Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Wed, 28 Feb 2024 10:44:18 +0100 Subject: [PATCH] Allow network adapters to be named This will be necessary in the future to support multiple network adapters in a single system. --- src/lib/error.rs | 11 +++++++++++ src/smolnetd/main.rs | 45 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/lib/error.rs b/src/lib/error.rs index 5ab5ba3071..0c5191e146 100644 --- a/src/lib/error.rs +++ b/src/lib/error.rs @@ -7,6 +7,7 @@ use syscall::error::Error as SyscallError; enum ErrorType { Syscall(SyscallError), IOError(IOError), + Other, } pub struct Error { @@ -28,6 +29,13 @@ impl Error { descr: descr.into(), } } + + pub fn other_error>(descr: S) -> Error { + Error { + error_type: ErrorType::Other, + descr: descr.into() + } + } } impl fmt::Display for Error { @@ -39,6 +47,9 @@ impl fmt::Display for Error { ErrorType::IOError(ref io_error) => { write!(f, "{} : io error : {}", self.descr, io_error) } + ErrorType::Other => { + write!(f, "{}", self.descr) + } } } } diff --git a/src/smolnetd/main.rs b/src/smolnetd/main.rs index 36a34dffbd..d750abbbc1 100644 --- a/src/smolnetd/main.rs +++ b/src/smolnetd/main.rs @@ -18,6 +18,7 @@ use redox_netstack::error::{Error, Result}; use redox_netstack::logger; use scheme::Smolnetd; use smoltcp::wire::EthernetAddress; +use syscall::flag::*; mod buffer_pool; mod link; @@ -25,15 +26,47 @@ mod port_set; mod router; mod scheme; -fn run(daemon: redox_daemon::Daemon) -> Result<()> { - use syscall::flag::*; +fn get_network_adapter() -> Result { + use std::fs; - trace!("opening network:"); - let network_fd = syscall::open("network:", O_RDWR | O_NONBLOCK) - .map_err(|e| Error::from_syscall_error(e, "failed to open network:"))? + let mut adapters = vec![]; + + for entry_res in fs::read_dir("/scheme")? { + let Ok(entry) = entry_res else { + continue; + }; + + let Ok(scheme) = entry.file_name().into_string() else { + continue; + }; + + if !scheme.starts_with("network") { + continue; + } + + adapters.push(scheme); + } + + if adapters.is_empty() { + Err(Error::other_error("no network adapter found")) + } else { + let adapter = adapters.remove(0); + if !adapters.is_empty() { + // FIXME allow using multiple network adapters at the same time + warn!("Multiple network adapters found. Only {adapter} will be used"); + } + Ok(adapter) + } +} + +fn run(daemon: redox_daemon::Daemon) -> Result<()> { + let adapter = get_network_adapter()?; + trace!("opening {adapter}:"); + let network_fd = syscall::open(format!("{adapter}:"), O_RDWR | O_NONBLOCK) + .map_err(|e| Error::from_syscall_error(e, format!("failed to open {adapter}:")))? as RawFd; - let hardware_addr = std::fs::read("network:mac") + let hardware_addr = std::fs::read(format!("{adapter}:mac")) .map(|mac_address| EthernetAddress::from_bytes(&mac_address)) .expect("failed to get mac address from network adapter");