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 gethostbyname(self, name, family, callback): if not callable(callback): raise TypeError("a callable is required") userdata = _ffi.new_handle(callback) _global_set.add(userdata) _lib.ares_gethostbyname(self.channel, s2b(name), family, _host_cb, userdata)
def query(self, name, query_type, callback): if not callable(callback): raise TypeError("a callable is required") if query_type not in (_lib.T_A, _lib.T_AAAA, _lib.T_CNAME, _lib.T_MX, _lib.T_NAPTR, _lib.T_NS, _lib.T_PTR, _lib.T_SOA, _lib.T_SRV, _lib.T_TXT): raise ValueError("invalid query type specified") userdata = _ffi.new_handle((callback, query_type)) _global_set.add(userdata) _lib.ares_query(self.channel, s2b(name), _lib.C_IN, query_type, _query_cb, userdata)
def gethostbyaddr(self, name, callback): if not callable(callback): raise TypeError("a callable is required") addr4 = _ffi.new("struct in_addr*") addr6 = _ffi.new("struct ares_in6_addr*") if 1 == _lib.ares_inet_pton(socket.AF_INET,s2b(name), (addr4)): address = addr4 family = socket.AF_INET elif 1 == _lib.ares_inet_pton(socket.AF_INET6, s2b(name), (addr6)): address = addr6 family = socket.AF_INET6 else: raise ValueError("invalid IP address") userdata = _ffi.new_handle(callback) _global_set.add(userdata) _lib.ares_gethostbyaddr(self.channel, (address), _ffi.sizeof(address[0]), family, _host_cb, userdata)
def __init__(self, flags = -1, timeout = -1.0, tries = -1, ndots = -1, tcp_port = -1, udp_port = -1, servers = None, domains = None, lookups = None, sock_state_cb = None, socket_send_buffer_size = -1, socket_receive_buffer_size = -1, rotate = False): channel = _ffi.new("ares_channel *") options = _ffi.new("struct ares_options *") optmask = 0 if flags != -1: options.flags = flags optmask = optmask | _lib.ARES_OPT_FLAGS if timeout != -1: options.timeout = int(timeout * 1000) optmask = optmask | _lib.ARES_OPT_TIMEOUTMS if tries != -1: options.tries = tries optmask = optmask | _lib.ARES_OPT_TRIES if ndots != -1: options.ndots = ndots optmask = optmask | _lib.ARES_OPT_NDOTS if tcp_port != -1: options.tcp_port = tcp_port optmask = optmask | _lib.ARES_OPT_TCP_PORT if udp_port != -1: options.udp_port = udp_port optmask = optmask | _lib.ARES_OPT_UDP_PORT if socket_send_buffer_size != -1: options.socket_send_buffer_size = socket_send_buffer_size optmask = optmask | _lib.ARES_OPT_SOCK_SNDBUF if socket_receive_buffer_size != -1: options.socket_receive_buffer_size = socket_receive_buffer_size optmask = optmask | _lib.ARES_OPT_SOCK_RCVBUF if sock_state_cb: if not callable(sock_state_cb): raise AresError("sock_state_cb is not callable") userdata = _ffi.new_handle(sock_state_cb) _global_set.add(userdata) # must keep this alive! options.sock_state_cb = _sock_state_cb options.sock_state_cb_data = userdata optmask = optmask | _lib.ARES_OPT_SOCK_STATE_CB if lookups: options.lookups = lookups optmask = optmask | _lib.ARES_OPT_LOOKUPS if domains: strs = [_ffi.new("char[]", s2b(i)) for i in domains] c = _ffi.new("char *[%d]" % (len(domains) + 1)) for i in range(len(domains)): c[i] = strs[i] options.domains = c options.ndomains = len(domains) optmask = optmask | _lib.ARES_OPT_DOMAINS if rotate == True: optmask = optmask | _lib.ARES_OPT_ROTATE r = _lib.ares_init_options(channel, options, optmask) if r != _lib.ARES_SUCCESS: raise AresError() self.channel = channel[0] if servers: self._set_servers(servers)