+class ResolverFailure (ExpectedError):
+ def __init__(me, host, msg):
+ me.host = host
+ me.msg = msg
+ def __str__(me):
+ return "failed to resolve `%s': %s" % (me.host, me.msg)
+
+class ResolvingHost (object):
+ """
+ A host name which is being looked up by a bulk-resolver instance.
+
+ Most notably, this is where the flag-handling logic lives for the
+ $FLAGS[HOSTNAME] syntax.
+ """
+
+ def __init__(me, name):
+ """Make a new resolving-host object for the host NAME."""
+ me.name = name
+ me.addr = []
+ me.failure = None
+
+ def addaddr(me, addr):
+ """Add the address ADDR."""
+ me.addr.append(addr)
+
+ def failed(me, msg):
+ """
+ Report that resolution of this host failed, with a human-readable MSG.
+ """
+ me.failure = msg
+
+ def get(me, flags):
+ """Return a list of addresses according to the FLAGS string."""
+ if me.failure is not None: raise ResolverFailure(me.name, me.failure)
+ aa = me.addr
+ all = False
+ for ch in flags:
+ if ch == '*': all = True
+ else: raise ValueError("unknown address-resolution flag `%s'" % ch)
+ if not aa: raise ResolverFailure(me.name, 'no matching addresses found')
+ if not all: aa = [aa[0]]
+ return aa
+