|
1 |
|
2 |
|
3 cdef class sockaddr : |
|
4 cdef void _init_family (self, platform.sa_family_t family=platform.AF_UNSPEC) : |
|
5 self.family = family |
|
6 |
|
7 # XXX:use size_t |
|
8 cdef int _get_sockaddr (self, platform.sockaddr **sa_ptr, platform.socklen_t *sa_len) except -1 : |
|
9 """ |
|
10 Get the sockaddr pointer and sockaddr length for this address |
|
11 """ |
|
12 |
|
13 raise NotImplementedError() |
|
14 |
|
15 cdef platform.sockaddr* _get_sockaddr_ptr (self) except NULL : |
|
16 """ |
|
17 Get the sockaddr pointer |
|
18 """ |
|
19 |
|
20 cdef platform.sockaddr *sa |
|
21 cdef platform.socklen_t sa_len |
|
22 |
|
23 self._get_sockaddr(&sa, &sa_len) |
|
24 |
|
25 return sa |
|
26 |
|
27 cdef platform.socklen_t _get_sockaddr_len (self) except -1 : |
|
28 """ |
|
29 Get the sockaddr len |
|
30 """ |
|
31 |
|
32 cdef platform.sockaddr *sa |
|
33 cdef platform.socklen_t sa_len |
|
34 |
|
35 self._get_sockaddr(&sa, &sa_len) |
|
36 |
|
37 return sa_len |
|
38 |
|
39 cdef int _set_sockaddr (self, platform.sockaddr *sa, size_t sa_len) except -1 : |
|
40 """ |
|
41 Set the sockaddr value for this address; sa_len must match! |
|
42 """ |
|
43 |
|
44 raise NotImplementedError() |
|
45 |
|
46 def getnameinfo (self) : |
|
47 """ |
|
48 Returns a (host, serv) tuple for this address à la getnameinfo |
|
49 |
|
50 >>> addr = sockaddr_in() |
|
51 >>> assert addr.getnameinfo() == (addr.addr, str(addr.port)) |
|
52 """ |
|
53 |
|
54 cdef platform.sockaddr *sa |
|
55 cdef platform.socklen_t sa_len |
|
56 |
|
57 # XXX: take as args? |
|
58 cdef int flags = platform.NI_NUMERICHOST | platform.NI_NUMERICSERV |
|
59 |
|
60 # get our abstract sockaddr |
|
61 self._get_sockaddr(&sa, &sa_len) |
|
62 |
|
63 # get nice text format |
|
64 return platform.getnameinfo(sa, sa_len, flags) |
|
65 |
|
66 property addr : |
|
67 """ |
|
68 The ASCII literal network address |
|
69 """ |
|
70 |
|
71 def __get__ (self) : |
|
72 """ |
|
73 Default implmentation using getnameinfo() |
|
74 """ |
|
75 |
|
76 addr, port = self.getnameinfo() |
|
77 |
|
78 return addr |
|
79 |
|
80 property port : |
|
81 """ |
|
82 The integer port number |
|
83 """ |
|
84 |
|
85 def __get__ (self) : |
|
86 """ |
|
87 Default implementation using getnameinfo() and int() |
|
88 """ |
|
89 |
|
90 addr, port = self.getnameinfo() |
|
91 |
|
92 return int(port) |
|
93 |
|
94 def __repr__ (self) : |
|
95 return "sockaddr(%d, %s, %d)" % (self.family, self.addr, self.port) |
|
96 |
|
97 |