Fix network problem with netdb on redox

This commit is contained in:
jD91mZM2
2018-09-18 19:14:28 +02:00
parent 043ecf2cf9
commit 2aa7597a2b
2 changed files with 28 additions and 29 deletions
+23 -20
View File
@@ -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);
+5 -9
View File
@@ -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()));