432 lines
14 KiB
Diff
432 lines
14 KiB
Diff
From c48c984d39afeae84b0cad515f08f83c711fd9c4 Mon Sep 17 00:00:00 2001
|
||
From: Philip Withnall <withnall@endlessm.com>
|
||
Date: Thu, 13 Sep 2018 10:25:05 +0100
|
||
Subject: [PATCH 1/9] gnetworkmonitornm: Set a GError properly on an error
|
||
handling path
|
||
MIME-Version: 1.0
|
||
Content-Type: text/plain; charset=UTF-8
|
||
Content-Transfer-Encoding: 8bit
|
||
|
||
All the other initialisation failure paths set a GError, but this one
|
||
didn’t. Set a GError to avoid breaking the invariant that returning
|
||
FALSE should always have a GError set.
|
||
|
||
Signed-off-by: Philip Withnall <withnall@endlessm.com>
|
||
|
||
https://gitlab.gnome.org/GNOME/glib/issues/1523
|
||
---
|
||
gio/gnetworkmonitornm.c | 2 ++
|
||
1 file changed, 2 insertions(+)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 20a86571f..5bc8c925a 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -309,6 +309,8 @@ g_network_monitor_nm_initable_init (GInitable *initable,
|
||
|
||
if (!name_owner)
|
||
{
|
||
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||
+ _("NetworkManager not running"));
|
||
g_object_unref (proxy);
|
||
return FALSE;
|
||
}
|
||
--
|
||
2.33.1
|
||
|
||
From d139986b1f213a7e1c1e3968ad2d8270f820bd57 Mon Sep 17 00:00:00 2001
|
||
From: Antonio Larrosa <alarrosa@suse.com>
|
||
Date: Tue, 12 Mar 2019 18:35:10 +0100
|
||
Subject: [PATCH 2/9] Handle an UNKNOWN NetworkManager connectivity as NONE
|
||
|
||
nm_conn_to_g_conn already handles UNKNOWN like NONE (returning
|
||
G_NETWORK_CONNECTIVITY_LOCAL in both cases). So in sync_properties
|
||
we should also set new_connectivity to G_NETWORK_CONNECTIVITY_LOCAL
|
||
for both NM_CONNECTIVITY_UNKNOWN and NM_CONNECTIVITY_NONE.
|
||
|
||
This has the added benefit that when NetworkManager returns the network
|
||
connectivity is UNKNOWN, we set network_available to FALSE as it should
|
||
be. Previously, there were cases in a laptop with no network access,
|
||
that g_network_monitor_get_network_available returned true, which was
|
||
wrong and is also fixed with this commit.
|
||
---
|
||
gio/gnetworkmonitornm.c | 3 ++-
|
||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 5bc8c925a..4e2a35e8a 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -167,7 +167,8 @@ sync_properties (GNetworkMonitorNM *nm,
|
||
nm_connectivity = g_variant_get_uint32 (v);
|
||
g_variant_unref (v);
|
||
|
||
- if (nm_connectivity == NM_CONNECTIVITY_NONE)
|
||
+ if (nm_connectivity == NM_CONNECTIVITY_UNKNOWN ||
|
||
+ nm_connectivity == NM_CONNECTIVITY_NONE)
|
||
{
|
||
new_network_available = FALSE;
|
||
new_network_metered = FALSE;
|
||
--
|
||
2.33.1
|
||
|
||
From 5b4e6f9813cf90c690d8974635b0aeff8f5d2c5d Mon Sep 17 00:00:00 2001
|
||
From: Fabrice Bellet <fabrice@bellet.info>
|
||
Date: Mon, 29 Apr 2019 12:05:54 +0000
|
||
Subject: [PATCH 3/9] gnetworkmonitornm: Fix network available detection
|
||
|
||
The network-available property can be asserted by querying the NMState
|
||
describing the current overval network state, instead of the
|
||
NMConnectivityState. The advantage of the NMState is that is reflects
|
||
immediately the network state modification, while the connectivity
|
||
state is tested at a fixed frequency.
|
||
---
|
||
gio/gnetworkmonitornm.c | 39 ++++++++++++++++++++++++++++++++++++---
|
||
1 file changed, 36 insertions(+), 3 deletions(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 4e2a35e8a..7bb480f54 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -52,6 +52,19 @@ typedef enum {
|
||
NM_CONNECTIVITY_FULL
|
||
} NMConnectivityState;
|
||
|
||
+/* Copied from https://developer.gnome.org/libnm-util/stable/libnm-util-NetworkManager.html#NMState;
|
||
+ * used inline to avoid a NetworkManager dependency from GLib. */
|
||
+typedef enum {
|
||
+ NM_STATE_UNKNOWN = 0,
|
||
+ NM_STATE_ASLEEP = 10,
|
||
+ NM_STATE_DISCONNECTED = 20,
|
||
+ NM_STATE_DISCONNECTING = 30,
|
||
+ NM_STATE_CONNECTING = 40,
|
||
+ NM_STATE_CONNECTED_LOCAL = 50,
|
||
+ NM_STATE_CONNECTED_SITE = 60,
|
||
+ NM_STATE_CONNECTED_GLOBAL = 70,
|
||
+} NMState;
|
||
+
|
||
struct _GNetworkMonitorNMPrivate
|
||
{
|
||
GDBusProxy *proxy;
|
||
@@ -155,11 +168,19 @@ sync_properties (GNetworkMonitorNM *nm,
|
||
gboolean emit_signals)
|
||
{
|
||
GVariant *v;
|
||
+ NMState nm_state;
|
||
NMConnectivityState nm_connectivity;
|
||
gboolean new_network_available;
|
||
gboolean new_network_metered;
|
||
GNetworkConnectivity new_connectivity;
|
||
|
||
+ v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "State");
|
||
+ if (!v)
|
||
+ return;
|
||
+
|
||
+ nm_state = g_variant_get_uint32 (v);
|
||
+ g_variant_unref (v);
|
||
+
|
||
v = g_dbus_proxy_get_cached_property (nm->priv->proxy, "Connectivity");
|
||
if (!v)
|
||
return;
|
||
@@ -167,14 +188,26 @@ sync_properties (GNetworkMonitorNM *nm,
|
||
nm_connectivity = g_variant_get_uint32 (v);
|
||
g_variant_unref (v);
|
||
|
||
- if (nm_connectivity == NM_CONNECTIVITY_UNKNOWN ||
|
||
- nm_connectivity == NM_CONNECTIVITY_NONE)
|
||
+ if (nm_state <= NM_STATE_CONNECTED_LOCAL)
|
||
{
|
||
new_network_available = FALSE;
|
||
new_network_metered = FALSE;
|
||
new_connectivity = G_NETWORK_CONNECTIVITY_LOCAL;
|
||
}
|
||
- else
|
||
+ else if (nm_state <= NM_STATE_CONNECTED_SITE)
|
||
+ {
|
||
+ new_network_available = FALSE;
|
||
+ new_network_metered = FALSE;
|
||
+ if (nm_connectivity == NM_CONNECTIVITY_PORTAL)
|
||
+ {
|
||
+ new_connectivity = G_NETWORK_CONNECTIVITY_PORTAL;
|
||
+ }
|
||
+ else
|
||
+ {
|
||
+ new_connectivity = G_NETWORK_CONNECTIVITY_LIMITED;
|
||
+ }
|
||
+ }
|
||
+ else /* nm_state == NM_STATE_CONNECTED_FULL */
|
||
{
|
||
|
||
/* this is only available post NM 1.0 */
|
||
--
|
||
2.33.1
|
||
|
||
From 96fba295771d600e4f0f522400b2fb9b1ff42cee Mon Sep 17 00:00:00 2001
|
||
From: Philip Withnall <withnall@endlessm.com>
|
||
Date: Fri, 31 May 2019 11:19:07 +0100
|
||
Subject: [PATCH 4/9] gnetworkmonitornm: Consider NM_STATE_CONNECTED_SITE to be
|
||
available
|
||
|
||
`NM_STATE_CONNECTED_SITE` is documented to mean that a default route is
|
||
available, but that the internet connectivity check failed. A default
|
||
route being available is compatible with the documentation for
|
||
GNetworkMonitor:network-available, which should be true if the system
|
||
has a default route for at least one of IPv4 and IPv6.
|
||
|
||
https://developer.gnome.org/NetworkManager/stable/nm-dbus-types.html
|
||
|
||
Signed-off-by: Philip Withnall <withnall@endlessm.com>
|
||
|
||
Fixes: #1788
|
||
---
|
||
gio/gnetworkmonitornm.c | 2 +-
|
||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 7bb480f54..9013fd49c 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -196,7 +196,7 @@ sync_properties (GNetworkMonitorNM *nm,
|
||
}
|
||
else if (nm_state <= NM_STATE_CONNECTED_SITE)
|
||
{
|
||
- new_network_available = FALSE;
|
||
+ new_network_available = TRUE;
|
||
new_network_metered = FALSE;
|
||
if (nm_connectivity == NM_CONNECTIVITY_PORTAL)
|
||
{
|
||
--
|
||
2.33.1
|
||
|
||
From 74e5f472c838115f0ba19ac501805cb5b2ca837f Mon Sep 17 00:00:00 2001
|
||
From: Bastien Nocera <hadess@hadess.net>
|
||
Date: Mon, 29 Jul 2019 17:25:21 +0200
|
||
Subject: [PATCH 5/9] gnetworkmonitornm: Disconnect g-signal from proxy
|
||
|
||
So that we're sure never to receive a signal if something is keeping the
|
||
proxy alive.
|
||
---
|
||
gio/gnetworkmonitornm.c | 12 ++++++++++--
|
||
1 file changed, 10 insertions(+), 2 deletions(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 9013fd49c..52073fac9 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -68,6 +68,7 @@ typedef enum {
|
||
struct _GNetworkMonitorNMPrivate
|
||
{
|
||
GDBusProxy *proxy;
|
||
+ guint signal_id;
|
||
|
||
GNetworkConnectivity connectivity;
|
||
gboolean network_available;
|
||
@@ -360,8 +361,8 @@ g_network_monitor_nm_initable_init (GInitable *initable,
|
||
return FALSE;
|
||
}
|
||
|
||
- g_signal_connect (G_OBJECT (proxy), "g-signal",
|
||
- G_CALLBACK (proxy_signal_cb), nm);
|
||
+ nm->priv->signal_id = g_signal_connect (G_OBJECT (proxy), "g-signal",
|
||
+ G_CALLBACK (proxy_signal_cb), nm);
|
||
nm->priv->proxy = proxy;
|
||
sync_properties (nm, FALSE);
|
||
|
||
@@ -373,6 +374,13 @@ g_network_monitor_nm_finalize (GObject *object)
|
||
{
|
||
GNetworkMonitorNM *nm = G_NETWORK_MONITOR_NM (object);
|
||
|
||
+ if (nm->priv->proxy != NULL &&
|
||
+ nm->priv->signal_id != 0)
|
||
+ {
|
||
+ g_signal_handler_disconnect (nm->priv->proxy,
|
||
+ nm->priv->signal_id);
|
||
+ nm->priv->signal_id = 0;
|
||
+ }
|
||
g_clear_object (&nm->priv->proxy);
|
||
|
||
G_OBJECT_CLASS (g_network_monitor_nm_parent_class)->finalize (object);
|
||
--
|
||
2.33.1
|
||
|
||
From eeaf1de6e695afd971d67137caa8e39e1c1267df Mon Sep 17 00:00:00 2001
|
||
From: Bastien Nocera <hadess@hadess.net>
|
||
Date: Mon, 29 Jul 2019 17:26:20 +0200
|
||
Subject: [PATCH 6/9] gnetworkmonitornm: Arguments to g-signal's callback are
|
||
const
|
||
|
||
---
|
||
gio/gnetworkmonitornm.c | 4 ++--
|
||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 52073fac9..479653a51 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -268,8 +268,8 @@ update_cached_property (GDBusProxy *proxy,
|
||
|
||
static void
|
||
proxy_signal_cb (GDBusProxy *proxy,
|
||
- gchar *sender_name,
|
||
- gchar *signal_name,
|
||
+ const gchar *sender_name,
|
||
+ const gchar *signal_name,
|
||
GVariant *parameters,
|
||
GNetworkMonitorNM *nm)
|
||
{
|
||
--
|
||
2.33.1
|
||
|
||
From 46d70700c85e4419942c8a3d08bd0bf842702c4a Mon Sep 17 00:00:00 2001
|
||
From: Bastien Nocera <hadess@hadess.net>
|
||
Date: Mon, 29 Jul 2019 17:26:47 +0200
|
||
Subject: [PATCH 7/9] gnetworkmonitornm: Remove double-space
|
||
|
||
---
|
||
gio/gnetworkmonitornm.c | 2 +-
|
||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 479653a51..5a36a0ba1 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -391,7 +391,7 @@ g_network_monitor_nm_class_init (GNetworkMonitorNMClass *nl_class)
|
||
{
|
||
GObjectClass *gobject_class = G_OBJECT_CLASS (nl_class);
|
||
|
||
- gobject_class->finalize = g_network_monitor_nm_finalize;
|
||
+ gobject_class->finalize = g_network_monitor_nm_finalize;
|
||
gobject_class->get_property = g_network_monitor_nm_get_property;
|
||
|
||
g_object_class_override_property (gobject_class, PROP_NETWORK_AVAILABLE, "network-available");
|
||
--
|
||
2.33.1
|
||
|
||
From 72291aac3dac7a8ed4c85eb41608f3f5f9ad7681 Mon Sep 17 00:00:00 2001
|
||
From: Julian Andres Klode <julian.klode@canonical.com>
|
||
Date: Tue, 12 Oct 2021 12:01:50 +0200
|
||
Subject: [PATCH 8/9] gnetworkmonitornm: Stop using removed PropertiesChanged
|
||
signal
|
||
|
||
Use the org.freedesktop.DBus.Properties interface to listen
|
||
to PropertiesChanged signals on /org/freedesktop/NetworkManager.
|
||
|
||
NetworkManager used to provide its own legacy PropertiesChanged
|
||
signal, but that was dropped in
|
||
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/853
|
||
|
||
This requires NetworkManager >= 1.2 (2016)
|
||
|
||
Fixes: #2505
|
||
Bug-Ubuntu: https://bugs.launchpad.net/bugs/1946196
|
||
---
|
||
gio/gnetworkmonitornm.c | 29 +++++++----------------------
|
||
1 file changed, 7 insertions(+), 22 deletions(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 5a36a0ba1..6a6d1d666 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -267,29 +267,14 @@ update_cached_property (GDBusProxy *proxy,
|
||
}
|
||
|
||
static void
|
||
-proxy_signal_cb (GDBusProxy *proxy,
|
||
- const gchar *sender_name,
|
||
- const gchar *signal_name,
|
||
- GVariant *parameters,
|
||
- GNetworkMonitorNM *nm)
|
||
+proxy_properties_changed_cb (GDBusProxy *proxy,
|
||
+ GVariant *changed_properties,
|
||
+ GStrv invalidated_properties,
|
||
+ GNetworkMonitorNM *nm)
|
||
{
|
||
- GVariant *asv;
|
||
GVariantDict *dict;
|
||
|
||
- if (g_strcmp0 (signal_name, "PropertiesChanged") != 0)
|
||
- return;
|
||
-
|
||
- g_variant_get (parameters, "(@a{sv})", &asv);
|
||
- if (!asv)
|
||
- return;
|
||
-
|
||
- dict = g_variant_dict_new (asv);
|
||
- g_variant_unref (asv);
|
||
- if (!dict)
|
||
- {
|
||
- g_warning ("Failed to handle PropertiesChanged signal from NetworkManager");
|
||
- return;
|
||
- }
|
||
+ dict = g_variant_dict_new (changed_properties);
|
||
|
||
update_cached_property (nm->priv->proxy, "Connectivity", dict);
|
||
|
||
@@ -361,8 +346,8 @@ g_network_monitor_nm_initable_init (GInitable *initable,
|
||
return FALSE;
|
||
}
|
||
|
||
- nm->priv->signal_id = g_signal_connect (G_OBJECT (proxy), "g-signal",
|
||
- G_CALLBACK (proxy_signal_cb), nm);
|
||
+ nm->priv->signal_id = g_signal_connect (G_OBJECT (proxy), "g-properties-changed",
|
||
+ G_CALLBACK (proxy_properties_changed_cb), nm);
|
||
nm->priv->proxy = proxy;
|
||
sync_properties (nm, FALSE);
|
||
|
||
--
|
||
2.33.1
|
||
|
||
From 3bafff71d7588285763f603b23c830722a2169d1 Mon Sep 17 00:00:00 2001
|
||
From: Julian Andres Klode <julian.klode@canonical.com>
|
||
Date: Tue, 12 Oct 2021 17:31:42 +0200
|
||
Subject: [PATCH 9/9] gnetworkmonitornm: Do not re-update cached property
|
||
|
||
GDBusProxy already takes care of updating the cached property
|
||
before emitting the signal, so there is no need to do this
|
||
a second time ourselves.
|
||
---
|
||
gio/gnetworkmonitornm.c | 22 ----------------------
|
||
1 file changed, 22 deletions(-)
|
||
|
||
diff --git a/gio/gnetworkmonitornm.c b/gio/gnetworkmonitornm.c
|
||
index 6a6d1d666..a8040fb36 100644
|
||
--- a/gio/gnetworkmonitornm.c
|
||
+++ b/gio/gnetworkmonitornm.c
|
||
@@ -252,34 +252,12 @@ sync_properties (GNetworkMonitorNM *nm,
|
||
}
|
||
}
|
||
|
||
-static void
|
||
-update_cached_property (GDBusProxy *proxy,
|
||
- const char *property_name,
|
||
- GVariantDict *dict)
|
||
-{
|
||
- GVariant *v;
|
||
-
|
||
- v = g_variant_dict_lookup_value (dict, property_name, NULL);
|
||
- if (!v)
|
||
- return;
|
||
- g_dbus_proxy_set_cached_property (proxy, property_name, v);
|
||
- g_variant_unref (v);
|
||
-}
|
||
-
|
||
static void
|
||
proxy_properties_changed_cb (GDBusProxy *proxy,
|
||
GVariant *changed_properties,
|
||
GStrv invalidated_properties,
|
||
GNetworkMonitorNM *nm)
|
||
{
|
||
- GVariantDict *dict;
|
||
-
|
||
- dict = g_variant_dict_new (changed_properties);
|
||
-
|
||
- update_cached_property (nm->priv->proxy, "Connectivity", dict);
|
||
-
|
||
- g_variant_dict_unref (dict);
|
||
-
|
||
sync_properties (nm, TRUE);
|
||
}
|
||
|
||
--
|
||
2.33.1
|