|
1 """ |
|
2 Libc stuff |
|
3 """ |
|
4 |
|
5 cdef extern from "stdint.h" : |
|
6 # yes, these are "wrong" |
|
7 ctypedef unsigned char uint8_t |
|
8 ctypedef unsigned short uint16_t |
|
9 ctypedef unsigned int uint32_t |
|
10 |
|
11 ctypedef signed char int8_t |
|
12 ctypedef signed short int16_t |
|
13 ctypedef signed int int32_t |
|
14 |
|
15 cdef extern from "sys/types.h" : |
|
16 # potentially wrong... |
|
17 ctypedef signed long ssize_t |
|
18 |
|
19 # <linux/types.h> |
|
20 cdef extern from "linux/types.h" : |
|
21 ctypedef uint8_t __u8 |
|
22 ctypedef uint16_t __u16 |
|
23 ctypedef uint32_t __u32 |
|
24 |
|
25 ctypedef int8_t __s8 |
|
26 ctypedef int16_t __s16 |
|
27 ctypedef int32_t __s32 |
|
28 |
|
29 cdef extern from "errno.h" : |
|
30 int errno |
|
31 |
|
32 cdef extern from "string.h" : |
|
33 void* memcpy (void *dest, void *src, size_t n) |
|
34 void* memset (void *s, int c, size_t n) |
|
35 |
|
36 char* strerror (int errno) |
|
37 |
|
38 cdef extern from "alloca.h" : |
|
39 void* alloca (size_t size) |
|
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 |
|
53 # <sys/socket.h> |
|
54 cdef extern from "sys/socket.h" : |
|
55 # socket types |
|
56 enum : |
|
57 SOCK_STREAM |
|
58 SOCK_DGRAM |
|
59 SOCK_RAW |
|
60 SOCK_RDM |
|
61 SOCK_SEQPACKET |
|
62 SOCK_PACKET |
|
63 |
|
64 # packet/address families |
|
65 enum : |
|
66 PF_UNSPEC |
|
67 PF_LOCAL |
|
68 PF_UNIX # same as PF_LOCAL |
|
69 PF_FILE # same as PF_LOCAL |
|
70 PF_INET |
|
71 PF_INET6 |
|
72 PF_NETLINK |
|
73 PF_ROUTE # same as PF_NETLINK |
|
74 |
|
75 |
|
76 # aliases for PF_* |
|
77 enum : |
|
78 AF_UNSPEC |
|
79 AF_LOCAL |
|
80 AF_UNIX |
|
81 AF_FILE |
|
82 AF_INET |
|
83 AF_INET6 |
|
84 AF_NETLINK |
|
85 AF_ROUTE |
|
86 |
|
87 # base sockaddr stuff |
|
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 |
|
189 ctypedef uint16_t in_port_t |
|
190 |
|
191 ## AF_INET |
|
192 ctypedef uint32_t in_addr_t |
|
193 struct in_addr : |
|
194 in_addr_t s_addr |
|
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 |
|
216 struct sockaddr_in : |
|
217 sa_family_t sin_family |
|
218 in_port_t sin_port |
|
219 in_addr sin_addr |
|
220 |
|
221 struct sockaddr_in6 : |
|
222 sa_family_t sin6_family |
|
223 in_port_t sin6_port |
|
224 uint32_t sin6_flowinfo |
|
225 in6_addr sin6_addr |
|
226 uint32_t sin6_scope_id |
|
227 |
|
228 uint16_t htons(uint16_t) |
|
229 uint32_t htonl(uint32_t) |
|
230 uint16_t ntohs(uint16_t) |
|
231 uint32_t ntohl(uint32_t) |
|
232 |
|
233 cdef extern from "netdb.h" : |
|
234 ## getaddrinfo |
|
235 struct addrinfo : |
|
236 int ai_flags |
|
237 int ai_family |
|
238 int ai_socktype |
|
239 int ai_protocol |
|
240 int ai_addrlen |
|
241 sockaddr *ai_addr |
|
242 char *ai_canonname |
|
243 addrinfo *ai_next |
|
244 |
|
245 enum : |
|
246 AI_PASSIVE |
|
247 AI_CANONNAME |
|
248 AI_NUMERICHOST |
|
249 AI_V4MAPPED |
|
250 AI_ALL |
|
251 AI_ADDRCONFIG |
|
252 # AI_*IDN* |
|
253 AI_NUMERICSERV |
|
254 |
|
255 int c_getaddrinfo "getaddrinfo" ( |
|
256 char *node, char *service, |
|
257 addrinfo *hints, addrinfo **res |
|
258 ) |
|
259 |
|
260 void c_freeaddrinfo "freeaddrinfo" (addrinfo *res) |
|
261 |
|
262 ## getnameinfo |
|
263 int c_getnameinfo "getnameinfo" ( |
|
264 sockaddr *sa, socklen_t salen, |
|
265 char *host, size_t hostlen, |
|
266 char *serv, size_t servlen, |
|
267 int flags |
|
268 ) |
|
269 |
|
270 enum : |
|
271 NI_NOFQDN |
|
272 NI_NUMERICHOST |
|
273 NI_NAMEREQD |
|
274 NI_NUMERICSERV |
|
275 NI_DGRAM |
|
276 |
|
277 NI_MAXHOST |
|
278 NI_MAXSERV |
|
279 |
|
280 char* gai_strerror (int err) |
|
281 |
|
282 # python-friendly wrapper around inet_ntop |
|
283 cdef object inet_ntop (int af, void *sockaddr) |
|
284 cdef object inet_pton (int af, char *addr, void *sockaddr_out) |
|
285 |
|
286 # sockaddr, flags -> (host, service) |
|
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 # |