Fix network problem with netdb on redox
This commit is contained in:
+23
-20
@@ -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);
|
||||
|
||||
@@ -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()));
|
||||
|
||||
Reference in New Issue
Block a user