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