+int
+WSAIoctl (guint32 fd, gint32 command,
+ gchar *input, gint i_len,
+ gchar *output, gint o_len, glong *written,
+ void *unused1, void *unused2)
+{
+ gpointer handle = GUINT_TO_POINTER (fd);
+ int ret;
+ gchar *buffer = NULL;
+
+ if (startup_count == 0) {
+ WSASetLastError (WSANOTINITIALISED);
+ return(SOCKET_ERROR);
+ }
+
+ if (_wapi_handle_type (handle) != WAPI_HANDLE_SOCKET) {
+ WSASetLastError (WSAENOTSOCK);
+ return SOCKET_ERROR;
+ }
+
+ if (i_len > 0) {
+ buffer = g_memdup (input, i_len);
+ }
+
+ ret = ioctl (fd, command, buffer);
+ if (ret == -1) {
+ gint errnum = errno;
+#ifdef DEBUG
+ g_message("%s: WSAIoctl error: %s", __func__,
+ strerror (errno));
+#endif
+
+ errnum = errno_to_WSA (errnum, __func__);
+ WSASetLastError (errnum);
+ g_free (buffer);
+
+ return(SOCKET_ERROR);
+ }
+
+ if (buffer == NULL) {
+ *written = 0;
+ } else {
+ /* We just copy the buffer to the output. Some ioctls
+ * don't even output any data, but, well...
+ */
+ i_len = (i_len > o_len) ? o_len : i_len;
+ memcpy (output, buffer, i_len);
+ g_free (buffer);
+ *written = i_len;
+ }
+
+ return(0);
+}
+
+int ioctlsocket(guint32 fd, gint32 command, gpointer arg)