Correct feature names
[ACE_TAO.git] / ACE / ace / OS_NS_stropts.cpp
blobbdcd3317c7f1075078e0d4c4d7a240c84b667f5e
1 #include "ace/OS_NS_stropts.h"
5 #if !defined (ACE_HAS_INLINED_OSCALLS)
6 # include "ace/OS_NS_stropts.inl"
7 #endif /* ACE_HAS_INLINED_OSCALLS */
9 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
11 int
12 ACE_OS::ioctl (ACE_HANDLE socket,
13 unsigned long io_control_code,
14 void *in_buffer_p,
15 unsigned long in_buffer,
16 void *out_buffer_p,
17 unsigned long out_buffer,
18 unsigned long *bytes_returned,
19 ACE_OVERLAPPED *overlapped,
20 ACE_OVERLAPPED_COMPLETION_FUNC func)
22 # if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
23 ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
24 io_control_code,
25 in_buffer_p,
26 in_buffer,
27 out_buffer_p,
28 out_buffer,
29 bytes_returned,
30 (WSAOVERLAPPED *) overlapped,
31 func),
32 int,
33 SOCKET_ERROR);
34 # else
35 ACE_UNUSED_ARG (socket);
36 ACE_UNUSED_ARG (io_control_code);
37 ACE_UNUSED_ARG (in_buffer_p);
38 ACE_UNUSED_ARG (in_buffer);
39 ACE_UNUSED_ARG (out_buffer_p);
40 ACE_UNUSED_ARG (out_buffer);
41 ACE_UNUSED_ARG (bytes_returned);
42 ACE_UNUSED_ARG (overlapped);
43 ACE_UNUSED_ARG (func);
44 ACE_NOTSUP_RETURN (-1);
45 # endif /* ACE_HAS_WINSOCK2 */
48 int
49 ACE_OS::ioctl (ACE_HANDLE socket,
50 unsigned long io_control_code,
51 ACE_QoS &ace_qos,
52 unsigned long *bytes_returned,
53 void *buffer_p,
54 unsigned long buffer,
55 ACE_OVERLAPPED *overlapped,
56 ACE_OVERLAPPED_COMPLETION_FUNC func)
58 # if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
59 if (io_control_code == SIO_SET_QOS)
61 QOS qos;
62 unsigned long qos_len = sizeof (QOS);
64 qos.SendingFlowspec = *(ace_qos.sending_flowspec ());
65 qos.ReceivingFlowspec = *(ace_qos.receiving_flowspec ());
66 qos.ProviderSpecific = (WSABUF) ace_qos.provider_specific ();
68 qos_len += ace_qos.provider_specific ().iov_len;
70 ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
71 io_control_code,
72 &qos,
73 qos_len,
74 buffer_p,
75 buffer,
76 bytes_returned,
77 (WSAOVERLAPPED *) overlapped,
78 func),
79 int,
80 SOCKET_ERROR);
82 else
84 unsigned long dwBufferLen = 0;
86 // Query for the buffer size.
87 int result = ::WSAIoctl ((ACE_SOCKET) socket,
88 io_control_code,
91 &dwBufferLen,
92 sizeof (dwBufferLen),
93 bytes_returned,
95 0);
98 if (result == SOCKET_ERROR)
100 unsigned long dwErr = ::WSAGetLastError ();
102 if (dwErr == WSAEWOULDBLOCK)
104 errno = dwErr;
105 return -1;
107 else
108 if (dwErr != WSAENOBUFS)
110 errno = dwErr;
111 return -1;
115 char *qos_buf = 0;
116 ACE_NEW_RETURN (qos_buf,
117 char [dwBufferLen],
118 -1);
120 QOS *qos = reinterpret_cast<QOS*> (qos_buf);
122 result = ::WSAIoctl ((ACE_SOCKET) socket,
123 io_control_code,
126 qos,
127 dwBufferLen,
128 bytes_returned,
132 if (result == SOCKET_ERROR)
133 return result;
135 ACE_Flow_Spec sending_flowspec (qos->SendingFlowspec.TokenRate,
136 qos->SendingFlowspec.TokenBucketSize,
137 qos->SendingFlowspec.PeakBandwidth,
138 qos->SendingFlowspec.Latency,
139 qos->SendingFlowspec.DelayVariation,
140 # if defined(ACE_HAS_WINSOCK2_GQOS)
141 qos->SendingFlowspec.ServiceType,
142 qos->SendingFlowspec.MaxSduSize,
143 qos->SendingFlowspec.MinimumPolicedSize,
144 # else /* ACE_HAS_WINSOCK2_GQOS */
148 # endif /* ACE_HAS_WINSOCK2_GQOS */
152 ACE_Flow_Spec receiving_flowspec (qos->ReceivingFlowspec.TokenRate,
153 qos->ReceivingFlowspec.TokenBucketSize,
154 qos->ReceivingFlowspec.PeakBandwidth,
155 qos->ReceivingFlowspec.Latency,
156 qos->ReceivingFlowspec.DelayVariation,
157 # if defined(ACE_HAS_WINSOCK2_GQOS)
158 qos->ReceivingFlowspec.ServiceType,
159 qos->ReceivingFlowspec.MaxSduSize,
160 qos->ReceivingFlowspec.MinimumPolicedSize,
161 # else /* ACE_HAS_WINSOCK2_GQOS */
165 # endif /* ACE_HAS_WINSOCK2_GQOS */
169 ace_qos.sending_flowspec (&sending_flowspec);
170 ace_qos.receiving_flowspec (&receiving_flowspec);
171 ace_qos.provider_specific (*((struct iovec *) (&qos->ProviderSpecific)));
174 return result;
177 # else
178 ACE_UNUSED_ARG (socket);
179 ACE_UNUSED_ARG (io_control_code);
180 ACE_UNUSED_ARG (ace_qos);
181 ACE_UNUSED_ARG (bytes_returned);
182 ACE_UNUSED_ARG (buffer_p);
183 ACE_UNUSED_ARG (buffer);
184 ACE_UNUSED_ARG (overlapped);
185 ACE_UNUSED_ARG (func);
186 ACE_NOTSUP_RETURN (-1);
187 # endif /* ACE_HAS_WINSOCK2 */
190 ACE_END_VERSIONED_NAMESPACE_DECL