MCPcopy Index your code
hub / github.com/RustPython/RustPython / get_addr

Function get_addr

crates/stdlib/src/socket.rs:3198–3259  ·  view source on GitHub ↗
(
        vm: &VirtualMachine,
        pyname: PyUtf8StrRef,
        af: i32,
    )

Source from the content-addressed store, hash-verified

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"))?;

Callers 4

extract_addressMethod · 0.85
gethostbyaddrFunction · 0.85
gethostbynameFunction · 0.85
gethostbyname_exFunction · 0.85

Calls 15

convert_socket_errorFunction · 0.85
newFunction · 0.85
new_os_errorMethod · 0.80
encode_textMethod · 0.80
into_wtf8Method · 0.80
getaddrinfoFunction · 0.70
SomeClass · 0.50
ErrClass · 0.50
as_strMethod · 0.45
is_emptyMethod · 0.45
unwrapMethod · 0.45
nextMethod · 0.45

Tested by

no test coverage detected