author | Tero Marttila <terom@fixme.fi> |
Sun, 23 Aug 2009 23:12:29 +0300 | |
changeset 38 | f0fc793a3754 |
parent 37 | 14db3fe42b6c |
child 44 | 01ac7755b15a |
permissions | -rw-r--r-- |
32 | 1 |
|
2 |
from qmsk.net.socket import address, constants, af_unix |
|
3 |
||
4 |
class AddrInfo (address.addrinfo) : |
|
5 |
""" |
|
6 |
Represents a sockaddr along with related address-family etc. information |
|
7 |
""" |
|
8 |
||
9 |
class Endpoint (object) : |
|
10 |
""" |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
11 |
Abstract network address interface. This can map to multiple actual addresses, potentially of different |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
12 |
address families. |
32 | 13 |
""" |
14 |
||
37
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
15 |
def resolve (self, socktype, protocol = 0, passive = True) : |
32 | 16 |
""" |
37
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
17 |
Translate this Endpoint into a sequence of AddrInfo objects for the given socktype. |
32 | 18 |
""" |
19 |
||
20 |
raise NotImplemented() |
|
21 |
||
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
22 |
class InetEndpoint (Endpoint) : |
32 | 23 |
""" |
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
24 |
An internet endpoint, supports IPv4, IPv6 addresses and DNS hostnames. |
32 | 25 |
|
26 |
hostname - [str] literal address or DNS hostname |
|
27 |
service - [str] port number or service name |
|
37
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
28 |
family - AF_* associated with this address |
32 | 29 |
""" |
37
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
30 |
|
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
31 |
def __init__ (self, hostname=None, service=None, family=constants.AF_UNSPEC) : |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
32 |
""" |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
33 |
Initialize with given parameters, but doesn't perform any lookups yet. |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
34 |
""" |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
35 |
|
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
36 |
self.endpoint = address.endpoint(hostname, service) |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
37 |
self.family = family |
32 | 38 |
|
37
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
39 |
@property |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
40 |
def hostname (self) : |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
41 |
return self.endpoint.hostname |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
42 |
|
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
43 |
@property |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
44 |
def service (self) : |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
45 |
return self.endpoint.service |
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
46 |
|
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
47 |
def resolve (self, socktype, protocol = 0, passive = True) : |
32 | 48 |
""" |
49 |
Resolve using getaddrinfo |
|
50 |
""" |
|
51 |
||
52 |
flags = 0 |
|
53 |
||
54 |
if passive : |
|
35
50dc1517f797
fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents:
32
diff
changeset
|
55 |
flags |= constants.AI_PASSIVE |
32 | 56 |
|
37
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
57 |
return self.endpoint.getaddrinfo(self.family, socktype, protocol, flags) |
32 | 58 |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
59 |
class Address (Endpoint) : |
32 | 60 |
""" |
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
61 |
A specific socket-level address of some address family, also useable as an Endpoint. |
32 | 62 |
|
63 |
addr - low-level sockaddr object |
|
64 |
family - AF_* |
|
65 |
""" |
|
66 |
||
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
67 |
def __init__ (self, sockaddr, family = constants.AF_UNSPEC, canonical = None) : |
32 | 68 |
if not family : |
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
69 |
family = sockaddr.family |
32 | 70 |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
71 |
if not canonical : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
72 |
# XXX: delay? |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
73 |
canonical = str(sockaddr) |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
74 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
75 |
self._sockaddr = sockaddr |
32 | 76 |
self.family = family |
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
77 |
self.canonical = canonical |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
78 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
79 |
def sockaddr (self) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
80 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
81 |
Returns a qmsk.net.socket.address.sockaddr object for this address. |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
82 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
83 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
84 |
return self._sockaddr |
32 | 85 |
|
37
14db3fe42b6c
move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents:
35
diff
changeset
|
86 |
def resolve (self, socktype, protocol = 0, passive = True) : |
32 | 87 |
""" |
88 |
Returns a single AddrInfo object representing this address |
|
89 |
""" |
|
90 |
||
91 |
if not socktype : |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
92 |
raise ValueError("Socket type unknown") |
32 | 93 |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
94 |
return [AddrInfo(0, self.family, socktype, protocol, self._sockaddr, self.canonical)] |
32 | 95 |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
96 |
class InetAddr (Address) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
97 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
98 |
An AF_INET/AF_INET6 address, with addr and port. |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
99 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
100 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
101 |
@property |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
102 |
def addr (self) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
103 |
return self._sockaddr.addr |
32 | 104 |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
105 |
@property |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
106 |
def port (self) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
107 |
return self._sockaddr.port |
32 | 108 |
|
38
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
109 |
class IPv4Addr (InetAddr) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
110 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
111 |
A fixed AF_INET address and port |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
112 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
113 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
114 |
def __init__ (self, addr, port) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
115 |
super(IPv4Addr, self).__init__(af_inet.sockaddr_in(addr, port)) |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
116 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
117 |
class IPv6Addr (InetAddr) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
118 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
119 |
A fixed AF_INET6 address and port |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
120 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
121 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
122 |
def __init__ (self, addr, port) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
123 |
super(IPv6Addr, self).__init__(af_inet6.sockaddr_in6(addr, port)) |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
124 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
125 |
class UnixAddr (Address) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
126 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
127 |
A local AF_UNIX address, as a path. |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
128 |
""" |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
129 |
|
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
130 |
def __init__ (self, path) : |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
131 |
super(UnixAddr, self).__init__(af_unix.sockaddr_un(path)) |
f0fc793a3754
reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents:
37
diff
changeset
|
132 |