gint fd;
gint listen_backlog;
GError *construct_error;
- GSocketAddress *local_address;
- GSocketAddress *remote_address;
guint inited : 1;
guint blocking : 1;
guint keepalive : 1;
guint closed : 1;
+ guint connected : 1;
#ifdef G_OS_WIN32
WSAEVENT event;
int current_events;
if (socket->priv->family != G_SOCKET_FAMILY_INVALID)
{
- socket->priv->local_address =
- g_socket_address_new_from_native (&address, addrlen);
-
addrlen = sizeof address;
if (getpeername (fd, (struct sockaddr *) &address, &addrlen) >= 0)
- socket->priv->remote_address =
- g_socket_address_new_from_native (&address, addrlen);
+ socket->priv->connected = TRUE;
}
optlen = sizeof bool_val;
GParamSpec *pspec)
{
GSocket *socket = G_SOCKET (object);
+ GSocketAddress *address;
switch (prop_id)
{
break;
case PROP_LOCAL_ADDRESS:
- g_value_set_object (value, socket->priv->local_address);
+ address = g_socket_get_local_address (socket, NULL);
+ g_value_take_object (value, address);
break;
case PROP_REMOTE_ADDRESS:
- g_value_set_object (value, socket->priv->remote_address);
+ address = g_socket_get_remote_address (socket, NULL);
+ g_value_take_object (value, address);
break;
default:
}
static void
-g_socket_dispose (GObject *object)
-{
- GSocket *socket = G_SOCKET (object);
-
- if (socket->priv->local_address)
- {
- g_object_unref (socket->priv->local_address);
- socket->priv->local_address = NULL;
- }
-
- if (socket->priv->remote_address)
- {
- g_object_unref (socket->priv->remote_address);
- socket->priv->remote_address = NULL;
- }
-
- if (G_OBJECT_CLASS (g_socket_parent_class)->dispose)
- (*G_OBJECT_CLASS (g_socket_parent_class)->dispose) (object);
-}
-
-static void
g_socket_class_init (GSocketClass *klass)
{
GObjectClass *gobject_class G_GNUC_UNUSED = G_OBJECT_CLASS (klass);
g_type_class_add_private (klass, sizeof (GSocketPrivate));
gobject_class->finalize = g_socket_finalize;
- gobject_class->dispose = g_socket_dispose;
gobject_class->constructed = g_socket_constructed;
gobject_class->set_property = g_socket_set_property;
gobject_class->get_property = g_socket_get_property;
socket->priv->blocking = TRUE;
socket->priv->listen_backlog = 10;
socket->priv->construct_error = NULL;
- socket->priv->remote_address = NULL;
- socket->priv->local_address = NULL;
#ifdef G_OS_WIN32
socket->priv->event = WSA_INVALID_EVENT;
#endif
* @error: #GError for error reporting, or %NULL to ignore.
*
* Try to get the local address of a bound socket. This is only
- * useful if the socket has been bound to a local address.
+ * useful if the socket has been bound to a local address,
+ * either explicitly or implicitly when connecting.
*
* Returns: a #GSocketAddress or %NULL on error.
+ * Free the returned object with g_object_unref().
*
* Since: 2.22
**/
g_socket_get_local_address (GSocket *socket,
GError **error)
{
- gchar buffer[256];
- guint32 len = 256;
+ struct sockaddr_storage buffer;
+ guint32 len = sizeof (buffer);
g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
- if (socket->priv->local_address)
- return socket->priv->local_address;
-
- if (getsockname (socket->priv->fd, (struct sockaddr *) buffer, &len) < 0)
+ if (getsockname (socket->priv->fd, (struct sockaddr *) &buffer, &len) < 0)
{
int errsv = get_socket_errno ();
g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
return NULL;
}
- socket->priv->local_address = g_socket_address_new_from_native (buffer, len);
- return socket->priv->local_address;
+ return g_socket_address_new_from_native (&buffer, len);
}
/**
* useful for connection oriented sockets that have been connected.
*
* Returns: a #GSocketAddress or %NULL on error.
+ * Free the returned object with g_object_unref().
*
* Since: 2.22
**/
g_socket_get_remote_address (GSocket *socket,
GError **error)
{
- gchar buffer[256];
- guint32 len = 256;
+ struct sockaddr_storage buffer;
+ guint32 len = sizeof (buffer);
g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
- if (socket->priv->remote_address)
- return socket->priv->remote_address;
-
- if (getpeername (socket->priv->fd, (struct sockaddr *) buffer, &len) < 0)
+ if (getpeername (socket->priv->fd, (struct sockaddr *) &buffer, &len) < 0)
{
int errsv = get_socket_errno ();
g_set_error (error, G_IO_ERROR, socket_io_error_from_errno (errsv),
return NULL;
}
- socket->priv->remote_address = g_socket_address_new_from_native (buffer, len);
- return socket->priv->remote_address;
+ return g_socket_address_new_from_native (&buffer, len);
}
/**
{
g_return_val_if_fail (G_IS_SOCKET (socket), FALSE);
- return socket->priv->remote_address != NULL;
+ return socket->priv->connected;
}
/**
gboolean reuse_address,
GError **error)
{
- gchar addr[256];
+ struct sockaddr_storage addr;
int value;
g_return_val_if_fail (G_IS_SOCKET (socket) && G_IS_SOCKET_ADDRESS (address), FALSE);
(gpointer) &value, sizeof (value));
#endif
- if (!g_socket_address_to_native (address, addr, sizeof addr, error))
+ if (!g_socket_address_to_native (address, &addr, sizeof addr, error))
return FALSE;
- if (bind (socket->priv->fd, (struct sockaddr *) addr,
+ if (bind (socket->priv->fd, (struct sockaddr *) &addr,
g_socket_address_get_native_size (address)) < 0)
{
int errsv = get_socket_errno ();
return FALSE;
}
- socket->priv->local_address = g_object_ref (address);
-
return TRUE;
}
GSocketAddress *address,
GError **error)
{
- gchar buffer[256];
+ struct sockaddr_storage buffer;
g_return_val_if_fail (G_IS_SOCKET (socket) && G_IS_SOCKET_ADDRESS (address), FALSE);
if (!check_socket (socket, error))
return FALSE;
- if (!g_socket_address_to_native (address, buffer, sizeof buffer, error))
+ if (!g_socket_address_to_native (address, &buffer, sizeof buffer, error))
return FALSE;
while (1)
G_IO_IN, NULL, error))
return FALSE;
- if (connect (socket->priv->fd, (struct sockaddr *) buffer,
+ if (connect (socket->priv->fd, (struct sockaddr *) &buffer,
g_socket_address_get_native_size (address)) < 0)
{
int errsv = get_socket_errno ();
win32_unset_event_mask (socket, FD_CONNECT);
- socket->priv->remote_address = g_object_ref (address);
+ socket->priv->connected = TRUE;
return TRUE;
}
}
#endif
+ socket->priv->connected = FALSE;
socket->priv->closed = TRUE;
return TRUE;