PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/dep/acelite/ace/OS_NS_stropts.cpp

https://github.com/chucho/FaceCore
C++ | 193 lines | 165 code | 26 blank | 2 comment | 20 complexity | 113bc2d11dafe2a6bf1d2ef24c58ab5a MD5 | raw file
  1. // $Id: OS_NS_stropts.cpp 91286 2010-08-05 09:04:31Z johnnyw $
  2. #include "ace/OS_NS_stropts.h"
  3. #if !defined (ACE_HAS_INLINED_OSCALLS)
  4. # include "ace/OS_NS_stropts.inl"
  5. #endif /* ACE_HAS_INLINED_OSCALLS */
  6. ACE_BEGIN_VERSIONED_NAMESPACE_DECL
  7. int
  8. ACE_OS::ioctl (ACE_HANDLE socket,
  9. unsigned long io_control_code,
  10. void *in_buffer_p,
  11. unsigned long in_buffer,
  12. void *out_buffer_p,
  13. unsigned long out_buffer,
  14. unsigned long *bytes_returned,
  15. ACE_OVERLAPPED *overlapped,
  16. ACE_OVERLAPPED_COMPLETION_FUNC func)
  17. {
  18. # if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
  19. ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
  20. io_control_code,
  21. in_buffer_p,
  22. in_buffer,
  23. out_buffer_p,
  24. out_buffer,
  25. bytes_returned,
  26. (WSAOVERLAPPED *) overlapped,
  27. func),
  28. int,
  29. SOCKET_ERROR);
  30. # else
  31. ACE_UNUSED_ARG (socket);
  32. ACE_UNUSED_ARG (io_control_code);
  33. ACE_UNUSED_ARG (in_buffer_p);
  34. ACE_UNUSED_ARG (in_buffer);
  35. ACE_UNUSED_ARG (out_buffer_p);
  36. ACE_UNUSED_ARG (out_buffer);
  37. ACE_UNUSED_ARG (bytes_returned);
  38. ACE_UNUSED_ARG (overlapped);
  39. ACE_UNUSED_ARG (func);
  40. ACE_NOTSUP_RETURN (-1);
  41. # endif /* ACE_HAS_WINSOCK2 */
  42. }
  43. int
  44. ACE_OS::ioctl (ACE_HANDLE socket,
  45. unsigned long io_control_code,
  46. ACE_QoS &ace_qos,
  47. unsigned long *bytes_returned,
  48. void *buffer_p,
  49. unsigned long buffer,
  50. ACE_OVERLAPPED *overlapped,
  51. ACE_OVERLAPPED_COMPLETION_FUNC func)
  52. {
  53. # if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
  54. QOS qos;
  55. unsigned long qos_len = sizeof (QOS);
  56. if (io_control_code == SIO_SET_QOS)
  57. {
  58. qos.SendingFlowspec = *(ace_qos.sending_flowspec ());
  59. qos.ReceivingFlowspec = *(ace_qos.receiving_flowspec ());
  60. qos.ProviderSpecific = (WSABUF) ace_qos.provider_specific ();
  61. qos_len += ace_qos.provider_specific ().iov_len;
  62. ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
  63. io_control_code,
  64. &qos,
  65. qos_len,
  66. buffer_p,
  67. buffer,
  68. bytes_returned,
  69. (WSAOVERLAPPED *) overlapped,
  70. func),
  71. int,
  72. SOCKET_ERROR);
  73. }
  74. else
  75. {
  76. unsigned long dwBufferLen = 0;
  77. // Query for the buffer size.
  78. int result = ::WSAIoctl ((ACE_SOCKET) socket,
  79. io_control_code,
  80. 0,
  81. 0,
  82. &dwBufferLen,
  83. sizeof (dwBufferLen),
  84. bytes_returned,
  85. 0,
  86. 0);
  87. if (result == SOCKET_ERROR)
  88. {
  89. unsigned long dwErr = ::WSAGetLastError ();
  90. if (dwErr == WSAEWOULDBLOCK)
  91. {
  92. errno = dwErr;
  93. return -1;
  94. }
  95. else
  96. if (dwErr != WSAENOBUFS)
  97. {
  98. errno = dwErr;
  99. return -1;
  100. }
  101. }
  102. char *qos_buf = 0;
  103. ACE_NEW_RETURN (qos_buf,
  104. char [dwBufferLen],
  105. -1);
  106. QOS *qos = reinterpret_cast<QOS*> (qos_buf);
  107. result = ::WSAIoctl ((ACE_SOCKET) socket,
  108. io_control_code,
  109. 0,
  110. 0,
  111. qos,
  112. dwBufferLen,
  113. bytes_returned,
  114. 0,
  115. 0);
  116. if (result == SOCKET_ERROR)
  117. return result;
  118. ACE_Flow_Spec sending_flowspec (qos->SendingFlowspec.TokenRate,
  119. qos->SendingFlowspec.TokenBucketSize,
  120. qos->SendingFlowspec.PeakBandwidth,
  121. qos->SendingFlowspec.Latency,
  122. qos->SendingFlowspec.DelayVariation,
  123. # if defined(ACE_HAS_WINSOCK2_GQOS)
  124. qos->SendingFlowspec.ServiceType,
  125. qos->SendingFlowspec.MaxSduSize,
  126. qos->SendingFlowspec.MinimumPolicedSize,
  127. # else /* ACE_HAS_WINSOCK2_GQOS */
  128. 0,
  129. 0,
  130. 0,
  131. # endif /* ACE_HAS_WINSOCK2_GQOS */
  132. 0,
  133. 0);
  134. ACE_Flow_Spec receiving_flowspec (qos->ReceivingFlowspec.TokenRate,
  135. qos->ReceivingFlowspec.TokenBucketSize,
  136. qos->ReceivingFlowspec.PeakBandwidth,
  137. qos->ReceivingFlowspec.Latency,
  138. qos->ReceivingFlowspec.DelayVariation,
  139. # if defined(ACE_HAS_WINSOCK2_GQOS)
  140. qos->ReceivingFlowspec.ServiceType,
  141. qos->ReceivingFlowspec.MaxSduSize,
  142. qos->ReceivingFlowspec.MinimumPolicedSize,
  143. # else /* ACE_HAS_WINSOCK2_GQOS */
  144. 0,
  145. 0,
  146. 0,
  147. # endif /* ACE_HAS_WINSOCK2_GQOS */
  148. 0,
  149. 0);
  150. ace_qos.sending_flowspec (&sending_flowspec);
  151. ace_qos.receiving_flowspec (&receiving_flowspec);
  152. ace_qos.provider_specific (*((struct iovec *) (&qos->ProviderSpecific)));
  153. return result;
  154. }
  155. # else
  156. ACE_UNUSED_ARG (socket);
  157. ACE_UNUSED_ARG (io_control_code);
  158. ACE_UNUSED_ARG (ace_qos);
  159. ACE_UNUSED_ARG (bytes_returned);
  160. ACE_UNUSED_ARG (buffer_p);
  161. ACE_UNUSED_ARG (buffer);
  162. ACE_UNUSED_ARG (overlapped);
  163. ACE_UNUSED_ARG (func);
  164. ACE_NOTSUP_RETURN (-1);
  165. # endif /* ACE_HAS_WINSOCK2 */
  166. }
  167. ACE_END_VERSIONED_NAMESPACE_DECL