1 """ |
1 """ |
2 Libc stuff |
2 Libc stuff |
3 """ |
3 """ |
4 |
4 |
5 cdef extern from "stdint.h": |
5 cdef extern from "stdint.h" : |
6 # yes, these are "wrong" |
6 # yes, these are "wrong" |
7 ctypedef unsigned char uint8_t |
7 ctypedef unsigned char uint8_t |
8 ctypedef unsigned short uint16_t |
8 ctypedef unsigned short uint16_t |
9 ctypedef unsigned int uint32_t |
9 ctypedef unsigned int uint32_t |
10 |
10 |
11 ctypedef signed char int8_t |
11 ctypedef signed char int8_t |
12 ctypedef signed short int16_t |
12 ctypedef signed short int16_t |
13 ctypedef signed int int32_t |
13 ctypedef signed int int32_t |
|
14 |
|
15 cdef extern from "sys/types.h" : |
|
16 # potentially wrong... |
|
17 ctypedef signed long ssize_t |
14 |
18 |
15 # <linux/types.h> |
19 # <linux/types.h> |
16 cdef extern from "linux/types.h" : |
20 cdef extern from "linux/types.h" : |
17 ctypedef uint8_t __u8 |
21 ctypedef uint8_t __u8 |
18 ctypedef uint16_t __u16 |
22 ctypedef uint16_t __u16 |
32 char* strerror (int errno) |
36 char* strerror (int errno) |
33 |
37 |
34 cdef extern from "alloca.h" : |
38 cdef extern from "alloca.h" : |
35 void* alloca (size_t size) |
39 void* alloca (size_t size) |
36 |
40 |
|
41 cdef extern from "sys/uio.h" : |
|
42 struct iovec : |
|
43 void *iov_base |
|
44 size_t iov_len |
|
45 |
|
46 cdef extern from "arpa/inet.h" : |
|
47 # XXX: correct?! |
|
48 ctypedef uint32_t socklen_t |
|
49 |
|
50 char* c_inet_ntop "inet_ntop" (int af, void *sockaddr, char *buf, socklen_t len) |
|
51 int c_inet_pton "inet_pton" (int af, char *src, void *dst) |
|
52 |
37 # <sys/socket.h> |
53 # <sys/socket.h> |
38 cdef extern from "sys/socket.h" : |
54 cdef extern from "sys/socket.h" : |
|
55 # socket types |
39 enum : |
56 enum : |
40 SOCK_STREAM |
57 SOCK_STREAM |
41 SOCK_DGRAM |
58 SOCK_DGRAM |
|
59 SOCK_RAW |
|
60 SOCK_RDM |
42 SOCK_SEQPACKET |
61 SOCK_SEQPACKET |
43 |
62 SOCK_PACKET |
|
63 |
|
64 # packet/address families |
44 enum : |
65 enum : |
45 PF_UNSPEC |
66 PF_UNSPEC |
46 PF_LOCAL |
67 PF_LOCAL |
|
68 PF_UNIX # same as PF_LOCAL |
|
69 PF_FILE # same as PF_LOCAL |
47 PF_INET |
70 PF_INET |
48 PF_INET6 |
71 PF_INET6 |
49 |
72 PF_NETLINK |
50 # these are #defines |
73 PF_ROUTE # same as PF_NETLINK |
51 enum : |
74 |
52 PF_UNIX |
75 |
53 |
76 # aliases for PF_* |
|
77 enum : |
54 AF_UNSPEC |
78 AF_UNSPEC |
55 AF_LOCAL |
79 AF_LOCAL |
56 AF_UNIX |
80 AF_UNIX |
|
81 AF_FILE |
57 AF_INET |
82 AF_INET |
58 AF_INET6 |
83 AF_INET6 |
59 |
84 AF_NETLINK |
|
85 AF_ROUTE |
|
86 |
|
87 # base sockaddr stuff |
60 ctypedef uint16_t sa_family_t |
88 ctypedef uint16_t sa_family_t |
|
89 |
|
90 struct sockaddr : |
|
91 sa_family_t sa_family |
|
92 |
|
93 struct sockaddr_storage : |
|
94 sa_family_t ss_family |
|
95 |
|
96 # flag values |
|
97 enum : |
|
98 MSG_OOB |
|
99 MSG_PEEK |
|
100 MSG_DONTROUTE |
|
101 MSG_CTRUNC |
|
102 MSG_PROXY |
|
103 MSG_TRUNC |
|
104 MSG_DONTWAIT |
|
105 MSG_EOR |
|
106 MSG_WAITALL |
|
107 MSG_FIN |
|
108 MSG_SYN |
|
109 MSG_CONFIRM |
|
110 MSG_RST |
|
111 MSG_ERRQUEUE |
|
112 MSG_NOSIGNAL |
|
113 MSG_MORE |
|
114 MSG_CMSG_CLOEXEC |
|
115 |
|
116 ## send/recv-msg |
|
117 struct msghdr : |
|
118 void *msg_name # sockaddr |
|
119 socklen_t msg_namelen |
|
120 |
|
121 iovec *msg_iov # message data |
|
122 size_t msg_iovlen |
|
123 |
|
124 void *msg_control # aux data |
|
125 size_t msg_controllen |
|
126 |
|
127 int msg_flags # flags |
|
128 |
|
129 struct cmsghdr : |
|
130 size_t cmsg_len # length including this cmsghdr struct |
|
131 |
|
132 int cmsg_level # originating protocol (IPPROTO_* ???) |
|
133 int cmsg_type # protocol-specific type |
|
134 |
|
135 ## socket-level cmsghdr types |
|
136 enum : |
|
137 SCM_RIGHTS |
|
138 SCM_CREDENTIALS |
|
139 |
|
140 #- ucred |
|
141 |
|
142 # SO_LINGER parameters |
|
143 struct linger : |
|
144 int l_onoff |
|
145 int l_linger |
|
146 |
|
147 |
|
148 ## API |
|
149 int socket (int domain, int socktype, int protocol) |
|
150 int bind (int fd, sockaddr *addr, socklen_t len) |
|
151 int connect (int fd, sockaddr *addr, socklen_t len) |
|
152 int listen (int fd, int n) |
|
153 int accept (int fd, sockaddr *addr, socklen_t *len) |
|
154 int shutdown (int fd, int how) |
|
155 |
|
156 int getsockname (int fd, sockaddr *addr, socklen_t *len) |
|
157 int getpeername (int fd, sockaddr *addr, socklen_t *len) |
|
158 |
|
159 ssize_t send (int fd, void *buf, size_t n, int flags) |
|
160 ssize_t recv (int fd, void *buf, size_t n, int flags) |
|
161 ssize_t sendto (int fd, void *buf, size_t n, int flags, sockaddr *addr, socklen_t addr_len) |
|
162 ssize_t recvfrom (int fd, void *buf, size_t n, int flags, sockaddr *addr, socklen_t addr_len) |
|
163 ssize_t sendmsg (int fd, msghdr *msg, int flags) |
|
164 ssize_t recvmsg (int fd, msghdr *msg, int flags) |
|
165 |
|
166 int getsockopt (int fd, int level, int optname, void *optval, socklen_t optlen) |
|
167 int setsockopt (int fd, int level, int optname, void *optval, socklen_t optlen) |
|
168 |
|
169 enum : |
|
170 SHUT_RD |
|
171 SHUT_WR |
|
172 SHUT_RDWR |
|
173 |
|
174 cdef extern from "netinet/in.h" : |
|
175 ## socket protocol types |
|
176 enum : |
|
177 IPPROTO_IP |
|
178 IPPROTO_ICMP |
|
179 IPPROTO_IGMP |
|
180 IPPROTO_TCP |
|
181 IPPROTO_UDP |
|
182 IPPROTO_IPV6 |
|
183 IPPROTO_ICMPV6 |
|
184 IPPROTO_SCTP |
|
185 IPPROTO_RAW |
|
186 |
|
187 |
|
188 ## ports |
61 ctypedef uint16_t in_port_t |
189 ctypedef uint16_t in_port_t |
|
190 |
|
191 ## AF_INET |
62 ctypedef uint32_t in_addr_t |
192 ctypedef uint32_t in_addr_t |
63 |
|
64 ## AF_INET |
|
65 struct in_addr : |
193 struct in_addr : |
66 in_addr_t s_addr |
194 in_addr_t s_addr |
67 |
195 |
|
196 # XXX: should these be in another cdef? |
|
197 in_addr_t INADDR_ANY |
|
198 |
|
199 ## AF_INET6 |
|
200 struct in6_addr : |
|
201 # XXX: check POSIX... |
|
202 uint8_t s6_addr[16] |
|
203 uint16_t s6_addr16[8] |
|
204 uint32_t s6_addr32[4] |
|
205 |
|
206 # common in6_addr's |
|
207 in6_addr in6addr_any |
|
208 in6_addr in6addr_loopback |
|
209 |
|
210 ## constants |
|
211 enum : |
|
212 INET_ADDRSTRLEN |
|
213 INET6_ADDRSTRLEN |
|
214 |
|
215 ## sockaddrs |
68 struct sockaddr_in : |
216 struct sockaddr_in : |
69 sa_family_t sin_family |
217 sa_family_t sin_family |
70 in_port_t sin_port |
218 in_port_t sin_port |
71 in_addr sin_addr |
219 in_addr sin_addr |
72 |
|
73 # XXX: should these be in another cdef? |
|
74 in_addr_t INADDR_ANY |
|
75 |
|
76 ## AF_INET6 |
|
77 struct in6_addr : |
|
78 pass |
|
79 |
220 |
80 struct sockaddr_in6 : |
221 struct sockaddr_in6 : |
81 sa_family_t sin6_family |
222 sa_family_t sin6_family |
82 in_port_t sin6_port |
223 in_port_t sin6_port |
83 uint32_t sin6_flowinfo |
224 uint32_t sin6_flowinfo |
84 in6_addr sin6_addr |
225 in6_addr sin6_addr |
85 uint32_t sin6_scope_id |
226 uint32_t sin6_scope_id |
86 |
227 |
87 # common in6_addr's |
|
88 in6_addr in6addr_any |
|
89 in6_addr in6addr_loopback |
|
90 |
|
91 ## actually from bits/socket.h... |
|
92 struct sockaddr : |
|
93 sa_family_t sa_family |
|
94 |
|
95 struct sockaddr_storage : |
|
96 sa_family_t ss_family |
|
97 |
|
98 cdef extern from "arpa/inet.h" : |
|
99 uint16_t htons(uint16_t) |
228 uint16_t htons(uint16_t) |
100 uint32_t htonl(uint32_t) |
229 uint32_t htonl(uint32_t) |
101 uint16_t ntohs(uint16_t) |
230 uint16_t ntohs(uint16_t) |
102 uint32_t ntohl(uint32_t) |
231 uint32_t ntohl(uint32_t) |
103 |
|
104 # XXX: correct?! |
|
105 ctypedef size_t socklen_t |
|
106 |
|
107 ## constants |
|
108 enum : |
|
109 INET_ADDRSTRLEN |
|
110 INET6_ADDRSTRLEN |
|
111 |
|
112 char* c_inet_ntop "inet_ntop" (int af, void *sockaddr, char *buf, socklen_t len) |
|
113 int c_inet_pton "inet_pton" (int af, char *src, void *dst) |
|
114 |
232 |
115 cdef extern from "netdb.h" : |
233 cdef extern from "netdb.h" : |
116 ## getaddrinfo |
234 ## getaddrinfo |
117 struct addrinfo : |
235 struct addrinfo : |
118 int ai_flags |
236 int ai_flags |
165 cdef object inet_ntop (int af, void *sockaddr) |
283 cdef object inet_ntop (int af, void *sockaddr) |
166 cdef object inet_pton (int af, char *addr, void *sockaddr_out) |
284 cdef object inet_pton (int af, char *addr, void *sockaddr_out) |
167 |
285 |
168 # sockaddr, flags -> (host, service) |
286 # sockaddr, flags -> (host, service) |
169 cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags) |
287 cdef object getnameinfo (sockaddr *sa, socklen_t salen, int flags) |
|
288 |
|
289 ## general errno-based errors |
|
290 #cdef class Errno (py.OSError) : |
|
291 # """ |
|
292 # Some libc function returned an error code: |
|
293 # |
|
294 # func - the name of the function called |
|
295 # err - the system error code |
|
296 # strerror - human-readable error code -> message |
|
297 # """ |
|
298 # |
|
299 # cdef readonly char *func |
|
300 # cdef readonly int err |
|
301 # cdef readonly object strerror |
|
302 # |
|
303 #cdef class GAIError (py.OSError) : |
|
304 # """ |
|
305 # Some libc GAI function returnd an error code: |
|
306 # |
|
307 # func - the name of the function called |
|
308 # err - the GAI_* error code |
|
309 # strerror - human-readable error code -> message |
|
310 # """ |
|
311 # |
|
312 # cdef readonly char *func |
|
313 # cdef readonly int err |
|
314 # cdef readonly object strerror |
|
315 # |