1 cimport qmsk.net.libc as libc |
1 cimport qmsk.net.libc as libc |
2 cimport qmsk.net.py as py |
2 cimport qmsk.net.py as py |
3 |
3 |
4 from qmsk.net.socket.address cimport * |
4 #from qmsk.net.socket.address cimport * |
|
5 |
|
6 cimport qmsk.net.libc as libc |
5 |
7 |
6 cimport qmsk.net.socket.platform as platform |
8 cimport qmsk.net.socket.platform as platform |
7 |
9 |
8 cdef class sockaddr : |
10 # concrete sockaddr implementation types |
9 cdef void _init_family (self, platform.sa_family_t family=platform.AF_UNSPEC) : |
|
10 self.family = family |
|
11 |
|
12 # XXX:use size_t |
|
13 cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 : |
|
14 """ |
|
15 Get the sockaddr pointer and sockaddr length for this address |
|
16 """ |
|
17 |
|
18 raise NotImplementedError() |
|
19 |
|
20 cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL : |
|
21 """ |
|
22 Get the sockaddr pointer |
|
23 """ |
|
24 |
|
25 cdef platform.sockaddr *sa |
|
26 cdef platform.socklen_t sa_len |
|
27 |
|
28 self._get_sockaddr(&sa, &sa_len) |
|
29 |
|
30 return sa |
|
31 |
|
32 cdef platform.socklen_t _get_sockaddr_len (self) except -1 : |
|
33 """ |
|
34 Get the sockaddr len |
|
35 """ |
|
36 |
|
37 cdef platform.sockaddr *sa |
|
38 cdef platform.socklen_t sa_len |
|
39 |
|
40 self._get_sockaddr(&sa, &sa_len) |
|
41 |
|
42 return sa_len |
|
43 |
|
44 cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 : |
|
45 """ |
|
46 Set the sockaddr value for this address; sa_len must match! |
|
47 """ |
|
48 |
|
49 raise NotImplementedError() |
|
50 |
|
51 def getnameinfo (self) : |
|
52 """ |
|
53 Returns a (host, serv) tuple for this address à la getnameinfo |
|
54 |
|
55 >>> addr = sockaddr_in() |
|
56 >>> assert addr.getnameinfo() == (addr.addr, str(addr.port)) |
|
57 """ |
|
58 |
|
59 cdef platform.sockaddr *sa |
|
60 cdef platform.socklen_t sa_len |
|
61 |
|
62 # XXX: take as args? |
|
63 cdef int flags = platform.NI_NUMERICHOST | platform.NI_NUMERICSERV |
|
64 |
|
65 # get our abstract sockaddr |
|
66 self._get_sockaddr(&sa, &sa_len) |
|
67 |
|
68 # get nice text format |
|
69 return platform.getnameinfo(sa, sa_len, flags) |
|
70 |
|
71 property addr : |
|
72 """ |
|
73 The ASCII literal network address |
|
74 """ |
|
75 |
|
76 def __get__ (self) : |
|
77 """ |
|
78 Default implmentation using getnameinfo() |
|
79 """ |
|
80 |
|
81 addr, port = self.getnameinfo() |
|
82 |
|
83 return addr |
|
84 |
|
85 property port : |
|
86 """ |
|
87 The integer port number |
|
88 """ |
|
89 |
|
90 def __get__ (self) : |
|
91 """ |
|
92 Default implementation using getnameinfo() and int() |
|
93 """ |
|
94 |
|
95 addr, port = self.getnameinfo() |
|
96 |
|
97 return int(port) |
|
98 |
|
99 def __repr__ (self) : |
|
100 return "sockaddr(%d, %s, %d)" % (self.family, self.addr, self.port) |
|
101 |
|
102 # mapping of AF -> sockaddr, user-modifyable |
11 # mapping of AF -> sockaddr, user-modifyable |
103 cimport qmsk.net.socket.af_inet, qmsk.net.socket.af_inet6 |
12 cimport qmsk.net.socket.af_inet, qmsk.net.socket.af_inet6 |
104 |
13 |
105 SOCKADDR_BY_FAMILY = { |
14 SOCKADDR_BY_FAMILY = { |
106 platform.AF_INET: qmsk.net.socket.af_inet.sockaddr_in, |
15 platform.AF_INET: qmsk.net.socket.af_inet.sockaddr_in, |
224 def getaddrinfo (hostname, service, int family, int socktype, int protocol = 0, int flags = 0) : |
133 def getaddrinfo (hostname, service, int family, int socktype, int protocol = 0, int flags = 0) : |
225 """ |
134 """ |
226 Look up given hostname/service using the given socket parameters, and return a sequence of addrinfo objects. |
135 Look up given hostname/service using the given socket parameters, and return a sequence of addrinfo objects. |
227 |
136 |
228 hostname - internet address/hostname to look up, or None (for INADDR_ANY/localhost, see AI_PASSIVE) |
137 hostname - internet address/hostname to look up, or None (for INADDR_ANY/localhost, see AI_PASSIVE) |
229 service - port/service to use, or None (for ephemeral) |
138 service - port/service to use, or None (for ephemeral). Should be given as a string |
230 family - address family to use, one of AF_*. May be AF_UNSPEC. |
139 family - address family to use, one of AF_*. May be AF_UNSPEC. |
231 socktype - socket type to use, one of SOCK_*. |
140 socktype - socket type to use, one of SOCK_*. |
232 protocol - protocol to use, one of IPPROTO_* or zero to pick the default protocol for the given |
141 protocol - protocol to use, one of IPPROTO_* or zero to pick the default protocol for the given |
233 socktype. |
142 socktype. |
234 flags - bitmask of AI_* flags for getaddrinfo() |
143 flags - bitmask of AI_* flags for getaddrinfo() |