00001
00002
00003 #include "ace/OS_NS_stropts.h"
00004
00005 ACE_RCSID(ace, OS_NS_stropts, "$Id: OS_NS_stropts.cpp 85460 2009-05-29 13:38:50Z msmit $")
00006
00007 #if !defined (ACE_HAS_INLINED_OSCALLS)
00008 # include "ace/OS_NS_stropts.inl"
00009 #endif
00010
00011 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00012
00013 int
00014 ACE_OS::ioctl (ACE_HANDLE socket,
00015 unsigned long io_control_code,
00016 void *in_buffer_p,
00017 unsigned long in_buffer,
00018 void *out_buffer_p,
00019 unsigned long out_buffer,
00020 unsigned long *bytes_returned,
00021 ACE_OVERLAPPED *overlapped,
00022 ACE_OVERLAPPED_COMPLETION_FUNC func)
00023 {
00024 # if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
00025 ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
00026 io_control_code,
00027 in_buffer_p,
00028 in_buffer,
00029 out_buffer_p,
00030 out_buffer,
00031 bytes_returned,
00032 (WSAOVERLAPPED *) overlapped,
00033 func),
00034 int,
00035 SOCKET_ERROR);
00036 # else
00037 ACE_UNUSED_ARG (socket);
00038 ACE_UNUSED_ARG (io_control_code);
00039 ACE_UNUSED_ARG (in_buffer_p);
00040 ACE_UNUSED_ARG (in_buffer);
00041 ACE_UNUSED_ARG (out_buffer_p);
00042 ACE_UNUSED_ARG (out_buffer);
00043 ACE_UNUSED_ARG (bytes_returned);
00044 ACE_UNUSED_ARG (overlapped);
00045 ACE_UNUSED_ARG (func);
00046 ACE_NOTSUP_RETURN (-1);
00047 # endif
00048 }
00049
00050 int
00051 ACE_OS::ioctl (ACE_HANDLE socket,
00052 unsigned long io_control_code,
00053 ACE_QoS &ace_qos,
00054 unsigned long *bytes_returned,
00055 void *buffer_p,
00056 unsigned long buffer,
00057 ACE_OVERLAPPED *overlapped,
00058 ACE_OVERLAPPED_COMPLETION_FUNC func)
00059 {
00060 # if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0)
00061
00062 QOS qos;
00063 unsigned long qos_len = sizeof (QOS);
00064
00065 if (io_control_code == SIO_SET_QOS)
00066 {
00067 qos.SendingFlowspec = *(ace_qos.sending_flowspec ());
00068 qos.ReceivingFlowspec = *(ace_qos.receiving_flowspec ());
00069 qos.ProviderSpecific = (WSABUF) ace_qos.provider_specific ();
00070
00071 qos_len += ace_qos.provider_specific ().iov_len;
00072
00073 ACE_SOCKCALL_RETURN (::WSAIoctl ((ACE_SOCKET) socket,
00074 io_control_code,
00075 &qos,
00076 qos_len,
00077 buffer_p,
00078 buffer,
00079 bytes_returned,
00080 (WSAOVERLAPPED *) overlapped,
00081 func),
00082 int,
00083 SOCKET_ERROR);
00084 }
00085 else
00086 {
00087 unsigned long dwBufferLen = 0;
00088
00089
00090 int result = ::WSAIoctl ((ACE_SOCKET) socket,
00091 io_control_code,
00092 0,
00093 0,
00094 &dwBufferLen,
00095 sizeof (dwBufferLen),
00096 bytes_returned,
00097 0,
00098 0);
00099
00100
00101 if (result == SOCKET_ERROR)
00102 {
00103 unsigned long dwErr = ::WSAGetLastError ();
00104
00105 if (dwErr == WSAEWOULDBLOCK)
00106 {
00107 errno = dwErr;
00108 return -1;
00109 }
00110 else
00111 if (dwErr != WSAENOBUFS)
00112 {
00113 errno = dwErr;
00114 return -1;
00115 }
00116 }
00117
00118 char *qos_buf = 0;
00119 ACE_NEW_RETURN (qos_buf,
00120 char [dwBufferLen],
00121 -1);
00122
00123 QOS *qos = reinterpret_cast<QOS*> (qos_buf);
00124
00125 result = ::WSAIoctl ((ACE_SOCKET) socket,
00126 io_control_code,
00127 0,
00128 0,
00129 qos,
00130 dwBufferLen,
00131 bytes_returned,
00132 0,
00133 0);
00134
00135 if (result == SOCKET_ERROR)
00136 return result;
00137
00138 ACE_Flow_Spec sending_flowspec (qos->SendingFlowspec.TokenRate,
00139 qos->SendingFlowspec.TokenBucketSize,
00140 qos->SendingFlowspec.PeakBandwidth,
00141 qos->SendingFlowspec.Latency,
00142 qos->SendingFlowspec.DelayVariation,
00143 # if defined(ACE_HAS_WINSOCK2_GQOS)
00144 qos->SendingFlowspec.ServiceType,
00145 qos->SendingFlowspec.MaxSduSize,
00146 qos->SendingFlowspec.MinimumPolicedSize,
00147 # else
00148 0,
00149 0,
00150 0,
00151 # endif
00152 0,
00153 0);
00154
00155 ACE_Flow_Spec receiving_flowspec (qos->ReceivingFlowspec.TokenRate,
00156 qos->ReceivingFlowspec.TokenBucketSize,
00157 qos->ReceivingFlowspec.PeakBandwidth,
00158 qos->ReceivingFlowspec.Latency,
00159 qos->ReceivingFlowspec.DelayVariation,
00160 # if defined(ACE_HAS_WINSOCK2_GQOS)
00161 qos->ReceivingFlowspec.ServiceType,
00162 qos->ReceivingFlowspec.MaxSduSize,
00163 qos->ReceivingFlowspec.MinimumPolicedSize,
00164 # else
00165 0,
00166 0,
00167 0,
00168 # endif
00169 0,
00170 0);
00171
00172 ace_qos.sending_flowspec (&sending_flowspec);
00173 ace_qos.receiving_flowspec (&receiving_flowspec);
00174 ace_qos.provider_specific (*((struct iovec *) (&qos->ProviderSpecific)));
00175
00176
00177 return result;
00178 }
00179
00180 # else
00181 ACE_UNUSED_ARG (socket);
00182 ACE_UNUSED_ARG (io_control_code);
00183 ACE_UNUSED_ARG (ace_qos);
00184 ACE_UNUSED_ARG (bytes_returned);
00185 ACE_UNUSED_ARG (buffer_p);
00186 ACE_UNUSED_ARG (buffer);
00187 ACE_UNUSED_ARG (overlapped);
00188 ACE_UNUSED_ARG (func);
00189 ACE_NOTSUP_RETURN (-1);
00190 # endif
00191 }
00192
00193 ACE_END_VERSIONED_NAMESPACE_DECL