qmsk/net/socket/socket.pyx
author Tero Marttila <terom@fixme.fi>
Fri, 25 Sep 2009 21:34:04 +0300
changeset 49 e2f79e68418a
parent 27 12468e38227e
child 53 b2d407968973
permissions -rw-r--r--
fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
7
74fde84264b1 broke Cython with this package magic
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
     1
from qmsk.net.socket.socket cimport *
49
e2f79e68418a fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
     2
from qmsk.net.socket._address cimport sockaddr
e2f79e68418a fix up circular cimports related to the sockaddr type, and touch up endpoint/getaddrinfo a bit
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
     3
from qmsk.net.socket.address cimport build_sockaddr
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
     4
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
     5
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
     6
cimport qmsk.net.libc as libc, qmsk.net.py as py
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
11
7ae92c2b433f move libc+py back to qmsk.net.x
Tero Marttila <terom@fixme.fi>
parents: 10
diff changeset
     8
from qmsk.net.py cimport raise_errno
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    10
cdef parse_sockaddr (platform.sockaddr **sa_ptr, platform.socklen_t *sa_len, sockaddr addr, int optional = 0) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    11
    if addr is not None :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    12
        addr._get_sockaddr(sa_ptr, sa_len)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    13
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    14
    elif optional :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    15
        sa_ptr[0] = NULL
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    16
        sa_len[0] = 0
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    17
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    18
    else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    19
        raise ValueError(addr)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    20
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    21
cdef parse_buf (void **buf_ptr, size_t *buf_len, object buf, int optional = 0) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    22
    cdef libc.ssize_t tmp_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    23
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    24
    if buf is not None :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    25
        # XXX: test that except works right
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
    26
        # XXX: this complains about const...
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    27
        py.PyObject_AsCharBuffer(buf, <char **> buf_ptr, &tmp_len)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    28
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    29
        # XXX: ensure that this is >= 0
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    30
        buf_len[0] = tmp_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    31
    
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    32
    elif optional :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    33
        buf_ptr[0] = NULL
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    34
        buf_len[0] = 0
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    35
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    36
    else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    37
        raise ValueError(buf)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
    38
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    39
## helper for socket.recv*
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    40
# XXX: make sure these don't leak the PyString in case of errors...
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    41
cdef struct sockbuf :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    42
    py.PyObject *str
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    43
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    44
cdef char* sockbuf_init (sockbuf *buf, size_t len) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    45
    """
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    46
        Initialize the sockbuf to contain a PyString that can hold `len` bytes, and return a pointer into its
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    47
        contents as a char*.
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    48
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    49
        Note that this requires use of a try-finally with sockbuf_deinit...
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    50
    """
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    51
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    52
    buf.str = py.PyString_FromStringAndSize(NULL, len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    53
    
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    54
    return py.PyString_AS_STRING(buf.str)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    55
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    56
cdef object sockbuf_truncate (sockbuf *buf, size_t len) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    57
    """
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    58
        Truncate the given sockbuf's PyString to the given length, and return the PyObject*
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    59
    """
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    60
    
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    61
    # optimize for the no-need-to-resize case
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    62
    # this also fixes behaviour for zero-length strings (heh), since they're interned and can't be resized
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    63
    if len != py.PyString_GET_SIZE(buf.str) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    64
        py._PyString_Resize(&buf.str, len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    65
    
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    66
    return <object> buf.str
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    67
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    68
cdef void sockbuf_deinit (sockbuf *buf) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    69
    """
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    70
        Release the PyObject.
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    71
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    72
        This is safe if the sockbuf was initialized to zero.
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    73
    """
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    74
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    75
    py.Py_XDECREF(buf.str)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
    76
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
# XXX: do some GIL-releasin'
8
b3880dafbab1 phew, things are working
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    78
cdef class socket :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    80
    def __cinit__ (self) :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        """
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    82
            Initialize the socket to set fd to -1, so that we dont't try and close stdin too often :)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    85
        self.fd = -1
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    87
    def __init__ (self, int family = platform.AF_INET, int socktype = platform.SOCK_STREAM, int protocol = 0, int fd = -1) :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        """
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    89
            Create a new socket endpoint with the given family/domain, socktype and optionally, specific protocol,
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    90
            unless the fd argument is given as >= 0, in which case it used directly.
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
                family      - one of AF_*
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
                socktype    - one of SOCK_*
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
                protocol    - one of IPPROTO_* or zero to select default
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    97
        if fd >= 0 :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    98
            # given fd
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    99
            self.fd = fd
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   100
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   101
        else :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   102
            # socket()
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   103
            self.fd = platform.socket(family, socktype, protocol)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
        
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
        # trap
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        if self.fd < 0 :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
            raise_errno('socket')
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   109
    def fileno (self) :
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   110
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   111
            Returns the OS-level file desriptor for this socket as an integer
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   112
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   113
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   114
        return self.fd
19
e6b670dbfe3b socket.setblocking
Tero Marttila <terom@fixme.fi>
parents: 18
diff changeset
   115
    
24
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   116
#    # XXX: does this *really* belong here?
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   117
#    def setblocking (self, bint blocking = True) :
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   118
#        """
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   119
#            Control the OS-level nonblocking-IO mode flag for this socket.
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   120
#
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   121
#                blocking    - True for normal blocking operation, False to use non-blocking operation
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   122
#        """
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   123
#        
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   124
#        # fcntl magic
f18b5787c46c reorganize socket, adding af_inet/af_inet6 modules, and moving sctp in
Tero Marttila <terom@fixme.fi>
parents: 20
diff changeset
   125
#        libc.fcntl_set_flag(self.fd, libc.O_NONBLOCK, not blocking)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   126
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    def bind (self, sockaddr addr) :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
            Bind this socket to the given local socket address. The given sockaddr should be of the same or a
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
            compatible address family.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
                addr        - the local address to bind to. The port may be zero to let the system choose an unused
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
                              ephemeral port.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   136
        cdef platform.sockaddr *sa
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   137
        cdef platform.socklen_t sa_len
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   138
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   139
        # XXX: require non-NULL addr?
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   140
        parse_sockaddr(&sa, &sa_len, addr, 1)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
        # bind()
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   143
        if platform.bind(self.fd, sa, sa_len) :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
            raise_errno('bind')
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
    def listen (self, int backlog) :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
            Listen for connections, marking this socket as a passive socket, which can accept incoming connection
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
            requests using sock.accept().
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
            It is customary to call .bind() before .listen().
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
                backlog     - maximum number of pending connections (those not yet .accept()'d).
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
        
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
        # listen()
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   157
        if platform.listen(self.fd, backlog) :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
            raise_errno('listen')
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
    def connect (self, sockaddr addr) :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
            Initiate a connection, connecting this socket to the remote endpoint specified by `addr`. The given sockaddr
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
            should be of the same or a compatible address family.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
            If the socket is in non-blocking mode, this will presumeably return errno.EINPROGRESS.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
            If the socket has not yet been bound (using .bind()), the system will pick an appropriate local address and
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
            ephemeral port.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
                addr        - the remote address to connect to.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   173
        cdef platform.sockaddr *sa
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   174
        cdef platform.socklen_t sa_len
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   176
        # XXX: require non-NULL addr?
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   177
        parse_sockaddr(&sa, &sa_len, addr, 1)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
        
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
        # connect()
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   180
        if platform.connect(self.fd, sa, sa_len) :
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
            raise_errno('connect')
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    def accept (self) :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
            Accept a connection, dequeueing the first pending connection and returning a new sock object for it. This
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
            socket must be a connection-based socket (SOCK_STREAM/SOCK_SEQPACKET) and in the passive listening mode
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
            (.listen()).
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   189
            This returns a (sock, src_addr) tuple:
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
                sock        - the newly created sock, corresponding to the incoming connection
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   191
                src_addr    - the remote address of the incoming connection
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
        # prep the sockaddr that we will return
10
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   195
        cdef platform.sockaddr_storage ss
94b0d5a208c1 split up socket.platform
Tero Marttila <terom@fixme.fi>
parents: 8
diff changeset
   196
        cdef platform.socklen_t ss_len = sizeof(ss)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
        # accept()
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   199
        cdef socket_t sock_fd = platform.accept(self.fd, <platform.sockaddr *> &ss, &ss_len)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
        if sock_fd < 0 :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
            raise_errno('accept')
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   203
        
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   204
        try :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   205
            # prep the new socket
15
8e7037cc05c7 fix socket.accept, and add simple PyString_Resize code
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   206
            sock_obj = socket(fd=sock_fd)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   208
        except :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   209
            # XXX: don't leak the socket fd? How does socket.__init__ handle this?
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   210
            platform.close(sock_fd)
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   211
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   212
            raise
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
        # prep the new addr
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   215
        cdef sockaddr src_addr = build_sockaddr(<platform.sockaddr *> &ss, ss_len)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   217
        return sock_obj, src_addr
18
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   218
    
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   219
    def getsockname (self) :
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   220
        """
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   221
            Get the local address this socket is currently bound to. This can be set using bind(), or automatically.
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   222
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   223
            Returns a sockaddr object.
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   224
        """
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   225
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   226
        # prep the sockaddr that we will return
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   227
        cdef platform.sockaddr_storage ss
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   228
        cdef platform.socklen_t ss_len = sizeof(ss)
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   229
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   230
        # getsockname()
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   231
        if platform.getsockname(self.fd, <platform.sockaddr *> &ss, &ss_len) :
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   232
            raise_errno('getsockname')
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   233
        
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   234
        # build the new sockaddr
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   235
        return build_sockaddr(<platform.sockaddr *> &ss, ss_len)
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   236
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   237
    def getpeername (self) :
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   238
        """
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   239
            Get the remote address this socket is currently connected to.
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   240
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   241
            Returns a sockaddr object.
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   242
        """
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   243
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   244
        # prep the sockaddr that we will return
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   245
        cdef platform.sockaddr_storage ss
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   246
        cdef platform.socklen_t ss_len = sizeof(ss)
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   247
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   248
        # getpeername()
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   249
        if platform.getpeername(self.fd, <platform.sockaddr *> &ss, &ss_len) :
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   250
            raise_errno('getpeername')
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   251
        
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   252
        # build the new sockaddr
43a57943af9f getsockname/getpeername
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   253
        return build_sockaddr(<platform.sockaddr *> &ss, ss_len)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
    def send (self, object buf, int flags = 0) :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
            Transmit a message to the connected remote endpoint.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   259
                buf         - the data to send
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   260
                flags       - (optional) MSG_* flags to send with
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
            Returns the number of bytes sent, which may be less than the length of buf.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   265
        cdef void *buf_ptr
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   266
        cdef size_t buf_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   267
        cdef libc.ssize_t ret
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   269
        parse_buf(&buf_ptr, &buf_len, buf, 0)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   270
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
        # send()
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   272
        ret = platform.send(self.fd, buf_ptr, buf_len, flags)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
        
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
        if ret < 0 :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
            raise_errno('send')
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
        else :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
            return ret
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   280
    def sendto (self, object buf, int flags = 0, sockaddr addr = None) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   281
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   282
            Transmit a message to the given remote endpoint. If this socket is connected, the addr must not be
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   283
            specified, and this acts like send()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   284
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   285
                buf         - the data to send
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   286
                flags       - (optional) MSG_* flags to send with
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   287
                addr        - (optional) target address
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   288
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   289
            Returns the number of bytes sent, which may be less than the length of buf.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   290
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   291
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   292
        cdef void *buf_ptr
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   293
        cdef size_t buf_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   294
        cdef libc.ssize_t ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   295
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   296
        cdef platform.sockaddr *sa
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   297
        cdef platform.socklen_t sa_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   298
       
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   299
        parse_sockaddr(&sa, &sa_len, addr, 1)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   300
        parse_buf(&buf_ptr, &buf_len, buf, 0)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   301
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   302
        # send()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   303
        ret = platform.sendto(self.fd, buf_ptr, buf_len, flags, sa, sa_len)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   304
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   305
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   306
            raise_errno('sendto')
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   307
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   308
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   309
            return ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   310
    
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   311
    def sendmsg (self, sockaddr addr = None, iov = None, control = None, int flags = 0) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   312
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   313
            Transmit an extended message to the given remote endpoint (or default for connected sockets) with the given
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   314
            extra parameters.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   315
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   316
                addr        - (optional) destination address (struct msghdr::msg_name)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   317
                iov         - (optional) sequence of read-buffers to transmit
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   318
                control     - (optional) control message to transmit
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   319
                flags       - (optional) MSG_* flags to send with
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   320
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   321
            Returns the number of bytes sent, which may be less than the total length of iov.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   322
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   323
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   324
        cdef libc.ssize_t ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   325
        cdef libc.iovec *iovec
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   326
        cdef platform.msghdr msg
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   327
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   328
        libc.memset(&msg, 0, sizeof(msg))
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   329
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   330
        parse_sockaddr(<platform.sockaddr **> &msg.msg_name, &msg.msg_namelen, addr, 1)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   331
        parse_buf(&msg.msg_control, &msg.msg_controllen, control, 1)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   332
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   333
        # iov
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   334
        if iov :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   335
            iov = tuple(iov)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   336
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   337
            # numerb of bufs = number of iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   338
            msg.msg_iovlen = len(iov)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   339
                
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   340
            # alloca the required number of iovec's
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   341
            msg.msg_iov = <libc.iovec *> libc.alloca(msg.msg_iovlen * sizeof(libc.iovec))
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   342
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   343
            # fill in the iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   344
            for i, buf in enumerate(iov) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   345
                iovec = &msg.msg_iov[i]
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   346
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   347
                parse_buf(&iovec.iov_base, &iovec.iov_len, buf, 1)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   348
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   349
        # sendmsg()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   350
        ret = platform.sendmsg(self.fd, &msg, flags)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   351
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   352
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   353
            raise_errno('sendmsg')
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   354
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   355
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   356
            return ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   357
       
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   358
    def write (self, object buf) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   359
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   360
            Write data to socket, mostly equivalent to send() with flags=0.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   361
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   362
                buf         - the data to send
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   363
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   364
            Returns the number of bytes sent, which may be less than the length of buf.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   365
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   366
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   367
        cdef void *buf_ptr
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   368
        cdef size_t buf_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   369
        cdef libc.ssize_t ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   370
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   371
        parse_buf(&buf_ptr, &buf_len, buf, 0)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   372
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   373
        # send()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   374
        ret = libc.write(self.fd, buf_ptr, buf_len)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   375
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   376
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   377
            raise_errno('write')
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   378
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   379
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   380
            return ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   381
    
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   382
    def writev (self, iov) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   383
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   384
            Write data to a socket from multiple read-buffers.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   385
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   386
                iov         - sequence of read-buffers to transmit
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   387
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   388
            Returns the number of bytes sent, which may be less than the total length of iov.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   389
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   390
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   391
        # iov
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   392
        cdef libc.iovec *iov_list = NULL
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   393
        cdef size_t iov_count = 0
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   394
        cdef libc.iovec *iovec
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   395
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   396
        iov = tuple(iov)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   397
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   398
        # numerb of bufs = number of iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   399
        iov_count = len(iov)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   400
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   401
        # alloca the required number of iovec's
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   402
        iov_list = <libc.iovec *> libc.alloca(iov_count * sizeof(libc.iovec))
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   403
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   404
        # fill in the iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   405
        for i, buf in enumerate(iov) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   406
            iovec = &iov_list[i]
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   407
                
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   408
            parse_buf(&iovec.iov_base, &iovec.iov_len, buf, 1)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   409
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   410
        # sendmsg()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   411
        ret = libc.writev(self.fd, iov_list, iov_count)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   412
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   413
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   414
            raise_errno('writev')
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   415
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   416
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   417
            return ret
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   418
    
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   419
    def recv (self, size_t len, int flags = 0) :
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   420
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   421
            Recieve a message, reading and returning at most `len` bytes.
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   422
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   423
                len         - size of buffer to use for recv
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   424
                flags       - (optional) MSG_* flags to use for recv()
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   425
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   426
            Returns the recieved data as a newly allocated string of the correct length.
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   427
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   428
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   429
        cdef sockbuf sb
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   430
        cdef libc.ssize_t ret
15
8e7037cc05c7 fix socket.accept, and add simple PyString_Resize code
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   431
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   432
        # alloc the recv buffer
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   433
        cdef char *buf = sockbuf_init(&sb, len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   434
        
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   435
        try :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   436
            # recv()
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   437
            ret = platform.recv(self.fd, buf, len, flags)
15
8e7037cc05c7 fix socket.accept, and add simple PyString_Resize code
Tero Marttila <terom@fixme.fi>
parents: 14
diff changeset
   438
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   439
            if ret < 0 :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   440
                raise_errno('recv')
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   441
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   442
            # truncate to correct length
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   443
            return sockbuf_truncate(&sb, ret)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   444
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   445
        finally :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   446
            sockbuf_deinit(&sb)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   447
    
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   448
    def recvfrom (self, size_t len, int flags = 0) :
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   449
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   450
            Recieve a message, reading at most `len` bytes, also returning the source address.
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   451
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   452
                len         - size of buffer to use for recv
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   453
                flags       - (optional) MSG_* flags to use for recvfrom()
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   454
            
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   455
            Returns the recieved data and the source address as a (buf, src_addr) tuple :
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   456
                buf         - a newly allocated string containing the recieved data, of the correct length
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   457
                src_addr    - the source address the message was recieved from
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   458
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   459
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   460
        cdef sockbuf sb
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   461
        cdef libc.ssize_t ret
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   462
        cdef object str
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   463
        cdef sockaddr src_addr
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   464
            
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   465
        # prep the sockaddr that we will return
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   466
        cdef platform.sockaddr_storage ss
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   467
        cdef platform.socklen_t ss_len = sizeof(ss)
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   468
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   469
        # alloc recv buf
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   470
        cdef char *buf = sockbuf_init(&sb, len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   471
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   472
        try :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   473
            # recvfrom()
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   474
            ret = platform.recvfrom(self.fd, buf, len, flags, <platform.sockaddr *> &ss, &ss_len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   475
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   476
            if ret < 0 :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   477
                raise_errno('recv')
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   478
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   479
            # truncate
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   480
            str = sockbuf_truncate(&sb, ret)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   481
            
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   482
            # prep the new addr
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   483
            src_addr = build_sockaddr(<platform.sockaddr *> &ss, ss_len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   484
            
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   485
            return str, src_addr
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   486
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   487
        finally :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   488
            sockbuf_deinit(&sb)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   489
    
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   490
    def recvmsg (self, bint recv_addr = True, object iov_lens = None, size_t control_len = 0, int flags = 0) :
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   491
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   492
            Recieve a message along with some extra data.
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   493
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   494
                recv_addr   - ask for and return a sockaddr for the source address of the message?
17
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   495
                iov_lens    - (optional) sequence of buffer sizes to use for the message data iov
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   496
                control_len - (optional) amount of auxiliary data to recieve
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   497
                flags       - (optional) flags to pass to recvmsg()
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   498
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   499
            Returns a (name, iovs, control, flags) tuple :
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   500
                name        - the source address of the message, or None
27
12468e38227e [socket] add sockaddr_un (still dysfunctional\!) + doc fixes
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   501
                iovs        - sequence of buffers containing the recieved data corresponding to the iov_lens.
12468e38227e [socket] add sockaddr_un (still dysfunctional\!) + doc fixes
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   502
                              This may contain fewer buffers than iov_lens if there was insufficient data to fill all buffers.
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   503
                control     - string containing recieved control message, if any
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   504
                flags       - recieved flags
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   505
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   506
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   507
        cdef platform.msghdr msg
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   508
        cdef sockbuf *sb_list, *sb, cmsg_sb
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   509
        cdef libc.iovec *iovec
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   510
        cdef size_t iov_len, i, msg_len
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   511
        cdef libc.ssize_t ret
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   512
        cdef sockaddr name = None 
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   513
        cdef object iovs = None
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   514
        cdef object control = None
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   515
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   516
        libc.memset(&msg, 0, sizeof(msg))
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   517
        libc.memset(&cmsg_sb, 0, sizeof(cmsg_sb))
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   518
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   519
        # prep the sockaddr that we will return
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   520
        cdef platform.sockaddr_storage ss
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   521
        
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   522
        # ask for a name?
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   523
        if recv_addr :
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   524
            msg.msg_name = <void *> &ss
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   525
            msg.msg_namelen = sizeof(ss)
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   526
        
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   527
        try :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   528
            # build iov?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   529
            if iov_lens :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   530
                # stabilize
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   531
                iov_lens = tuple(iov_lens)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   532
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   533
                msg.msg_iovlen = len(iov_lens)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   534
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   535
                # alloc each iov plus a sockbuf for storing the PyString
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   536
                msg.msg_iov = <libc.iovec *> libc.alloca(msg.msg_iovlen * sizeof(libc.iovec))
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   537
                sb_list = <sockbuf *> libc.alloca(msg.msg_iovlen * sizeof(sockbuf))
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   538
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   539
                # zero out so we can cleanup
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   540
                libc.memset(sb_list, 0, msg.msg_iovlen * sizeof(sockbuf))
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   541
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   542
                # build each
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   543
                for i, iov_len in enumerate(iov_lens) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   544
                    # the associated iovec/sockbuf
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   545
                    iovec = &msg.msg_iov[i]
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   546
                    sb = &sb_list[i]
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   547
                    
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   548
                    # set up the sockbuf and iovec
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   549
                    iovec.iov_base = sockbuf_init(&sb_list[i], iov_len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   550
                    iovec.iov_len = iov_len
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   551
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   552
            # build control buffer?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   553
            if control_len :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   554
                msg.msg_control = sockbuf_init(&cmsg_sb, control_len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   555
                msg.msg_controllen = control_len
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   556
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   557
            # recvmsg()
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   558
            ret = platform.recvmsg(self.fd, &msg, flags)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   559
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   560
            if ret < 0 :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   561
                raise_errno('recvmsg')
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   562
            
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   563
            # name?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   564
            if msg.msg_name and msg.msg_namelen :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   565
                # build a sockaddr for the name
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   566
                name = build_sockaddr(<platform.sockaddr *> msg.msg_name, msg.msg_namelen)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   567
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   568
            # iov?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   569
            if ret :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   570
                assert msg.msg_iov and msg.msg_iovlen
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   571
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   572
                iovs = []
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   573
                msg_len = ret
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   574
                i = 0
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   575
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   576
                # consume iov's until we have all the data we need
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   577
                while msg_len :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   578
                    # sanity-check
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   579
                    assert i < msg.msg_iovlen
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   580
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   581
                    # get the associated iovec/sockbuf
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   582
                    iovec = &msg.msg_iov[i]
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   583
                    sb = &sb_list[i]
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   584
                    
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   585
                    # calc the size of this iov
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   586
                    # XXX: cdef
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   587
                    iov_len = min(msg_len, iovec.iov_len)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   588
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   589
                    # add it as a string
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   590
                    iovs.append(sockbuf_truncate(sb, iov_len))
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   591
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   592
                    # advance
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   593
                    msg_len -= iov_len
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   594
                    i += 1
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   595
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   596
            # control?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   597
            if msg.msg_control and msg.msg_controllen :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   598
                # build the PyString for the control message
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   599
                control = sockbuf_truncate(&cmsg_sb, msg.msg_controllen)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   600
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   601
            return name, iovs, control, msg.msg_flags
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   602
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   603
        finally :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   604
            # cleanup
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   605
            sockbuf_deinit(&cmsg_sb)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   606
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   607
            for i in range(msg.msg_iovlen) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   608
                sockbuf_deinit(&sb_list[i])
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   609
17
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   610
    def read (self, size_t len) :
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   611
        """
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   612
            Read data from a socket, mostly equivalent to a recv() with flags=0.
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   613
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   614
                len         - size of buffer to use for recv
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   615
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   616
            Returns the recieved data as a newly allocated string of the correct length.
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   617
        """
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   618
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   619
        cdef sockbuf sb
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   620
        cdef libc.ssize_t ret
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   621
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   622
        # alloc the recv buffer
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   623
        cdef char *buf = sockbuf_init(&sb, len)
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   624
        
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   625
        try :
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   626
            # recv()
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   627
            ret = libc.read(self.fd, buf, len)
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   628
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   629
            if ret < 0 :
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   630
                raise_errno('read')
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   631
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   632
            # truncate to correct length
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   633
            return sockbuf_truncate(&sb, ret)
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   634
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   635
        finally :
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   636
            sockbuf_deinit(&sb)
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   637
    
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   638
    def readv (self, object iov_lens) :
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   639
        """
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   640
            Read data from a socket into multiple buffers.
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   641
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   642
                iov_lens    - sequence of buffer sizes to use as iovs
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   643
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   644
            Returns a sequence of strings containing the recieved data corresponding to the iov_lens.
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   645
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   646
            XXX: implement using real readv instead of faking it with recvmsg...
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   647
        """
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   648
        
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   649
        # fake using recvmsg
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   650
        _, iovs, _, _ = self.recvmsg(recv_addr=False, iov_lens=iov_lens)
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   651
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   652
        return iovs
5f4077a530b0 add repr for sockaddr, and implment read for sockets, plus a recvmsg wrapper called readv...
Tero Marttila <terom@fixme.fi>
parents: 16
diff changeset
   653
13
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   654
    def shutdown (self, how) :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   655
        """
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   656
            Shutdown part of a full-duplex connection. 
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   657
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   658
                how         - one of SHUT_*
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   659
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   660
            This does not affect this socket's fd.
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   661
        """
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   662
        
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   663
        # shutdown()
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   664
        if platform.shutdown(self.fd, how) :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   665
            raise_errno('shutdown')
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   666
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   667
    def close (self) :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   668
        """
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   669
            Close the socket fd if we have one, invalidating it if succesful.
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   670
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   671
            Note that this will raise an error and keep the fd if the system close() returns an error.
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   672
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   673
            Calling this again after a succesfull close() does nothing.
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   674
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   675
            XXX: SO_LINGER/blocking?
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   676
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   677
            >>> s = socket()
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   678
            >>> s.fd >= 0
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   679
            True
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   680
            >>> s.close()
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   681
            >>> s.fd >= 0
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   682
            False
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   683
            >>> s.close()
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   684
        """
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   685
        
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   686
        # ignore if already closed
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   687
        if self.fd < 0 :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   688
            return
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   689
        
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   690
        # close()
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   691
        if libc.close(self.fd) :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   692
            raise_errno('close')
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   693
        
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   694
        # invalidate
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   695
        self.fd = -1
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   696
    
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   697
    def __dealloc__ (self) :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   698
        """
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   699
            Close the socket fd if one is set, ignoring any errors from close
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   700
        """
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   701
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   702
        if self.fd >= 0 :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   703
            if libc.close(self.fd) :
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   704
                # XXX: at least warn... ?
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   705
                pass
a1091632a8a7 implement __cinit__, shutdown, close, __dealloc__ for socket, and also add a try-except to not leak client sock from accept()
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   706