qmsk/net/socket/socket.pyx
author Tero Marttila <terom@fixme.fi>
Sat, 26 Sep 2009 21:51:46 +0300
changeset 53 b2d407968973
parent 49 e2f79e68418a
permissions -rw-r--r--
experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
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)
53
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   254
    
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   255
    def getsockopt_int (self, int level, int opt) :
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   256
        """
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   257
            Get and return the integer value of the given socket option.
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   258
        """
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   259
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   260
        cdef int val
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   261
        cdef platform.socklen_t val_len = sizeof(val)
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   262
        
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   263
        # run
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   264
        if platform.getsockopt(self.fd, level, opt, <void *> &val, &val_len) :
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   265
            raise_errno('getsockopt')
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   266
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   267
        # check value length
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   268
        if val_len != sizeof(val) :
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   269
            raise ValueError("value length: %d, should be: %d" % (val_len, sizeof(val)))
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   270
b2d407968973 experimental getsockopt support in socket - for now only SOL_SOCKET/SO_ERROR
Tero Marttila <terom@fixme.fi>
parents: 49
diff changeset
   271
        return val
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
    def send (self, object buf, int flags = 0) :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
            Transmit a message to the connected remote endpoint.
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   277
                buf         - the data to send
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   278
                flags       - (optional) MSG_* flags to send with
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
            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
   281
        """
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   283
        cdef void *buf_ptr
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   284
        cdef size_t buf_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   285
        cdef libc.ssize_t ret
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   287
        parse_buf(&buf_ptr, &buf_len, buf, 0)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   288
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
        # send()
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   290
        ret = platform.send(self.fd, buf_ptr, buf_len, flags)
6
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
        
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
        if ret < 0 :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
            raise_errno('send')
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
        else :
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
            return ret
10bd48c9b6ce socket type, mass rename
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
12
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   298
    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
   299
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   300
            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
   301
            specified, and this acts like send()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   302
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   303
                buf         - the data to send
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   304
                flags       - (optional) MSG_* flags to send with
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   305
                addr        - (optional) target address
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   306
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   307
            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
   308
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   309
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   310
        cdef void *buf_ptr
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   311
        cdef size_t buf_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   312
        cdef libc.ssize_t ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   313
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   314
        cdef platform.sockaddr *sa
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   315
        cdef platform.socklen_t sa_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   316
       
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   317
        parse_sockaddr(&sa, &sa_len, addr, 1)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   318
        parse_buf(&buf_ptr, &buf_len, buf, 0)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   319
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   320
        # send()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   321
        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
   322
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   323
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   324
            raise_errno('sendto')
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   325
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   326
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   327
            return ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   328
    
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   329
    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
   330
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   331
            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
   332
            extra parameters.
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   333
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   334
                addr        - (optional) destination address (struct msghdr::msg_name)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   335
                iov         - (optional) sequence of read-buffers to transmit
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   336
                control     - (optional) control message to transmit
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   337
                flags       - (optional) MSG_* flags to send with
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   338
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   339
            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
   340
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   341
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   342
        cdef libc.ssize_t ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   343
        cdef libc.iovec *iovec
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   344
        cdef platform.msghdr msg
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   345
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   346
        libc.memset(&msg, 0, sizeof(msg))
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   347
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   348
        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
   349
        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
   350
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   351
        # iov
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   352
        if iov :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   353
            iov = tuple(iov)
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
            # numerb of bufs = number of iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   356
            msg.msg_iovlen = len(iov)
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
            # alloca the required number of iovec's
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   359
            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
   360
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   361
            # fill in the iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   362
            for i, buf in enumerate(iov) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   363
                iovec = &msg.msg_iov[i]
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   364
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   365
                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
   366
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   367
        # sendmsg()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   368
        ret = platform.sendmsg(self.fd, &msg, flags)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   369
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   370
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   371
            raise_errno('sendmsg')
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
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   374
            return ret
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
    def write (self, object buf) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   377
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   378
            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
   379
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   380
                buf         - the data to send
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
            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
   383
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   384
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   385
        cdef void *buf_ptr
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   386
        cdef size_t buf_len
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   387
        cdef libc.ssize_t ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   388
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   389
        parse_buf(&buf_ptr, &buf_len, buf, 0)
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
        # send()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   392
        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
   393
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   394
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   395
            raise_errno('write')
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   396
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   397
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   398
            return ret
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   399
    
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   400
    def writev (self, iov) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   401
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   402
            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
   403
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   404
                iov         - sequence of read-buffers to transmit
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   405
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   406
            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
   407
        """
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   408
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   409
        # iov
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   410
        cdef libc.iovec *iov_list = NULL
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   411
        cdef size_t iov_count = 0
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   412
        cdef libc.iovec *iovec
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   413
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   414
        iov = tuple(iov)
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
        # numerb of bufs = number of iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   417
        iov_count = len(iov)
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   418
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   419
        # alloca the required number of iovec's
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   420
        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
   421
        
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   422
        # fill in the iovecs
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   423
        for i, buf in enumerate(iov) :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   424
            iovec = &iov_list[i]
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   425
                
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   426
            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
   427
            
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   428
        # sendmsg()
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   429
        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
   430
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   431
        if ret < 0 :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   432
            raise_errno('writev')
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   433
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   434
        else :
314d47bdd4d9 full range of send/write operations
Tero Marttila <terom@fixme.fi>
parents: 11
diff changeset
   435
            return ret
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   436
    
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   437
    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
   438
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   439
            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
   440
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   441
                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
   442
                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
   443
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   444
            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
   445
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   446
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   447
        cdef sockbuf sb
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   448
        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
   449
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   450
        # alloc the recv buffer
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   451
        cdef char *buf = sockbuf_init(&sb, len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   452
        
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   453
        try :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   454
            # recv()
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   455
            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
   456
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   457
            if ret < 0 :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   458
                raise_errno('recv')
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   459
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   460
            # truncate to correct length
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   461
            return sockbuf_truncate(&sb, ret)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   462
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   463
        finally :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   464
            sockbuf_deinit(&sb)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   465
    
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   466
    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
   467
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   468
            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
   469
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   470
                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
   471
                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
   472
            
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   473
            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
   474
                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
   475
                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
   476
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   477
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   478
        cdef sockbuf sb
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   479
        cdef libc.ssize_t ret
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   480
        cdef object str
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   481
        cdef sockaddr src_addr
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   482
            
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   483
        # 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
   484
        cdef platform.sockaddr_storage ss
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   485
        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
   486
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   487
        # alloc recv buf
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   488
        cdef char *buf = sockbuf_init(&sb, len)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   489
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   490
        try :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   491
            # recvfrom()
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   492
            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
   493
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   494
            if ret < 0 :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   495
                raise_errno('recv')
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   496
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   497
            # truncate
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   498
            str = sockbuf_truncate(&sb, ret)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   499
            
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   500
            # prep the new addr
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   501
            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
   502
            
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   503
            return str, src_addr
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   504
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   505
        finally :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   506
            sockbuf_deinit(&sb)
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   507
    
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   508
    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
   509
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   510
            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
   511
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   512
                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
   513
                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
   514
                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
   515
                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
   516
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   517
            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
   518
                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
   519
                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
   520
                              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
   521
                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
   522
                flags       - recieved flags
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   523
        """
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   524
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   525
        cdef platform.msghdr msg
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   526
        cdef sockbuf *sb_list, *sb, cmsg_sb
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   527
        cdef libc.iovec *iovec
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   528
        cdef size_t iov_len, i, msg_len
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   529
        cdef libc.ssize_t ret
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   530
        cdef sockaddr name = None 
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   531
        cdef object iovs = None
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   532
        cdef object control = None
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   533
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   534
        libc.memset(&msg, 0, sizeof(msg))
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   535
        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
   536
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   537
        # 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
   538
        cdef platform.sockaddr_storage ss
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   539
        
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   540
        # ask for a name?
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   541
        if recv_addr :
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   542
            msg.msg_name = <void *> &ss
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   543
            msg.msg_namelen = sizeof(ss)
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   544
        
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   545
        try :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   546
            # build iov?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   547
            if iov_lens :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   548
                # stabilize
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   549
                iov_lens = tuple(iov_lens)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   550
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   551
                msg.msg_iovlen = len(iov_lens)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   552
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   553
                # 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
   554
                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
   555
                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
   556
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   557
                # zero out so we can cleanup
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   558
                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
   559
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   560
                # build each
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   561
                for i, iov_len in enumerate(iov_lens) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   562
                    # the associated iovec/sockbuf
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   563
                    iovec = &msg.msg_iov[i]
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   564
                    sb = &sb_list[i]
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   565
                    
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   566
                    # set up the sockbuf and iovec
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   567
                    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
   568
                    iovec.iov_len = iov_len
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   569
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   570
            # build control buffer?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   571
            if control_len :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   572
                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
   573
                msg.msg_controllen = control_len
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   574
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   575
            # recvmsg()
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   576
            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
   577
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   578
            if ret < 0 :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   579
                raise_errno('recvmsg')
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
            # name?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   582
            if msg.msg_name and msg.msg_namelen :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   583
                # build a sockaddr for the name
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   584
                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
   585
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   586
            # iov?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   587
            if ret :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   588
                assert msg.msg_iov and msg.msg_iovlen
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   589
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   590
                iovs = []
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   591
                msg_len = ret
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   592
                i = 0
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   593
                
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   594
                # 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
   595
                while msg_len :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   596
                    # sanity-check
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   597
                    assert i < msg.msg_iovlen
14
c44754cc1ffe some recv magic, still no PyString_Resize, though
Tero Marttila <terom@fixme.fi>
parents: 13
diff changeset
   598
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   599
                    # get the associated iovec/sockbuf
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   600
                    iovec = &msg.msg_iov[i]
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   601
                    sb = &sb_list[i]
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
                    # calc the size of this iov
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   604
                    # XXX: cdef
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   605
                    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
   606
16
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   607
                    # add it as a string
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   608
                    iovs.append(sockbuf_truncate(sb, iov_len))
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   609
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   610
                    # advance
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   611
                    msg_len -= iov_len
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   612
                    i += 1
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   613
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   614
            # control?
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   615
            if msg.msg_control and msg.msg_controllen :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   616
                # build the PyString for the control message
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   617
                control = sockbuf_truncate(&cmsg_sb, msg.msg_controllen)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   618
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   619
            return name, iovs, control, msg.msg_flags
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   620
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   621
        finally :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   622
            # cleanup
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   623
            sockbuf_deinit(&cmsg_sb)
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   624
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   625
            for i in range(msg.msg_iovlen) :
24ce1035b338 sockbuf stuff and fully implement recvmsg
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   626
                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
   627
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
   628
    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
   629
        """
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
            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
   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
                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
   633
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
            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
   635
        """
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
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
        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
   638
        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
   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
        # 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
   641
        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
   642
        
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
        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
   644
            # 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
   645
            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
   646
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
            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
   648
                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
   649
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
            # 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
   651
            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
   652
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
        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
   654
            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
   655
    
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
   656
    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
   657
        """
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
   658
            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
   659
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
   660
                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
   661
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
   662
            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
   663
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
   664
            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
   665
        """
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
   666
        
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
   667
        # 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
   668
        _, 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
   669
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
   670
        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
   671
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
   672
    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
   673
        """
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
            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
   675
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
                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
   677
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
            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
   679
        """
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
        
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
        # 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
   682
        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
   683
            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
   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
    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
   686
        """
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
            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
   688
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
            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
   690
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
            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
   692
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
            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
   694
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
            >>> 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
   696
            >>> 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
   697
            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
   698
            >>> 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
   699
            >>> 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
   700
            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
   701
            >>> 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
   702
        """
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
        
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
        # 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
   705
        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
   706
            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
   707
        
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
   708
        # 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
   709
        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
   710
            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
   711
        
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
   712
        # 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
   713
        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
   714
    
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
   715
    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
   716
        """
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
   717
            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
   718
        """
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
   719
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
   720
        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
   721
            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
   722
                # 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
   723
                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
   724