(
vm: &VirtualMachine,
pyname: PyUtf8StrRef,
af: i32,
)
| 3196 | } |
| 3197 | |
| 3198 | fn get_addr( |
| 3199 | vm: &VirtualMachine, |
| 3200 | pyname: PyUtf8StrRef, |
| 3201 | af: i32, |
| 3202 | ) -> Result<SocketAddr, IoOrPyException> { |
| 3203 | let name = pyname.as_str(); |
| 3204 | if name.is_empty() { |
| 3205 | let hints = dns_lookup::AddrInfoHints { |
| 3206 | address: af, |
| 3207 | socktype: c::SOCK_DGRAM, |
| 3208 | flags: c::AI_PASSIVE, |
| 3209 | protocol: 0, |
| 3210 | }; |
| 3211 | let mut res = dns_lookup::getaddrinfo(None, Some("0"), Some(hints)) |
| 3212 | .map_err(|e| convert_socket_error(vm, e, SocketError::GaiError))?; |
| 3213 | let ainfo = res.next().unwrap()?; |
| 3214 | if res.next().is_some() { |
| 3215 | return Err(vm |
| 3216 | .new_os_error("wildcard resolved to multiple address".to_owned()) |
| 3217 | .into()); |
| 3218 | } |
| 3219 | return Ok(ainfo.sockaddr); |
| 3220 | } |
| 3221 | if name == "255.255.255.255" || name == "<broadcast>" { |
| 3222 | match af { |
| 3223 | c::AF_INET | c::AF_UNSPEC => {} |
| 3224 | _ => { |
| 3225 | return Err(vm |
| 3226 | .new_os_error("address family mismatched".to_owned()) |
| 3227 | .into()); |
| 3228 | } |
| 3229 | } |
| 3230 | return Ok(SocketAddr::V4(net::SocketAddrV4::new( |
| 3231 | c::INADDR_BROADCAST.into(), |
| 3232 | 0, |
| 3233 | ))); |
| 3234 | } |
| 3235 | if let c::AF_INET | c::AF_UNSPEC = af |
| 3236 | && let Ok(addr) = name.parse::<Ipv4Addr>() |
| 3237 | { |
| 3238 | return Ok(SocketAddr::V4(net::SocketAddrV4::new(addr, 0))); |
| 3239 | } |
| 3240 | if matches!(af, c::AF_INET | c::AF_UNSPEC) |
| 3241 | && !name.contains('%') |
| 3242 | && let Ok(addr) = name.parse::<Ipv6Addr>() |
| 3243 | { |
| 3244 | return Ok(SocketAddr::V6(net::SocketAddrV6::new(addr, 0, 0, 0))); |
| 3245 | } |
| 3246 | let hints = dns_lookup::AddrInfoHints { |
| 3247 | address: af, |
| 3248 | ..Default::default() |
| 3249 | }; |
| 3250 | let name = vm |
| 3251 | .state |
| 3252 | .codec_registry |
| 3253 | .encode_text(pyname.into_wtf8(), "idna", None, vm)?; |
| 3254 | let name = core::str::from_utf8(name.as_bytes()) |
| 3255 | .map_err(|_| vm.new_runtime_error("idna output is not utf8"))?; |
no test coverage detected