From d03f495b3182cc31085348619c2c6205964433b4 Mon Sep 17 00:00:00 2001 From: Patrick Griffis Date: Wed, 2 Jul 2025 09:30:05 -0500 Subject: [PATCH] gsocketaddress: Set scope-id and flowinfo of ginetaddress --- gio/ginetsocketaddress.c | 20 ++++++++++++++------ gio/gsocketaddress.c | 8 +++----- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/gio/ginetsocketaddress.c b/gio/ginetsocketaddress.c index c17bd1497..31b09b33c 100644 --- a/gio/ginetsocketaddress.c +++ b/gio/ginetsocketaddress.c @@ -97,12 +97,12 @@ g_inet_socket_address_get_property (GObject *object, case PROP_FLOWINFO: g_return_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6); - g_value_set_uint (value, address->priv->flowinfo); + g_value_set_uint (value, g_inet_socket_address_get_flowinfo (address)); break; case PROP_SCOPE_ID: g_return_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6); - g_value_set_uint (value, address->priv->scope_id); + g_value_set_uint (value, g_inet_socket_address_get_scope_id (address)); break; default: @@ -220,8 +220,8 @@ g_inet_socket_address_to_native (GSocketAddress *address, memset (sock, 0, sizeof (*sock)); sock->sin6_family = AF_INET6; sock->sin6_port = g_htons (addr->priv->port); - sock->sin6_flowinfo = addr->priv->flowinfo; - sock->sin6_scope_id = addr->priv->scope_id; + sock->sin6_flowinfo = g_inet_socket_address_get_flowinfo (addr); + sock->sin6_scope_id = g_inet_socket_address_get_scope_id (addr); memcpy (&(sock->sin6_addr.s6_addr), g_inet_address_to_bytes (addr->priv->address), sizeof (sock->sin6_addr)); return TRUE; } @@ -282,6 +282,8 @@ g_inet_socket_address_class_init (GInetSocketAddressClass *klass) * * The `sin6_flowinfo` field, for IPv6 addresses. * + * If unset this property is inherited from [property@Gio.InetSocketAddress:address]. + * * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_FLOWINFO, @@ -298,6 +300,8 @@ g_inet_socket_address_class_init (GInetSocketAddressClass *klass) * * The `sin6_scope_id` field, for IPv6 addresses. * + * If unset this property is inherited from [property@Gio.InetSocketAddress:address]. + * * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_SCOPE_ID, @@ -511,6 +515,8 @@ g_inet_socket_address_get_port (GInetSocketAddress *address) * Gets the `sin6_flowinfo` field from @address, * which must be an IPv6 address. * + * If not overridden this value will be inherited from [property@Gio.InetSocketAddress:address]. + * * Returns: the flowinfo field * * Since: 2.32 @@ -521,7 +527,7 @@ g_inet_socket_address_get_flowinfo (GInetSocketAddress *address) g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); g_return_val_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6, 0); - return address->priv->flowinfo; + return address->priv->flowinfo ? address->priv->flowinfo : g_inet_address_get_flowinfo (address->priv->address); } /** @@ -531,6 +537,8 @@ g_inet_socket_address_get_flowinfo (GInetSocketAddress *address) * Gets the `sin6_scope_id` field from @address, * which must be an IPv6 address. * + * If not overridden this value will be inherited from [property@Gio.InetSocketAddress:address]. + * * Returns: the scope id field * * Since: 2.32 @@ -541,5 +549,5 @@ g_inet_socket_address_get_scope_id (GInetSocketAddress *address) g_return_val_if_fail (G_IS_INET_SOCKET_ADDRESS (address), 0); g_return_val_if_fail (g_inet_address_get_family (address->priv->address) == G_SOCKET_FAMILY_IPV6, 0); - return address->priv->scope_id; + return address->priv->scope_id ? address->priv->scope_id : g_inet_address_get_scope_id (address->priv->address); } diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c index defd965e0..195644b53 100644 --- a/gio/gsocketaddress.c +++ b/gio/gsocketaddress.c @@ -252,15 +252,13 @@ g_socket_address_new_from_native (gpointer native, iaddr = g_inet_address_new_from_bytes ((guint8 *) &(sin_addr.sin_addr), G_SOCKET_FAMILY_IPV4); } else - { - iaddr = g_inet_address_new_from_bytes ((guint8 *) &(addr->sin6_addr), G_SOCKET_FAMILY_IPV6); - } + { + iaddr = g_inet_address_new_from_bytes_with_ipv6_info ((guint8 *) &(addr->sin6_addr), G_SOCKET_FAMILY_IPV6, addr->sin6_flowinfo, addr->sin6_scope_id); + } sockaddr = g_object_new (G_TYPE_INET_SOCKET_ADDRESS, "address", iaddr, "port", g_ntohs (addr->sin6_port), - "flowinfo", addr->sin6_flowinfo, - "scope_id", addr->sin6_scope_id, NULL); g_object_unref (iaddr); return sockaddr;