diff --git a/src/header/netdb/mod.rs b/src/header/netdb/mod.rs index 53cb5b37e9..b39a9f9221 100644 --- a/src/header/netdb/mod.rs +++ b/src/header/netdb/mod.rs @@ -3,7 +3,7 @@ mod dns; use core::str::FromStr; -use core::{mem, ptr, str}; +use core::{mem, ptr, slice, str}; use alloc::boxed::Box; use alloc::str::SplitWhitespace; @@ -1000,27 +1000,35 @@ pub unsafe extern "C" fn getaddrinfo( res: *mut *mut addrinfo, ) -> c_int { //TODO: getaddrinfo - let node_c = if node.is_null() { + let node_opt = if node.is_null() { None } else { Some(CStr::from_ptr(node)) }; - let service_c = if service.is_null() { + + let service_opt = if service.is_null() { None } else { Some(CStr::from_ptr(service)) }; + let hints_opt = if hints.is_null() { + None + } else { + Some(&*hints) + }; + eprintln!( "getaddrinfo({:?}, {:?})", - node_c.map(|c| str::from_utf8_unchecked(c.to_bytes())), - service_c.map(|c| str::from_utf8_unchecked(c.to_bytes())) + node_opt.map(|c| str::from_utf8_unchecked(c.to_bytes())), + service_opt.map(|c| str::from_utf8_unchecked(c.to_bytes())) ); platform::errno = ENOSYS; EAI_SYSTEM } +#[no_mangle] pub unsafe extern "C" fn getnameinfo( addr: *const sockaddr, addrlen: socklen_t, @@ -1030,12 +1038,38 @@ pub unsafe extern "C" fn getnameinfo( servlen: socklen_t, flags: c_int, ) -> c_int { - unimplemented!(); + if addrlen as usize != mem::size_of::() { + return EAI_FAMILY; + } + + let addr = &*(addr as *const sockaddr_in); + + let host_opt = if host.is_null() { + None + } else { + Some(slice::from_raw_parts_mut(host, hostlen as usize)) + }; + + let serv_opt = if serv.is_null() { + None + } else { + Some(slice::from_raw_parts_mut(serv, servlen as usize)) + }; + + eprintln!("getnameinfo({:p}, {}, {:#x})", addr, addrlen, flags); + + platform::errno = ENOSYS; + EAI_SYSTEM } #[no_mangle] -pub extern "C" fn freeaddrinfo(res: *mut addrinfo) { - +pub unsafe extern "C" fn freeaddrinfo(res: *mut addrinfo) { + let mut ai = res; + while !ai.is_null() { + let bai = Box::from_raw(ai); + ai = (*ai).ai_next; + drop(bai); + } } #[no_mangle]