+ g_return_if_fail (G_IS_SOCKET (socket) && G_IS_SOCKET_ADDRESS (address));
+
+ if (g_socket_get_blocking (socket))
+ g_socket_set_blocking (socket, FALSE);
+
+ g_socket_address_to_native (address, buffer);
+
+ len = g_socket_address_native_size (address);
+
+ if ((ret = connect (socket->priv->fd, (struct sockaddr *) buffer, len)) < 0)
+ {
+ if (errno == EINPROGRESS)
+ {
+ source = _g_fd_source_new (socket->priv->fd, G_IO_OUT | G_IO_ERR, cancellable);
+
+ data = g_new (ConnectData, 1);
+
+ data->socket = socket;
+ data->callback = callback;
+ data->cancellable = cancellable;
+ data->user_data = user_data;
+ data->address_length = len;
+ memcpy (data->address_buffer, buffer, len);
+
+ g_source_set_callback (source, (GSourceFunc) connect_callback, data, g_free);
+
+ g_source_attach (source, NULL);
+ }
+ else
+ {
+ g_simple_async_report_error_in_idle (G_OBJECT (socket), callback, user_data, G_IO_ERROR, g_io_error_from_errno (errno), "error connecting: %s", g_strerror (errno));
+ }
+ }
+ else
+ {
+ result = g_simple_async_result_new (G_OBJECT (socket), callback, user_data, g_socket_connect_async);
+
+ g_simple_async_result_complete_in_idle (result);
+
+ g_object_unref (result);
+ }