X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=gnio%2Fgsocket.c;h=eb893678b73850d6a7624e9a3098afe96c721c9d;hb=698f0efbb5a9ef8f502f688808a52888c1e1cee6;hp=9e234a00a005dc7c4d84962a688613e1c65e2f34;hpb=69cc681adb833691c5cb24cfad15ec76c35709bb;p=cascardo%2Fgnio.git diff --git a/gnio/gsocket.c b/gnio/gsocket.c index 9e234a0..eb89367 100644 --- a/gnio/gsocket.c +++ b/gnio/gsocket.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include "gasynchelper.h" #include #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); }