sctp/sock.pyx
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--
moar fixes
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
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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
4
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    17
cdef extern from "Python.h" :
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    18
    struct PyObject :
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    19
        pass
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    20
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    21
    PyObject* PyErr_SetFromErrno (PyObject *type)
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    22
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    23
    PyObject* PyExc_OSError
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    24
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    25
cdef int raise_errno () except -1 :
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    26
    PyErr_SetFromErrno(PyExc_OSError)
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    27
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    28
    return -1
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
            flags       one of SCTP_BINDX_ADD/REM_ADDR
4
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    37
        
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    """
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    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
664a1dfe08ac moar fixes
Tero Marttila <terom@fixme.fi>
parents: 3
diff changeset
    71
        raise_errno()
0
975801b28d85 initial code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72