summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvishal <vishal@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-10-21 21:32:57 +0000
committervishal <vishal@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-10-21 21:32:57 +0000
commit4721595878177493ea364b507201d1294d57ffa2 (patch)
treea78c2bd2ebe261cccf07dd2988f3f9ec3ae3f623
parent74dcdcb7d8e36cb67b48995c8086ed6a81a1bb19 (diff)
downloadATCD-4721595878177493ea364b507201d1294d57ffa2.tar.gz
*** empty log message ***
-rw-r--r--ace/OS.i62
1 files changed, 43 insertions, 19 deletions
diff --git a/ace/OS.i b/ace/OS.i
index 906fde17894..7528857de22 100644
--- a/ace/OS.i
+++ b/ace/OS.i
@@ -5268,18 +5268,18 @@ ACE_OS::ioctl (ACE_HANDLE socket,
ACE_OVERLAPPED_COMPLETION_FUNC func)
{
#if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
-
+
QOS qos;
DWORD qos_len = sizeof (QOS);
-
+
if (io_control_code == SIO_SET_QOS)
{
qos.SendingFlowspec = ace_qos.sending_flowspec ();
qos.ReceivingFlowspec = ace_qos.receiving_flowspec ();
qos.ProviderSpecific = (WSABUF) ace_qos.provider_specific ();
-
+
qos_len += ace_qos.provider_specific ().iov_len;
-
+
ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
io_control_code,
&qos,
@@ -5294,18 +5294,39 @@ ACE_OS::ioctl (ACE_HANDLE socket,
}
else
{
-
- ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
- io_control_code,
- buffer_p,
- buffer,
- &qos,
- qos_len,
- bytes_returned,
- (WSAOVERLAPPED *) overlapped,
- func),
- int,
- SOCKET_ERROR);
+ qos.ProviderSpecific.len = 0xFFFFFFFF;
+ qos.ProviderSpecific.buf = NULL;
+
+ // Query for the buffer size.
+ int result = ::WSAIoctl ((ACE_SOCKET) socket,
+ io_control_code,
+ buffer_p,
+ buffer,
+ &qos,
+ qos_len,
+ bytes_returned,
+ (WSAOVERLAPPED *) overlapped,
+ func);
+
+ if (result == SOCKET_ERROR)
+ errno = ::WSAGetLastError ();
+ else
+ {
+ // Allocate a buffer if the Provider Specific info is present.
+ if (qos.ProviderSpecific.len > 0)
+ ACE_NEW_RETURN (qos.ProviderSpecific.buf,
+ char [qos.ProviderSpecific.len],
+ -1);
+
+ result = ::WSAIoctl ((ACE_SOCKET) socket,
+ io_control_code,
+ buffer_p,
+ buffer,
+ &qos,
+ qos_len,
+ bytes_returned,
+ (WSAOVERLAPPED *) overlapped,
+ func);
ACE_Flow_Spec sending_flowspec (qos.SendingFlowspec.TokenRate,
qos.SendingFlowspec.TokenBucketSize,
@@ -5323,7 +5344,7 @@ ACE_OS::ioctl (ACE_HANDLE socket,
#endif /* ACE_HAS_WINSOCK2_GQOS */
0,
0);
-
+
ACE_Flow_Spec receiving_flowspec (qos.ReceivingFlowspec.TokenRate,
qos.ReceivingFlowspec.TokenBucketSize,
qos.ReceivingFlowspec.PeakBandwidth,
@@ -5340,12 +5361,15 @@ ACE_OS::ioctl (ACE_HANDLE socket,
#endif /* ACE_HAS_WINSOCK2_GQOS */
0,
0);
-
+
ace_qos.sending_flowspec (sending_flowspec);
ace_qos.receiving_flowspec (receiving_flowspec);
ace_qos.provider_specific (*((struct iovec *) (&qos.ProviderSpecific)));
- }
+ }
+ return result;
+}
+
#else
ACE_UNUSED_ARG (socket);
ACE_UNUSED_ARG (io_control_code);