GSocket is done.
[cascardo/gnio.git] / gnio / gsocket.c
index 1a095ef..9f9a5ac 100644 (file)
@@ -255,7 +255,7 @@ g_socket_new (GSocketDomain domain, GSocketType type, const gchar *protocol, GEr
       return NULL;
     }
 
-  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, NULL));
+  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, "blocking", TRUE, NULL));
 }
 
 GSocket *
@@ -267,9 +267,9 @@ g_socket_new_from_fd (gint fd)
   if ((arg = fcntl (fd, F_GETFL, NULL)) < 0)
     g_warning ("Error getting socket status flags: %s", g_strerror (errno));
 
-  blocking = ((arg & O_NONBLOCK) != 0);
+  blocking = ((arg & O_NONBLOCK) == 0);
 
-  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "blocking", blocking, "fd", fd, NULL));
+  return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, "blocking", blocking, NULL));
 }
 
 void
@@ -304,7 +304,7 @@ g_socket_get_local_address (GSocket  *socket,
                             GError  **error)
 {
   gchar buffer[256];
-  gsize len;
+  gsize len = 256;
 
   g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
 
@@ -325,7 +325,7 @@ g_socket_get_remote_address (GSocket  *socket,
                              GError  **error)
 {
   gchar buffer[256];
-  gsize len;
+  gsize len = 256;
 
   g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
 
@@ -416,3 +416,41 @@ g_socket_connect (GSocket         *socket,
 
   return TRUE;
 }
+
+gssize
+g_socket_receive (GSocket       *socket,
+                  gchar         *buffer,
+                  gsize          size,
+                  GError       **error)
+{
+  gssize ret;
+
+  g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, FALSE);
+
+  if ((ret = recv (socket->priv->fd, buffer, size, 0)) < 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "error receiving data: %s", g_strerror (errno));
+      return -1;
+    }
+
+  return ret;
+}
+
+gssize
+g_socket_send (GSocket       *socket,
+               gchar         *buffer,
+               gsize          size,
+               GError       **error)
+{
+  gssize ret;
+
+  g_return_val_if_fail (G_IS_SOCKET (socket) && buffer != NULL, FALSE);
+
+  if ((ret = send (socket->priv->fd, buffer, size, 0)) < 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "error receiving data: %s", g_strerror (errno));
+      return -1;
+    }
+
+  return ret;
+}