diff --git a/src/header/netdb/mod.rs b/src/header/netdb/mod.rs index f8feb4eba53686d87678590e5f9b8352a6f13726..e099d15e349c396e74f8af91a7db10cbde2961a4 100644 --- a/src/header/netdb/mod.rs +++ b/src/header/netdb/mod.rs @@ -204,23 +204,25 @@ fn lookup_host(host: &str) -> Result<LookupHost, c_int> { let packet_data_box = packet_data.into_boxed_slice(); let packet_data_ptr = Box::into_raw(packet_data_box) as *mut _ as *mut c_void; - let sock = unsafe { sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32) }; - - let mut dest = sockaddr_in { + let dest = sockaddr_in { sin_family: AF_INET as u16, sin_port: htons(53), sin_addr: in_addr { s_addr: dns_addr }, ..Default::default() }; + let dest_ptr = &dest as *const _ as *const sockaddr; - let dest_ptr = &mut dest as *mut _ as *mut sockaddr; - - unsafe { - if sys_socket::sendto(sock, packet_data_ptr, packet_data_len, 0, dest_ptr, 16) < 0 { + let sock = unsafe { + let sock = sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32); + if sys_socket::connect(sock, dest_ptr, mem::size_of_val(&dest) as socklen_t) < 0 { + return Err(EIO); + } + if sys_socket::send(sock, packet_data_ptr, packet_data_len, 0) < 0 { Box::from_raw(packet_data_ptr); return Err(EIO); } - } + sock + }; unsafe { Box::from_raw(packet_data_ptr); @@ -232,12 +234,8 @@ fn lookup_host(host: &str) -> Result<LookupHost, c_int> { let mut count = -1; - let mut from: sockaddr = Default::default(); - let from_ptr = &mut from as *mut sockaddr; - unsafe { - count = - sys_socket::recvfrom(sock, buf_ptr, 65536, 0, from_ptr, &mut i as *mut socklen_t); + count = sys_socket::recv(sock, buf_ptr, 65536, 0); } if count < 0 { return Err(EIO); @@ -321,9 +319,7 @@ fn lookup_addr(addr: in_addr) -> Result<Vec<Vec<u8>>, c_int> { let packet_data_box = packet_data.into_boxed_slice(); let packet_data_ptr = Box::into_raw(packet_data_box) as *mut _ as *mut c_void; - let sock = unsafe { sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32) }; - - let mut dest = sockaddr_in { + let dest = sockaddr_in { sin_family: AF_INET as u16, sin_port: htons(53), sin_addr: in_addr { @@ -332,10 +328,18 @@ fn lookup_addr(addr: in_addr) -> Result<Vec<Vec<u8>>, c_int> { ..Default::default() }; - let dest_ptr = &mut dest as *mut _ as *mut sockaddr; + let dest_ptr = &dest as *const _ as *const sockaddr; + + let sock = unsafe { + let sock = sys_socket::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP as i32); + if sys_socket::connect(sock, dest_ptr, mem::size_of_val(&dest) as socklen_t) < 0 { + return Err(EIO); + } + sock + }; unsafe { - if sys_socket::sendto(sock, packet_data_ptr, packet_data_len, 0, dest_ptr, 16) < 0 { + if sys_socket::send(sock, packet_data_ptr, packet_data_len, 0) < 0 { return Err(EIO); } } @@ -351,8 +355,7 @@ fn lookup_addr(addr: in_addr) -> Result<Vec<Vec<u8>>, c_int> { let mut count = -1; unsafe { - count = - sys_socket::recvfrom(sock, buf_ptr, 65536, 0, dest_ptr, &mut i as *mut socklen_t); + count = sys_socket::recv(sock, buf_ptr, 65536, 0); } if count < 0 { return Err(EIO); diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index 98b640f465943286c0e1bcc87e9cdfd25f1ee4ca..d63ab64462c4e85fa1d24d3fae15981b05f686be 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -36,16 +36,12 @@ macro_rules! bind_or_connect { return -1; } let data = &*($address as *const sockaddr_in); - let addr = data.sin_addr.s_addr; - let port = in_port_t::from_be(data.sin_port); - let path = format!( - bind_or_connect!($mode "{}.{}.{}.{}:{}"), - addr >> 8 * 3, - addr >> 8 * 2 & 0xFF, - addr >> 8 & 0xFF, - addr & 0xFF, - port + let addr = slice::from_raw_parts( + &data.sin_addr.s_addr as *const _ as *const u8, + mem::size_of_val(&data.sin_addr.s_addr) ); + let port = in_port_t::from_be(data.sin_port); + let path = format!(bind_or_connect!($mode "{}.{}.{}.{}:{}"), addr[0], addr[1], addr[2], addr[3], port); // Duplicate the socket, and then duplicate the copy back to the original fd let fd = e(syscall::dup($socket as usize, path.as_bytes()));