qmsk/net/sctp/sock.pyx
author Tero Marttila <terom@fixme.fi>
Mon, 17 Aug 2009 01:29:31 +0300
changeset 20 0e4933d5862e
parent 11 7ae92c2b433f
child 21 19d212c948e0
permissions -rw-r--r--
rename qmsk.net.socket.addr -> qmsk.net.socket.address
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    This C(ython) extension module provides an interface to the libsctp library and associated socket API.
4
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     3
    
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     4
    >>> from __future__ import absolute_import; import socket as _socket
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     5
    >>> from qmsk.net.socket.addr import sockaddr_in
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
     6
    >>> s = _socket.socket(_socket.AF_INET, _socket.SOCK_SEQPACKET, 132)
4
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     7
    >>> sctp_bindx(s.fileno(), [sockaddr_in('127.0.0.1', 1337), sockaddr_in('127.0.0.2')], 0x01)
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     8
    >>>
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     9
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
"""
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    12
from qmsk.net.sctp.sock cimport *
20
0e4933d5862e rename qmsk.net.socket.addr -> qmsk.net.socket.address
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    13
from qmsk.net.socket.address cimport sockaddr
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
20
0e4933d5862e rename qmsk.net.socket.addr -> qmsk.net.socket.address
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    15
cimport qmsk.net.socket.platform as platform
11
7ae92c2b433f move libc+py back to qmsk.net.x
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    16
cimport qmsk.net.libc as libc
20
0e4933d5862e rename qmsk.net.socket.addr -> qmsk.net.socket.address
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    17
11
7ae92c2b433f move libc+py back to qmsk.net.x
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
    18
from qmsk.net.py cimport raise_errno
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    20
cdef size_t addrsoup_len (object addrs) except -1 :
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    """
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    22
        Calculate the length of the addr_buf required to store the given addrsoup
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    """
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    25
    cdef sockaddr addr
2
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    26
    cdef size_t addr_size = 0
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    27
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    28
    # 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
    29
    for addr in addrs :
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    30
        addr_size += addr._get_sockaddr_len()
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    31
    
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    32
    return addr_size
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    33
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    34
cdef addrsoup_store (object addrs, char *addr_buf) :
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    35
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    36
        Store the sockaddr_*'s for the given addresses into the given buffer, which should be addrsoup_len() bytes long
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    37
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    38
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    39
    cdef sockaddr addr
2
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    40
    cdef char *addr_ptr = addr_buf
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    41
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    42
    # fill it
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    43
    cdef platform.sockaddr *sa
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    44
    cdef platform.socklen_t sa_len
2
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    45
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    46
    for addr in addrs :
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    47
        # get address's sockaddr info
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    48
        addr._get_sockaddr(&sa, &sa_len)
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        
2
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    50
        # copy to buffer
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    51
        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
    52
        
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    53
        # move to next
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    54
        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
    55
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    56
def sctp_bindx (int sd, object addrs, int flags) :
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    57
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    58
        Bind the given SOCK_SEQPACKET to the given set of sock.addr.sockaddr's.
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    59
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    60
            sd          the system socket FD
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    61
            addresses   the list of qmsk.net.sock.addr.sockaddr's
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    62
            flags       one of SCTP_BINDX_ADD/REM_ADDR
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    63
        
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    64
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    65
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    66
    # ensure that addrs stays the same... ?
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    67
    addrs = tuple(addrs)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    68
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    69
    # alloc buffer to hold all the sockaddr_*'s
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    70
    cdef char *addr_buf = <char *> libc.alloca(addrsoup_len(addrs))
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    71
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    72
    # store
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    73
    addrsoup_store(addrs, addr_buf)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    74
2
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    75
    # then call
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    76
    if c_sctp_bindx(sd, <platform.sockaddr *> addr_buf, len(addrs), flags) < 0 :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    77
        raise_errno('sctp_bindx')
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    79
def sctp_connectx (int sd, object addrs) :
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    80
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    81
        Connect the given SOCK_SEQPACKET to the given set of remote sock.addr.sockaddr's.
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    82
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    83
            sd          the system socket FD
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    84
            addresses   the list of qmsk.net.sock.addr.sockaddr's
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    85
        
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    86
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    87
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    88
    # ensure that addrs stays the same... ?
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    89
    addrs = tuple(addrs)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    90
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    91
    # alloc buffer to hold all the sockaddr_*'s
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    92
    cdef char *addr_buf = <char *> libc.alloca(addrsoup_len(addrs))
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    93
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    94
    # store
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    95
    addrsoup_store(addrs, addr_buf)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    96
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    97
    # then call
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
    98
    if c_sctp_connectx(sd, <platform.sockaddr *> addr_buf, len(addrs)) < 0 :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    99
        raise_errno('sctp_connectx')
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   100