home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_1633 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  8.1 KB  |  307 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. from __future__ import generators
  5. import errno
  6. import select
  7. import socket
  8. import struct
  9. import sys
  10. import time
  11. import dns.exception as dns
  12. import dns.inet as dns
  13. import dns.name as dns
  14. import dns.message as dns
  15. import dns.rdataclass as dns
  16. import dns.rdatatype as dns
  17.  
  18. class UnexpectedSource(dns.exception.DNSException):
  19.     pass
  20.  
  21.  
  22. class BadResponse(dns.exception.FormError):
  23.     pass
  24.  
  25.  
  26. def _compute_expiration(timeout):
  27.     if timeout is None:
  28.         return None
  29.     return time.time() + timeout
  30.  
  31.  
  32. def _wait_for(ir, iw, ix, expiration):
  33.     done = False
  34.     while not done:
  35.         if expiration is None:
  36.             timeout = None
  37.         else:
  38.             timeout = expiration - time.time()
  39.             if timeout <= 0:
  40.                 raise dns.exception.Timeout
  41.             timeout <= 0
  42.         
  43.         try:
  44.             if timeout is None:
  45.                 (r, w, x) = select.select(ir, iw, ix)
  46.             else:
  47.                 (r, w, x) = select.select(ir, iw, ix, timeout)
  48.         except select.error:
  49.             e = None
  50.             if e.args[0] != errno.EINTR:
  51.                 raise e
  52.             e.args[0] != errno.EINTR
  53.  
  54.         done = True
  55.         if len(r) == 0 and len(w) == 0 and len(x) == 0:
  56.             raise dns.exception.Timeout
  57.         len(x) == 0
  58.  
  59.  
  60. def _wait_for_readable(s, expiration):
  61.     _wait_for([
  62.         s], [], [
  63.         s], expiration)
  64.  
  65.  
  66. def _wait_for_writable(s, expiration):
  67.     _wait_for([], [
  68.         s], [
  69.         s], expiration)
  70.  
  71.  
  72. def udp(q, where, timeout = None, port = 53, af = None, source = None, source_port = 0, ignore_unexpected = False):
  73.     wire = q.to_wire()
  74.     if af is None:
  75.         
  76.         try:
  77.             af = dns.inet.af_for_address(where)
  78.         af = dns.inet.AF_INET
  79.  
  80.     
  81.     if af == dns.inet.AF_INET:
  82.         destination = (where, port)
  83.         if source is not None:
  84.             source = (source, source_port)
  85.         
  86.     elif af == dns.inet.AF_INET6:
  87.         destination = (where, port, 0, 0)
  88.         if source is not None:
  89.             source = (source, source_port, 0, 0)
  90.         
  91.     
  92.     s = socket.socket(af, socket.SOCK_DGRAM, 0)
  93.     
  94.     try:
  95.         expiration = _compute_expiration(timeout)
  96.         s.setblocking(0)
  97.         if source is not None:
  98.             s.bind(source)
  99.         
  100.         _wait_for_writable(s, expiration)
  101.         s.sendto(wire, destination)
  102.         while None:
  103.             (wire, from_address) = s.recvfrom(65535)
  104.             if (from_address == destination or dns.inet.is_multicast(where)) and from_address[1] == destination[1]:
  105.                 break
  106.             
  107.             if not ignore_unexpected:
  108.                 raise UnexpectedSource, 'got a response from %s instead of %s' % (from_address, destination)
  109.             ignore_unexpected
  110.         s.close()
  111.         r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac)
  112.         if not q.is_response(r):
  113.             raise BadResponse
  114.         q.is_response(r)
  115.         return r
  116.  
  117.  
  118.  
  119. def _net_read(sock, count, expiration):
  120.     s = ''
  121.     while count > 0:
  122.         _wait_for_readable(sock, expiration)
  123.         n = sock.recv(count)
  124.         if n == '':
  125.             raise EOFError
  126.         n == ''
  127.         count = count - len(n)
  128.         s = s + n
  129.     return s
  130.  
  131.  
  132. def _net_write(sock, data, expiration):
  133.     current = 0
  134.     l = len(data)
  135.     while current < l:
  136.         _wait_for_writable(sock, expiration)
  137.         current += sock.send(data[current:])
  138.  
  139.  
  140. def _connect(s, address):
  141.     
  142.     try:
  143.         s.connect(address)
  144.     except socket.error:
  145.         (ty, v) = sys.exc_info()[:2]
  146.         if v[0] != errno.EINPROGRESS and v[0] != errno.EWOULDBLOCK and v[0] != errno.EALREADY:
  147.             raise ty, v
  148.         v[0] != errno.EALREADY
  149.  
  150.  
  151.  
  152. def tcp(q, where, timeout = None, port = 53, af = None, source = None, source_port = 0):
  153.     wire = q.to_wire()
  154.     if af is None:
  155.         
  156.         try:
  157.             af = dns.inet.af_for_address(where)
  158.         af = dns.inet.AF_INET
  159.  
  160.     
  161.     if af == dns.inet.AF_INET:
  162.         destination = (where, port)
  163.         if source is not None:
  164.             source = (source, source_port)
  165.         
  166.     elif af == dns.inet.AF_INET6:
  167.         destination = (where, port, 0, 0)
  168.         if source is not None:
  169.             source = (source, source_port, 0, 0)
  170.         
  171.     
  172.     s = socket.socket(af, socket.SOCK_STREAM, 0)
  173.     
  174.     try:
  175.         expiration = _compute_expiration(timeout)
  176.         s.setblocking(0)
  177.         if source is not None:
  178.             s.bind(source)
  179.         
  180.         _connect(s, destination)
  181.         l = len(wire)
  182.         tcpmsg = struct.pack('!H', l) + wire
  183.         _net_write(s, tcpmsg, expiration)
  184.         ldata = _net_read(s, 2, expiration)
  185.         (l,) = struct.unpack('!H', ldata)
  186.         wire = _net_read(s, l, expiration)
  187.     finally:
  188.         s.close()
  189.  
  190.     r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac)
  191.     if not q.is_response(r):
  192.         raise BadResponse
  193.     q.is_response(r)
  194.     return r
  195.  
  196.  
  197. def xfr(where, zone, rdtype = dns.rdatatype.AXFR, rdclass = dns.rdataclass.IN, timeout = None, port = 53, keyring = None, keyname = None, relativize = True, af = None, lifetime = None, source = None, source_port = 0, serial = 0):
  198.     if isinstance(zone, (str, unicode)):
  199.         zone = dns.name.from_text(zone)
  200.     
  201.     q = dns.message.make_query(zone, rdtype, rdclass)
  202.     if rdtype == dns.rdatatype.IXFR:
  203.         rrset = dns.rrset.from_text(zone, 0, 'IN', 'SOA', '. . %u 0 0 0 0' % serial)
  204.         q.authority.append(rrset)
  205.     
  206.     if keyring is not None:
  207.         q.use_tsig(keyring, keyname)
  208.     
  209.     wire = q.to_wire()
  210.     if af is None:
  211.         
  212.         try:
  213.             af = dns.inet.af_for_address(where)
  214.         af = dns.inet.AF_INET
  215.  
  216.     
  217.     if af == dns.inet.AF_INET:
  218.         destination = (where, port)
  219.         if source is not None:
  220.             source = (source, source_port)
  221.         
  222.     elif af == dns.inet.AF_INET6:
  223.         destination = (where, port, 0, 0)
  224.         if source is not None:
  225.             source = (source, source_port, 0, 0)
  226.         
  227.     
  228.     s = socket.socket(af, socket.SOCK_STREAM, 0)
  229.     if source is not None:
  230.         s.bind(source)
  231.     
  232.     expiration = _compute_expiration(lifetime)
  233.     _connect(s, destination)
  234.     l = len(wire)
  235.     tcpmsg = struct.pack('!H', l) + wire
  236.     _net_write(s, tcpmsg, expiration)
  237.     done = False
  238.     soa_rrset = None
  239.     soa_count = 0
  240.     if relativize:
  241.         origin = zone
  242.         oname = dns.name.empty
  243.     else:
  244.         origin = None
  245.         oname = zone
  246.     tsig_ctx = None
  247.     first = True
  248.     while not done:
  249.         mexpiration = _compute_expiration(timeout)
  250.         if mexpiration is None or mexpiration > expiration:
  251.             mexpiration = expiration
  252.         
  253.         ldata = _net_read(s, 2, mexpiration)
  254.         (l,) = struct.unpack('!H', ldata)
  255.         wire = _net_read(s, l, mexpiration)
  256.         r = dns.message.from_wire(wire, keyring = q.keyring, request_mac = q.mac, xfr = True, origin = origin, tsig_ctx = tsig_ctx, multi = True, first = first)
  257.         tsig_ctx = r.tsig_ctx
  258.         first = False
  259.         answer_index = 0
  260.         delete_mode = False
  261.         expecting_SOA = False
  262.         if soa_rrset is None:
  263.             if not (r.answer) or r.answer[0].name != oname:
  264.                 raise dns.exception.FormError
  265.             r.answer[0].name != oname
  266.             rrset = r.answer[0]
  267.             if rrset.rdtype != dns.rdatatype.SOA:
  268.                 raise dns.exception.FormError, 'first RRset is not an SOA'
  269.             rrset.rdtype != dns.rdatatype.SOA
  270.             answer_index = 1
  271.             soa_rrset = rrset.copy()
  272.             if rdtype == dns.rdatatype.IXFR:
  273.                 if soa_rrset[0].serial == serial:
  274.                     done = True
  275.                 else:
  276.                     expecting_SOA = True
  277.             
  278.         
  279.         for rrset in r.answer[answer_index:]:
  280.             if done:
  281.                 raise dns.exception.FormError, 'answers after final SOA'
  282.             done
  283.             if rrset.rdtype == dns.rdatatype.SOA and rrset.name == oname:
  284.                 if expecting_SOA:
  285.                     if rrset[0].serial != serial:
  286.                         raise dns.exception.FormError, 'IXFR base serial mismatch'
  287.                     rrset[0].serial != serial
  288.                     expecting_SOA = False
  289.                 elif rdtype == dns.rdatatype.IXFR:
  290.                     delete_mode = not delete_mode
  291.                 
  292.                 if rrset == soa_rrset and not delete_mode:
  293.                     done = True
  294.                 
  295.             not delete_mode
  296.             if expecting_SOA:
  297.                 rdtype = dns.rdatatype.AXFR
  298.                 expecting_SOA = False
  299.                 continue
  300.         
  301.         if done and q.keyring and not (r.had_tsig):
  302.             raise dns.exception.FormError, 'missing TSIG'
  303.         not (r.had_tsig)
  304.         yield r
  305.     s.close()
  306.  
  307.