1# Copyright (c) Twisted Matrix Laboratories.
2# See LICENSE for details.
3
4
5def accept(long listening, long accepting, object buff, object obj):
6    """
7    CAUTION: unlike system AcceptEx(), this function returns 0 on success
8    """
9    cdef unsigned long bytes
10    cdef int rc
11    cdef Py_ssize_t size
12    cdef void *mem_buffer
13    cdef myOVERLAPPED *ov
14
15    PyObject_AsWriteBuffer(buff, &mem_buffer, &size)
16
17    ov = makeOV()
18    if obj is not None:
19        ov.obj = <PyObject *>obj
20
21    rc = lpAcceptEx(listening, accepting, mem_buffer, 0,
22                    <DWORD>size / 2, <DWORD>size / 2,
23                    &bytes, <OVERLAPPED *>ov)
24    if not rc:
25        rc = WSAGetLastError()
26        if rc != ERROR_IO_PENDING:
27            PyMem_Free(ov)
28            return rc
29
30    # operation is in progress
31    Py_XINCREF(obj)
32    return 0
33
34def get_accept_addrs(long s, object buff):
35    cdef WSAPROTOCOL_INFO wsa_pi
36    cdef int locallen, remotelen
37    cdef Py_ssize_t size
38    cdef void *mem_buffer
39    cdef sockaddr *localaddr, *remoteaddr
40
41    PyObject_AsReadBuffer(buff, &mem_buffer, &size)
42
43    lpGetAcceptExSockaddrs(mem_buffer, 0, <DWORD>size / 2, <DWORD>size / 2,
44                           &localaddr, &locallen, &remoteaddr, &remotelen)
45    return remoteaddr.sa_family, _makesockaddr(localaddr, locallen), _makesockaddr(remoteaddr, remotelen)
46
47