Asynchronous accepts now work, the rest should go smoothly :-)
authorSamuel Cormier-Iijima <sciyoshi@gmail.com>
Wed, 27 Feb 2008 05:08:58 +0000 (00:08 -0500)
committerSamuel Cormier-Iijima <sciyoshi@gmail.com>
Wed, 27 Feb 2008 05:08:58 +0000 (00:08 -0500)
gnio/gsocket.c
test/test-server.c

index 9a61e11..f6c586e 100644 (file)
@@ -194,7 +194,7 @@ g_socket_set_blocking (GSocket  *socket,
   if ((arg = fcntl (socket->priv->fd, F_GETFL, NULL)) < 0)
     g_warning ("Error getting socket status flags: %s", g_strerror (errno));
 
-  arg = blocking ? arg | O_NONBLOCK : arg & ~O_NONBLOCK;
+  arg = blocking ? arg & ~O_NONBLOCK : arg | O_NONBLOCK;
 
   if (fcntl (socket->priv->fd, F_SETFL, arg) < 0)
     g_warning ("Error setting socket status flags: %s", g_strerror (errno));
@@ -299,9 +299,30 @@ accept_callback (AcceptData *data,
                  GIOCondition condition,
                  gint fd)
 {
+  GSocket *socket;
+  GSimpleAsyncResult *result;
+  gint ret;
+
+  socket = data->socket;
+
   if (condition & G_IO_IN)
     {
-      g_print ("WE COULD ACCEPT HERE\n");
+      if ((ret = accept (socket->priv->fd, NULL, 0)) < 0)
+        {
+          if (errno == EAGAIN)
+            return TRUE;
+
+          result = g_simple_async_result_new_error (G_OBJECT (socket), data->callback, data->user_data, G_IO_ERROR, g_io_error_from_errno (errno), "error accepting connection");
+        }
+      else
+        {
+          result = g_simple_async_result_new (G_OBJECT (socket), data->callback, data->user_data, g_socket_accept_async);
+
+          g_simple_async_result_set_op_res_gpointer (result, g_socket_new_from_fd (ret), g_object_unref);
+        }
+      g_simple_async_result_complete (result);
+
+      g_object_unref (result);
     }
 
   return FALSE;
@@ -360,7 +381,18 @@ g_socket_accept_finish (GSocket       *socket,
                         GAsyncResult  *result,
                         GError       **error)
 {
-  return NULL;
+  GSocket *new_socket;
+  GSimpleAsyncResult *simple;
+
+  g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
+
+  simple = G_SIMPLE_ASYNC_RESULT (result);
+
+  g_warn_if_fail (g_simple_async_result_get_source_tag (simple) == g_socket_accept_async);
+
+  new_socket = g_object_ref (g_simple_async_result_get_op_res_gpointer (simple));
+
+  return new_socket;
 }
 
 gboolean
index 7507a98..9a7c9d6 100644 (file)
@@ -8,10 +8,24 @@
 
 GMainLoop *loop;
 
-int main (int argc, char *argv[])
+void
+accept_callback (GSocket *socket, GAsyncResult *result, gpointer data)
 {
-       GSocket *socket, *new_socket;
+       GSocket *new_socket;
        GSocketAddress *address;
+       GError *error = NULL;
+
+       new_socket = g_socket_accept_finish (socket, result, &error);
+
+       address = g_socket_get_peer_address (new_socket, NULL);
+
+       g_printf ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)));
+
+}
+
+int main (int argc, char *argv[])
+{
+       GSocket *socket;
 
        g_thread_init (NULL);
 
@@ -27,13 +41,9 @@ int main (int argc, char *argv[])
 
        g_printf ("listening on port 31882...\n");
 
-       new_socket = g_socket_accept (socket, NULL, NULL);
-
-       address = g_socket_get_peer_address (new_socket, NULL);
-
-       g_printf ("got a new connection from %s:%d\n", g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address))), g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address)));
+       g_socket_accept_async (socket, NULL, (GAsyncReadyCallback) accept_callback, NULL);
 
-//     g_main_loop_run (loop);
+       g_main_loop_run (loop);
 
        return 0;
 }