def run(self): while self.alive: p = select.poll() for af, sk in self.server.sockets: p.register(sk.fileno(), select.POLLIN) try: fds = p.poll(1000) except select.error, e: if e[0] == errno.EINTR: continue raise for fd, event in fds: if event & select.POLLIN == 0: continue for af, sk in self.server.sockets: if sk.fileno() == fd: break else: continue req, addr = sk.recvfrom(65536) try: pkt = proto.decodepacket(req) except proto.malformedpacket, inst: resp = proto.packet(inst.qid, ["resp"]) resp.rescode = proto.FORMERR sk.sendto(resp.encode(), addr) else: logger.debug("got request (%04x) from %s", pkt.qid, addr[0]) pkt.addr = (af,) + addr self.server.queuereq(pkt, dnsserver.socklistener.sender(addr, sk))
def handle(self, query, pkt, origin): sk = socket.socket(self.nameserver[0], socket.SOCK_DGRAM) sk.bind(("", 0)) p = select.poll() p.register(sk.fileno(), select.POLLIN) for i in range(self.retries): sk.sendto(pkt.encode(), self.nameserver[1:]) fds = p.poll(self.timeout) if (sk.fileno(), select.POLLIN) in fds: break else: return None resp = sk.recv(65536) resp = proto.decodepacket(resp) return resp
def resolve(packet, nameserver, recurse, retries = 3, timeout = 2000, hops = 0, cnameres = None, verbose = False, visited = None): if cnameres is None: cnameres = default if visited is None: visited = set() visited |= set([nameserver]) sk = socket.socket(nameserver[0], socket.SOCK_DGRAM) sk.bind(("", 0)) for i in range(retries): sk.sendto(packet.encode(), nameserver[1:]) p = select.poll() p.register(sk.fileno(), select.POLLIN) fds = p.poll(timeout) if (sk.fileno(), select.POLLIN) in fds: break else: raise unreachable(nameserver) ret = sk.recv(65536) sk.close() try: resp = proto.decodepacket(ret) except proto.malformedpacket, inst: raise error(str(inst))