Esempio n. 1
0
 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))
Esempio n. 2
0
 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
Esempio n. 3
0
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))