def getnameinfo(self, ip_port, flags, callback): if not callable(callback): raise AresError("a callable is required") ip, port = ip_port if port < 0 or port > 65535: raise ValueError("port must be between 0 and 65535") sa4 = _ffi.new("struct sockaddr_in*") sa6 = _ffi.new("struct sockaddr_in6*") if 1 == _lib.ares_inet_pton(socket.AF_INET, s2b(ip), _ffi.addressof(sa4.sin_addr)): sa4.sin_family = socket.AF_INET sa4.sin_port = socket.htons(port) sa = sa4 elif 1 == _lib.ares_inet_pton(socket.AF_INET6, s2b(ip), _ffi.addressof(sa6.sin6_addr)): sa6.sin6_family = socket.AF_INET6 sa6.sin6_port = socket.htons(port) sa = sa6 else: raise ValueError("invalid IP address") userdata = _ffi.new_handle(callback) _global_set.add(userdata) _lib.ares_getnameinfo(self.channel, _ffi.cast("struct sockaddr*", sa), _ffi.sizeof(sa[0]), flags, _nameinfo_cb, userdata)
def __init__(self, ares_addrttl): buf = _ffi.new("char[]", _lib.INET6_ADDRSTRLEN) if _ffi.typeof(ares_addrttl) is _ffi.typeof("struct ares_addrttl"): _lib.ares_inet_ntop(socket.AF_INET, _ffi.addressof(ares_addrttl.ipaddr), buf, _lib.INET6_ADDRSTRLEN) elif _ffi.typeof(ares_addrttl) is _ffi.typeof("struct ares_addr6ttl"): _lib.ares_inet_ntop(socket.AF_INET6, _ffi.addressof(ares_addrttl.ip6addr), buf, _lib.INET6_ADDRSTRLEN) else: raise TypeError() self.host = _ffi_string(buf, _lib.INET6_ADDRSTRLEN) self.ttl = ares_addrttl.ttl
def _set_servers(self, servers): c = _ffi.new("struct ares_addr_node[%d]" % len(servers)) for i in range(len(servers)): if 1 == _lib.ares_inet_pton(socket.AF_INET, s2b(servers[i]), _ffi.addressof(c[i].addr.addr4)): c[i].family = socket.AF_INET elif 1 == _lib.ares_inet_pton(socket.AF_INET6, s2b(servers[i]), _ffi.addressof(c[i].addr.addr6)): c[i].family = socket.AF_INET6 else: raise ValueError("invalid IP address") if i > 0: c[i - 1].next = _ffi.addressof(c[i]) r = _lib.ares_set_servers(self.channel, c) if r != _lib.ARES_SUCCESS: raise AresError()
def _get_servers(self): servers = _ffi.new("struct ares_addr_node **") r = _lib.ares_get_servers(self.channel, servers) if r != ARES_SUCCESS: raise AresError(errno.strerror(r)) server_list = [] server = _ffi.new("struct ares_addr_node **", servers[0]) while True: if server == _ffi.NULL: break ip = _ffi.new("char []", _lib.INET6_ADDRSTRLEN) if _ffi.NULL != _lib.ares_inet_ntop(server.family, _ffi.addressof(server.addr), ip, _lib.INET6_ADDRSTRLEN): server_list.append(_ffi_string(ip, _lib.INET6_ADDRSTRLEN)) server = server.next return server_list