Kaynağa Gözat

Begin work on getnameinfo

Jeremy Soller 6 yıl önce
ebeveyn
işleme
8dabff129a
1 değiştirilmiş dosya ile 42 ekleme ve 8 silme
  1. 42 8
      src/header/netdb/mod.rs

+ 42 - 8
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::<sockaddr_in>() {
+        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]