author | Tero Marttila <terom@fixme.fi> |
Sun, 16 Aug 2009 18:29:55 +0300 | |
changeset 6 | 10bd48c9b6ce |
parent 5 | 59bed837c265 |
permissions | -rw-r--r-- |
0 | 1 |
""" |
2 |
Libc stuff |
|
3 |
""" |
|
4 |
||
6 | 5 |
cdef extern from "stdint.h" : |
0 | 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 |
||
6 | 15 |
cdef extern from "sys/types.h" : |
16 |
# potentially wrong... |
|
17 |
ctypedef signed long ssize_t |
|
18 |
||
0 | 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 |
||
4 | 29 |
cdef extern from "errno.h" : |
30 |
int errno |
|
31 |
||
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
32 |
cdef extern from "string.h" : |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
33 |
void* memcpy (void *dest, void *src, size_t n) |
5 | 34 |
void* memset (void *s, int c, size_t n) |
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
35 |
|
4 | 36 |
char* strerror (int errno) |
37 |
||
0 | 38 |
cdef extern from "alloca.h" : |
39 |
void* alloca (size_t size) |
|
40 |
||
6 | 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 |
||
0 | 53 |
# <sys/socket.h> |
54 |
cdef extern from "sys/socket.h" : |
|
6 | 55 |
# socket types |
0 | 56 |
enum : |
57 |
SOCK_STREAM |
|
58 |
SOCK_DGRAM |
|
6 | 59 |
SOCK_RAW |
60 |
SOCK_RDM |
|
0 | 61 |
SOCK_SEQPACKET |
6 | 62 |
SOCK_PACKET |
63 |
||
64 |
# packet/address families |
|
0 | 65 |
enum : |
66 |
PF_UNSPEC |
|
67 |
PF_LOCAL |
|
6 | 68 |
PF_UNIX # same as PF_LOCAL |
69 |
PF_FILE # same as PF_LOCAL |
|
0 | 70 |
PF_INET |
71 |
PF_INET6 |
|
6 | 72 |
PF_NETLINK |
73 |
PF_ROUTE # same as PF_NETLINK |
|
74 |
||
0 | 75 |
|
6 | 76 |
# aliases for PF_* |
0 | 77 |
enum : |
78 |
AF_UNSPEC |
|
79 |
AF_LOCAL |
|
80 |
AF_UNIX |
|
6 | 81 |
AF_FILE |
0 | 82 |
AF_INET |
83 |
AF_INET6 |
|
6 | 84 |
AF_NETLINK |
85 |
AF_ROUTE |
|
86 |
||
87 |
# base sockaddr stuff |
|
0 | 88 |
ctypedef uint16_t sa_family_t |
6 | 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 |
|
0 | 189 |
ctypedef uint16_t in_port_t |
190 |
||
191 |
## AF_INET |
|
6 | 192 |
ctypedef uint32_t in_addr_t |
0 | 193 |
struct in_addr : |
194 |
in_addr_t s_addr |
|
6 | 195 |
|
0 | 196 |
# XXX: should these be in another cdef? |
197 |
in_addr_t INADDR_ANY |
|
198 |
||
199 |
## AF_INET6 |
|
200 |
struct in6_addr : |
|
6 | 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 |
|
0 | 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" : |
|
5 | 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 |
|
0 | 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) |
|
6 | 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 |
# |