qmsk/net/sctp/sock.pyx
author Tero Marttila <terom@fixme.fi>
Sun, 16 Aug 2009 19:01:21 +0300
changeset 7 74fde84264b1
parent 6 qmsk.net/sctp/sock.pyx@10bd48c9b6ce
child 8 b3880dafbab1
permissions -rw-r--r--
broke Cython with this package magic
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
    
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     4
    >>> import socket
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     5
    >>> from sock.addr import sockaddr_in
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
     6
    >>> s = socket.socket(socket.AF_INET, socket.SOCK_SEQPACKET, 132)
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
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    12
from sctp.sock cimport *
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    13
from py cimport raise_errno
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
7
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    16
cimport socket.addr
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    18
cdef size_t addrsoup_len (object addrs) except -1 :
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
        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
    21
    """
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
7
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    23
    cdef socket.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
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    30
    return addr_size
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    31
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    32
cdef addrsoup_store (object addrs, char *addr_buf) :
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
        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
    35
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    36
7
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    37
    cdef socket.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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    54
def sctp_bindx (int sd, object addrs, int flags) :
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    55
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    56
        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
    57
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    58
            sd          the system socket FD
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    59
            addresses   the list of qmsk.net.sock.addr.sockaddr's
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    60
            flags       one of SCTP_BINDX_ADD/REM_ADDR
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    61
        
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    62
    """
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
    # ensure that addrs stays the same... ?
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    65
    addrs = tuple(addrs)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    66
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    67
    # alloc buffer to hold all the sockaddr_*'s
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    68
    cdef char *addr_buf = <char *> libc.alloca(addrsoup_len(addrs))
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    69
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    70
    # store
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    71
    addrsoup_store(addrs, addr_buf)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    72
2
171e77f8d675 re-implement sctp_bindx using new sock_addr
Tero Marttila <terom@fixme.fi>
parents: 1
diff changeset
    73
    # then call
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    74
    if c_sctp_bindx(sd, <libc.sockaddr *> addr_buf, len(addrs), flags) < 0 :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    75
        raise_errno('sctp_bindx')
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    77
def sctp_connectx (int sd, object addrs) :
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    78
    """
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    79
        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
    80
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    81
            sd          the system socket FD
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    82
            addresses   the list of qmsk.net.sock.addr.sockaddr's
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    83
        
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    84
    """
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
    # ensure that addrs stays the same... ?
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    87
    addrs = tuple(addrs)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    88
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    89
    # alloc buffer to hold all the sockaddr_*'s
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    90
    cdef char *addr_buf = <char *> libc.alloca(addrsoup_len(addrs))
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    91
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    92
    # store
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    93
    addrsoup_store(addrs, addr_buf)
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    94
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    95
    # then call
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    96
    if c_sctp_connectx(sd, <libc.sockaddr *> addr_buf, len(addrs)) < 0 :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents: 5
diff changeset
    97
        raise_errno('sctp_connectx')
5
59bed837c265 implement addrinfo stuff
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
    98