Mercurial > prosody-hg
comparison net/dns.lua @ 6509:7cb69eba3e95
net.dns: Try next server if peer name can not be set (thanks wirehack7)
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 30 Oct 2014 12:28:07 +0100 |
| parents | 4a28b8320d7f |
| children | 8273236a995f 45222bfb206f |
comparison
equal
deleted
inserted
replaced
| 6508:4a28b8320d7f | 6509:7cb69eba3e95 |
|---|---|
| 620 self.socketset = self.socketset or {}; | 620 self.socketset = self.socketset or {}; |
| 621 | 621 |
| 622 local sock = self.socket[servernum]; | 622 local sock = self.socket[servernum]; |
| 623 if sock then return sock; end | 623 if sock then return sock; end |
| 624 | 624 |
| 625 local err; | 625 local ok, err; |
| 626 sock, err = socket.udp(); | 626 sock, err = socket.udp(); |
| 627 if sock and self.socket_wrapper then sock, err = self.socket_wrapper(sock, self); end | 627 if sock and self.socket_wrapper then sock, err = self.socket_wrapper(sock, self); end |
| 628 if not sock then | 628 if not sock then |
| 629 return nil, err; | 629 return nil, err; |
| 630 end | 630 end |
| 631 sock:settimeout(0); | 631 sock:settimeout(0); |
| 632 -- todo: attempt to use a random port, fallback to 0 | 632 -- todo: attempt to use a random port, fallback to 0 |
| 633 sock:setsockname('*', 0); | |
| 634 sock:setpeername(self.server[servernum], 53); | |
| 635 self.socket[servernum] = sock; | 633 self.socket[servernum] = sock; |
| 636 self.socketset[sock] = servernum; | 634 self.socketset[sock] = servernum; |
| 635 -- set{sock,peer}name can fail, eg because of local routing table | |
| 636 -- if so, try the next server | |
| 637 ok, err = sock:setsockname('*', 0); | |
| 638 if not ok then return self:servfail(sock, err); end | |
| 639 ok, err = sock:setpeername(self.server[servernum], 53); | |
| 640 if not ok then return self:servfail(sock, err); end | |
| 637 return sock; | 641 return sock; |
| 638 end | 642 end |
| 639 | 643 |
| 640 function resolver:voidsocket(sock) | 644 function resolver:voidsocket(sock) |
| 641 if self.socket[sock] then | 645 if self.socket[sock] then |
| 779 end) | 783 end) |
| 780 end | 784 end |
| 781 return true; | 785 return true; |
| 782 end | 786 end |
| 783 | 787 |
| 784 function resolver:servfail(sock) | 788 function resolver:servfail(sock, err) |
| 785 -- Resend all queries for this server | 789 -- Resend all queries for this server |
| 786 | 790 |
| 787 local num = self.socketset[sock] | 791 local num = self.socketset[sock] |
| 788 | 792 |
| 789 -- Socket is dead now | 793 -- Socket is dead now |
| 802 o.retries = (o.retries or 0) + 1; | 806 o.retries = (o.retries or 0) + 1; |
| 803 if o.retries >= #self.server then | 807 if o.retries >= #self.server then |
| 804 --print('timeout'); | 808 --print('timeout'); |
| 805 queries[question] = nil; | 809 queries[question] = nil; |
| 806 else | 810 else |
| 807 sock = self:getsocket(o.server); | 811 sock, err = self:getsocket(o.server); |
| 808 if sock then sock:send(o.packet); end | 812 if sock then sock:send(o.packet); end |
| 809 end | 813 end |
| 810 end | 814 end |
| 811 end | 815 end |
| 812 if next(queries) == nil then | 816 if next(queries) == nil then |
| 819 if self.best_server > #self.server then | 823 if self.best_server > #self.server then |
| 820 -- Exhausted all servers, try first again | 824 -- Exhausted all servers, try first again |
| 821 self.best_server = 1; | 825 self.best_server = 1; |
| 822 end | 826 end |
| 823 end | 827 end |
| 824 return sock; | 828 return sock, err; |
| 825 end | 829 end |
| 826 | 830 |
| 827 function resolver:settimeout(seconds) | 831 function resolver:settimeout(seconds) |
| 828 self.timeout = seconds; | 832 self.timeout = seconds; |
| 829 end | 833 end |
