acceptex.pxi 1.2 KB

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