diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index c81a439f30..3de32bb292 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -1,5 +1,5 @@ use alloc::{borrow::Cow, string::ToString, vec::Vec}; -use core::{cmp, mem, ptr, slice, str}; +use core::{cmp, fmt::Write, mem, ptr, slice, str}; use redox_path::RedoxStr; use redox_protocols::protocol::{FsCall, O_CLOEXEC, SocketCall}; use redox_rt::proc::FdGuard; @@ -20,7 +20,7 @@ use crate::{ EAFNOSUPPORT, EDOM, EFAULT, EINVAL, EMSGSIZE, ENOMEM, ENOSYS, ENOTSOCK, EOPNOTSUPP, EPROTONOSUPPORT, }, - netinet_in::{in_addr, in_port_t, sockaddr_in}, + netinet_in::{in_addr, in6_addr, in_port_t, sockaddr_in, sockaddr_in6}, string::strnlen, sys_select::timeval, sys_socket::{ @@ -67,6 +67,35 @@ unsafe fn bind_or_connect( _ => unreachable!(), } } + AF_INET6 => { + if (address_len as usize) != mem::size_of::() { + return Err(Errno(EINVAL)); + } + + let data = unsafe { &*address.cast::() }; + let addr = unsafe { &data.sin6_addr.s6_addr }; + let port = in_port_t::from_be(data.sin6_port); + let scope = data.sin6_scope_id; + + let mut hex = String::with_capacity(8 * 4 + 7); + for i in 0..8 { + if i > 0 { + hex.push(':'); + } + let _ = write!(hex, "{:x}{:x}", addr[i * 2], addr[i * 2 + 1]); + } + let normalized = if scope == 0 { + format!("[{}]", hex) + } else { + format!("[{}%{}]", hex, scope) + }; + + match op { + SocketCall::Bind => format!("/{}:{}", normalized, port), + SocketCall::Connect => format!("{}:{}", normalized, port), + _ => unreachable!(), + } + } AF_UNIX => { log::warn!("bind/connect with AF_UNIX were replaced with SYS_CALL."); return Err(Errno(EAFNOSUPPORT)); @@ -1118,6 +1147,8 @@ impl PalSocket for Sys { Ok(match (domain, kind) { (AF_INET, SOCK_STREAM) => redox_rt::sys::open("/scheme/tcp", flags)? as c_int, (AF_INET, SOCK_DGRAM) => redox_rt::sys::open("/scheme/udp", flags)? as c_int, + (AF_INET6, SOCK_STREAM) => redox_rt::sys::open("/scheme/tcp", flags)? as c_int, + (AF_INET6, SOCK_DGRAM) => redox_rt::sys::open("/scheme/udp", flags)? as c_int, (AF_UNIX, SOCK_STREAM) => { redox_rt::sys::open("/scheme/uds_stream", flags | O_CREAT)? as c_int }