(
address: PyTupleRef,
flags: i32,
vm: &VirtualMachine,
)
| 3011 | |
| 3012 | #[pyfunction] |
| 3013 | fn getnameinfo( |
| 3014 | address: PyTupleRef, |
| 3015 | flags: i32, |
| 3016 | vm: &VirtualMachine, |
| 3017 | ) -> Result<(String, String), IoOrPyException> { |
| 3018 | match address.len() { |
| 3019 | 2..=4 => {} |
| 3020 | _ => { |
| 3021 | return Err(vm.new_type_error("illegal sockaddr argument").into()); |
| 3022 | } |
| 3023 | } |
| 3024 | let (addr, flowinfo, scopeid) = Address::from_tuple_ipv6(&address, vm)?; |
| 3025 | let hints = dns_lookup::AddrInfoHints { |
| 3026 | address: c::AF_UNSPEC, |
| 3027 | socktype: c::SOCK_DGRAM, |
| 3028 | flags: c::AI_NUMERICHOST, |
| 3029 | protocol: 0, |
| 3030 | }; |
| 3031 | let service = addr.port.to_string(); |
| 3032 | let host_str = addr.host.as_str(); |
| 3033 | let mut res = dns_lookup::getaddrinfo(Some(host_str), Some(&service), Some(hints)) |
| 3034 | .map_err(|e| convert_socket_error(vm, e, SocketError::GaiError))? |
| 3035 | .filter_map(Result::ok); |
| 3036 | let mut ainfo = res.next().unwrap(); |
| 3037 | if res.next().is_some() { |
| 3038 | return Err(vm |
| 3039 | .new_os_error("sockaddr resolved to multiple addresses".to_owned()) |
| 3040 | .into()); |
| 3041 | } |
| 3042 | match &mut ainfo.sockaddr { |
| 3043 | SocketAddr::V4(_) => { |
| 3044 | if address.len() != 2 { |
| 3045 | return Err(vm |
| 3046 | .new_os_error("IPv4 sockaddr must be 2 tuple".to_owned()) |
| 3047 | .into()); |
| 3048 | } |
| 3049 | } |
| 3050 | SocketAddr::V6(addr) => { |
| 3051 | addr.set_flowinfo(flowinfo); |
| 3052 | addr.set_scope_id(scopeid); |
| 3053 | } |
| 3054 | } |
| 3055 | dns_lookup::getnameinfo(&ainfo.sockaddr, flags) |
| 3056 | .map_err(|e| convert_socket_error(vm, e, SocketError::GaiError)) |
| 3057 | } |
| 3058 | |
| 3059 | #[cfg(unix)] |
| 3060 | #[pyfunction] |
no test coverage detected