terom@32: terom@32: from qmsk.net.socket import address, constants, af_unix terom@32: terom@32: class AddrInfo (address.addrinfo) : terom@32: """ terom@32: Represents a sockaddr along with related address-family etc. information terom@32: """ terom@32: terom@32: class Endpoint (object) : terom@32: """ terom@32: Abstract network address interface, terom@32: """ terom@32: terom@32: def resolve (self, family, socktype, protocol = 0, passive = True) : terom@32: """ terom@32: Translate this Endpoint into a sequence of AddrInfo objects for the given family/socktype. terom@32: """ terom@32: terom@32: raise NotImplemented() terom@32: terom@32: terom@32: class InetAddr (Endpoint, address.endpoint) : terom@32: """ terom@32: An internet address, either IPv4 or IPv6. terom@32: terom@32: hostname - [str] literal address or DNS hostname terom@32: service - [str] port number or service name terom@32: """ terom@32: terom@32: def resolve (self, family, socktype, protocol = 0, passive = True) : terom@32: """ terom@32: Resolve using getaddrinfo terom@32: """ terom@32: terom@32: flags = 0 terom@32: terom@32: if passive : terom@35: flags |= constants.AI_PASSIVE terom@32: terom@35: return self.getaddrinfo(family, socktype, protocol, flags) terom@32: terom@32: class UnixAddr (Endpoint) : terom@32: """ terom@32: A local AF_UNIX address, as a path. terom@32: """ terom@32: terom@32: def __init__ (self, path) : terom@32: self.path = path terom@32: self.addr = af_unix.sockaddr_un(path) terom@32: terom@32: def resolve (self, family, socktype, protocol = 0, passive = True) : terom@32: if family != constants.AF_UNIX : terom@32: raise ValueError("Address family mismatch: %s" % (family, )) terom@32: terom@32: if not socktype : terom@32: raise ValueError("Unknown socktype: %s" % (socktype, )) terom@32: terom@32: return [AddrInfo(0, constants.AF_UNIX, socktype, protocol, self.addr, self.path)] terom@32: terom@32: class SockAddr (Endpoint) : terom@32: """ terom@32: A specific address, suitable both as an endpoint. terom@32: terom@32: addr - low-level sockaddr object terom@32: family - AF_* terom@32: socktype - SOCK_* terom@32: """ terom@32: terom@32: def __init__ (self, addr, family = constants.AF_UNSPEC, socktype = 0) : terom@32: if not family : terom@32: family = addr.family terom@32: terom@32: self.addr = addr terom@32: self.family = family terom@32: self.socktype = socktype terom@32: terom@32: def resolve (self, family, socktype, protocol = 0, passive = True) : terom@32: """ terom@32: Returns a single AddrInfo object representing this address terom@32: """ terom@32: terom@32: if family and family != self.family : terom@32: raise ValueError("Address family mismatch: %s should be %s" % (family, self.family)) terom@32: terom@32: elif not family : terom@32: family = self.family terom@32: terom@32: terom@32: if socktype and self.socktype and socktype != self.socktype : terom@32: raise ValueError("Socket type mismatch: %s should be %s" % (socktype, self.socktype)) terom@32: terom@32: if not socktype : terom@32: if self.socktype : terom@32: socktype = self.socktype terom@32: terom@32: else : terom@32: raise ValueError("Socket type unknown") terom@32: terom@32: terom@32: return [AddrInfo(0, family, socktype, protocol, self.addr, None)] terom@32: