Fix build on 64-bit systems
[cascardo/gnio.git] / gnio / gsocket.c
index 9e234a0..eb89367 100644 (file)
@@ -24,7 +24,7 @@
 #include <config.h>
 #include <glib.h>
 #include <gio/gio.h>
-#include <gio/gasynchelper.h>
+#include "gasynchelper.h"
 
 #include <string.h>
 #ifndef G_OS_WIN32
@@ -70,7 +70,10 @@ struct _GSocketPrivate
 };
 
 static void
-g_socket_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+g_socket_get_property (GObject    *object,
+                       guint       prop_id,
+                       GValue     *value,
+                       GParamSpec *pspec)
 {
   GSocket *socket = G_SOCKET (object);
 
@@ -106,7 +109,10 @@ g_socket_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec
 }
 
 static void
-g_socket_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+g_socket_set_property (GObject      *object,
+                       guint         prop_id,
+                       const GValue *value,
+                       GParamSpec   *pspec)
 {
   GSocket *socket = G_SOCKET (object);
 
@@ -198,6 +204,13 @@ g_socket_class_init (GSocketClass *klass)
                                                      10,
                                                      G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK));
 
+  g_object_class_install_property (gobject_class, PROP_REUSE_ADDRESS,
+                                   g_param_spec_boolean ("reuse-address",
+                                                         "reuse address",
+                                                         "allow reuse of local addresses when binding",
+                                                         FALSE,
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK));
+
   g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS,
                                    g_param_spec_object ("local-address",
                                                         "local address",
@@ -327,6 +340,8 @@ g_socket_set_blocking (GSocket  *socket,
     g_warning ("Error setting socket status flags: %s", g_strerror (errno));
 
   socket->priv->blocking = blocking;
+
+  g_object_notify (G_OBJECT (socket), "blocking");
 }
 
 gboolean
@@ -349,6 +364,8 @@ g_socket_set_reuse_address (GSocket  *socket,
     g_warning ("error setting reuse address: %s", g_strerror (errno));
 
   socket->priv->reuse_address = reuse;
+
+  g_object_notify (G_OBJECT (socket), "reuse-address");
 }
 
 gboolean
@@ -359,12 +376,36 @@ g_socket_get_reuse_address (GSocket *socket)
   return socket->priv->reuse_address;
 }
 
+gboolean
+g_socket_has_socket_error (GSocket  *socket,
+                           GError  **error)
+{
+  gint sockerr;
+  guint32 sockerr_size = sizeof (sockerr);
+
+  g_return_val_if_fail (G_IS_SOCKET (socket), FALSE);
+
+  if (getsockopt (socket->priv->fd, SOL_SOCKET, SO_ERROR, (gpointer) &sockerr, &sockerr_size) < 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errno), "could not get socket error: %s", g_strerror (errno));
+      return TRUE;
+    }
+
+  if (sockerr != 0)
+    {
+      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (sockerr), "error connecting: %s", g_strerror (sockerr));
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 GSocketAddress *
 g_socket_get_local_address (GSocket  *socket,
                             GError  **error)
 {
   gchar buffer[256];
-  gsize len = 256;
+  guint32 len = 256;
 
   g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
 
@@ -385,7 +426,7 @@ g_socket_get_remote_address (GSocket  *socket,
                              GError  **error)
 {
   gchar buffer[256];
-  gsize len = 256;
+  guint32 len = 256;
 
   g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
 
@@ -504,7 +545,7 @@ g_socket_receive (GSocket       *socket,
 
 gssize
 g_socket_send (GSocket       *socket,
-               gchar         *buffer,
+               const gchar   *buffer,
                gsize          size,
                GError       **error)
 {
@@ -540,5 +581,5 @@ g_socket_create_source (GSocket      *socket,
 {
   g_return_val_if_fail (G_IS_SOCKET (socket) && (cancellable == NULL || G_IS_CANCELLABLE (cancellable)), NULL);
 
-  return _g_fd_source_new (socket->priv->fd, G_IO_IN | G_IO_HUP | G_IO_ERR, cancellable);
+  return _g_fd_source_new (socket->priv->fd, condition, cancellable);
 }