author | Tero Marttila <terom@fixme.fi> |
Sun, 16 Aug 2009 04:15:07 +0300 | |
changeset 4 | 664a1dfe08ac |
parent 3 | bbad9790b786 |
child 5 | 59bed837c265 |
permissions | -rw-r--r-- |
0 | 1 |
""" |
2 |
This C(ython) extension module provides an interface to the libsctp library and associated socket API. |
|
4 | 3 |
|
4 |
>>> import socket |
|
5 |
>>> from sock.addr import sockaddr_in |
|
6 |
>>> s = socket.socket(socket.AF_INET, socket.SOCK_SEQPACKET, 132) |
|
7 |
>>> sctp_bindx(s.fileno(), [sockaddr_in('127.0.0.1', 1337), sockaddr_in('127.0.0.2')], 0x01) |
|
8 |
>>> |
|
9 |
||
0 | 10 |
""" |
11 |
||
1
0ca9278146d7
move pxd's to inc dir, split off sctp.pxd
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
12 |
from sctp cimport * |
0 | 13 |
|
1
0ca9278146d7
move pxd's to inc dir, split off sctp.pxd
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
14 |
cimport libc |
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
15 |
cimport sock.addr |
0 | 16 |
|
4 | 17 |
cdef extern from "Python.h" : |
18 |
struct PyObject : |
|
19 |
pass |
|
20 |
||
21 |
PyObject* PyErr_SetFromErrno (PyObject *type) |
|
22 |
||
23 |
PyObject* PyExc_OSError |
|
24 |
||
25 |
cdef int raise_errno () except -1 : |
|
26 |
PyErr_SetFromErrno(PyExc_OSError) |
|
27 |
||
28 |
return -1 |
|
29 |
||
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
30 |
def sctp_bindx (int sd, object addrs, int flags) : |
0 | 31 |
""" |
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
32 |
Bind the given SOCK_SEQPACKET to the given set of sock.addr.sockaddr's. |
0 | 33 |
|
34 |
sd the system socket FD |
|
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
35 |
addresses the list of qmsk.net.sock.addr.sockaddr's |
0 | 36 |
flags one of SCTP_BINDX_ADD/REM_ADDR |
4 | 37 |
|
0 | 38 |
""" |
39 |
||
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
40 |
# ensure that addrs stays the same... ? |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
41 |
addrs = tuple(addrs) |
0 | 42 |
|
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
43 |
cdef size_t addr_count = len(addrs) |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
44 |
cdef size_t addr_size = 0 |
3
bbad9790b786
fix .pxd names to package.module.pxd
Tero Marttila <terom@fixme.fi>
parents:
2
diff
changeset
|
45 |
cdef sock.addr.sockaddr addr |
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
46 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
47 |
# whoever decided that sctp_bindx takes an array of mixed sockaddr_in/sockaddr_in6's should be shot |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
48 |
for addr in addrs : |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
49 |
addr_size += addr._get_sockaddr_len() |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
50 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
51 |
# alloc buffer to hold all the sockaddr_*'s |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
52 |
cdef char *addr_buf = <char *> libc.alloca(addr_size) |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
53 |
cdef char *addr_ptr = addr_buf |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
54 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
55 |
# fill it |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
56 |
cdef libc.sockaddr *sa |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
57 |
cdef libc.socklen_t sa_len |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
58 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
59 |
for addr in addrs : |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
60 |
# get address's sockaddr info |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
61 |
addr._get_sockaddr(&sa, &sa_len) |
0 | 62 |
|
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
63 |
# copy to buffer |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
64 |
libc.memcpy(addr_ptr, sa, sa_len) |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
65 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
66 |
# move to next |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
67 |
addr_ptr += sa_len |
1
0ca9278146d7
move pxd's to inc dir, split off sctp.pxd
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
68 |
|
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
69 |
# then call |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
70 |
if c_sctp_bindx(sd, <libc.sockaddr *> addr_buf, addr_count, flags) < 0 : |
4 | 71 |
raise_errno() |
0 | 72 |