pub fn loopback_up_after_newnet() -> std::io::Result<()> {
unsafe {
let fd = libc::socket(libc::AF_INET, libc::SOCK_DGRAM, 0);
if fd < 0 {
return Err(std::io::Error::last_os_error());
}
let mut ifr: libc::ifreq = std::mem::zeroed();
let name = b"lo\0";
std::ptr::copy_nonoverlapping(
name.as_ptr().cast(),
ifr.ifr_name.as_mut_ptr(),
std::cmp::min(name.len(), ifr.ifr_name.len()),
);
if libc::ioctl(
fd,
libc::SIOCGIFFLAGS as libc::c_ulong,
&mut ifr as *mut libc::ifreq,
) < 0
{
let e = std::io::Error::last_os_error();
libc::close(fd);
return Err(e);
}
let flags = ifr.ifr_ifru.ifru_flags as libc::c_int;
ifr.ifr_ifru.ifru_flags = (flags | libc::IFF_UP | libc::IFF_LOOPBACK) as libc::c_short;
if libc::ioctl(
fd,
libc::SIOCSIFFLAGS as libc::c_ulong,
&mut ifr as *mut libc::ifreq,
) < 0
{
let e = std::io::Error::last_os_error();
libc::close(fd);
return Err(e);
}
libc::close(fd);
Ok(())
}
}