author | Tero Marttila <terom@fixme.fi> |
Sun, 16 Aug 2009 18:29:55 +0300 | |
changeset 6 | 10bd48c9b6ce |
parent 5 | sctp/sock.pyx@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 |
||
5 | 12 |
from sctp.sock cimport * |
13 |
from py cimport raise_errno |
|
0 | 14 |
|
1
0ca9278146d7
move pxd's to inc dir, split off sctp.pxd
Tero Marttila <terom@fixme.fi>
parents:
0
diff
changeset
|
15 |
cimport libc |
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
16 |
cimport sock.addr |
0 | 17 |
|
5 | 18 |
cdef size_t addrsoup_len (object addrs) except -1 : |
0 | 19 |
""" |
5 | 20 |
Calculate the length of the addr_buf required to store the given addrsoup |
0 | 21 |
""" |
22 |
||
5 | 23 |
cdef sock.addr.sockaddr addr |
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
24 |
cdef size_t addr_size = 0 |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
25 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
26 |
# 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
|
27 |
for addr in addrs : |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
28 |
addr_size += addr._get_sockaddr_len() |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
29 |
|
5 | 30 |
return addr_size |
31 |
||
32 |
cdef addrsoup_store (object addrs, char *addr_buf) : |
|
33 |
""" |
|
34 |
Store the sockaddr_*'s for the given addresses into the given buffer, which should be addrsoup_len() bytes long |
|
35 |
""" |
|
36 |
||
37 |
cdef sock.addr.sockaddr addr |
|
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
38 |
cdef char *addr_ptr = addr_buf |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
39 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
40 |
# fill it |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
41 |
cdef libc.sockaddr *sa |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
42 |
cdef libc.socklen_t sa_len |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
43 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
44 |
for addr in addrs : |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
45 |
# get address's sockaddr info |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
46 |
addr._get_sockaddr(&sa, &sa_len) |
0 | 47 |
|
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
48 |
# copy to buffer |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
49 |
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
|
50 |
|
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
51 |
# move to next |
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
52 |
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
|
53 |
|
5 | 54 |
def sctp_bindx (int sd, object addrs, int flags) : |
55 |
""" |
|
56 |
Bind the given SOCK_SEQPACKET to the given set of sock.addr.sockaddr's. |
|
57 |
||
58 |
sd the system socket FD |
|
59 |
addresses the list of qmsk.net.sock.addr.sockaddr's |
|
60 |
flags one of SCTP_BINDX_ADD/REM_ADDR |
|
61 |
||
62 |
""" |
|
63 |
||
64 |
# ensure that addrs stays the same... ? |
|
65 |
addrs = tuple(addrs) |
|
66 |
||
67 |
# alloc buffer to hold all the sockaddr_*'s |
|
68 |
cdef char *addr_buf = <char *> libc.alloca(addrsoup_len(addrs)) |
|
69 |
||
70 |
# store |
|
71 |
addrsoup_store(addrs, addr_buf) |
|
72 |
||
2
171e77f8d675
re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents:
1
diff
changeset
|
73 |
# then call |
5 | 74 |
if c_sctp_bindx(sd, <libc.sockaddr *> addr_buf, len(addrs), flags) < 0 : |
6 | 75 |
raise_errno('sctp_bindx') |
0 | 76 |
|
5 | 77 |
def sctp_connectx (int sd, object addrs) : |
78 |
""" |
|
79 |
Connect the given SOCK_SEQPACKET to the given set of remote sock.addr.sockaddr's. |
|
80 |
||
81 |
sd the system socket FD |
|
82 |
addresses the list of qmsk.net.sock.addr.sockaddr's |
|
83 |
||
84 |
""" |
|
85 |
||
86 |
# ensure that addrs stays the same... ? |
|
87 |
addrs = tuple(addrs) |
|
88 |
||
89 |
# alloc buffer to hold all the sockaddr_*'s |
|
90 |
cdef char *addr_buf = <char *> libc.alloca(addrsoup_len(addrs)) |
|
91 |
||
92 |
# store |
|
93 |
addrsoup_store(addrs, addr_buf) |
|
94 |
||
95 |
# then call |
|
96 |
if c_sctp_connectx(sd, <libc.sockaddr *> addr_buf, len(addrs)) < 0 : |
|
6 | 97 |
raise_errno('sctp_connectx') |
5 | 98 |