NetworkManager/examples/C/glib/monitor-nm-state-gdbus.c
Íñigo Huguet 3355ba9380 core: rename NM_STATE_ASLEEP to NM_STATE_DISABLED
When we do `nmcli networking off` it's shown as state "sleeping". This
is confusing, and the only reason is that we share internally code to
handle both situations in a similar way.

Rename the state to the more generic name "disabled", situation that can
happen either because of sleeping or networking off.

Clients cannot differentiate the exact reason only with the NMState value,
but better that they show "network off" as this is the most common reason
that they will be able to display. If the system is suspending, there will
be only a short period of time that they can show the state, and showing
"network off" is not wrong because that's what NM has done as a response
to suspend.

In the logs, let's make explicit the exact reason why state is changing
to DISABLED: sleeping or networking off.

Logs before:
  manager: disable requested (sleeping: no  enabled: yes)
  manager: NetworkManager state is now ASLEEP

Logs after:
  manager: disable requested (sleeping: no  enabled: yes)
  manager: NetworkManager state is now DISABLED (NEWORKING OFF)

State before:
  $ nmcli general
  STATE  ...
  asleep ...

State after:
  $ nmcli general
  STATE       ...
  network off ...
2025-09-23 09:17:03 +02:00

111 lines
3.4 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2012 Red Hat, Inc.
*/
/*
* This example monitors NM state via D-Bus "StateChanged" signal on
* "org.freedesktop.NetworkManager" object.
* It uses GDBus and the libnm headers.
* You don't need to have the NetworkManager devel packages installed. You can just
* grab nm-dbus-interface.h and put it in the path.
*
* Standalone compilation:
* gcc -Wall monitor-nm-state-gdbus.c -o monitor-nm-state-gdbus `pkg-config --cflags --libs libnm`
*/
#include <gio/gio.h>
#include <string.h>
#include <nm-dbus-interface.h>
static const char *
nm_state_to_string(NMState state)
{
switch (state) {
case NM_STATE_DISABLED:
return "network off";
case NM_STATE_CONNECTING:
return "connecting";
case NM_STATE_CONNECTED_LOCAL:
return "connected (local only)";
case NM_STATE_CONNECTED_SITE:
return "connected (site only)";
case NM_STATE_CONNECTED_GLOBAL:
return "connected";
case NM_STATE_DISCONNECTING:
return "disconnecting";
case NM_STATE_DISCONNECTED:
return "disconnected";
case NM_STATE_UNKNOWN:
default:
return "unknown";
}
}
static void
on_signal(GDBusProxy *proxy,
char *sender_name,
char *signal_name,
GVariant *parameters,
gpointer user_data)
{
guint32 new_state;
/* Print all signals */
//char *parameters_str;
//parameters_str = g_variant_print (parameters, TRUE);
//g_print (" *** Received Signal: %s: %s\n", signal_name, parameters_str);
//g_free (parameters_str);
/* We are only interested in "StateChanged" signal */
if (strcmp(signal_name, "StateChanged") == 0) {
GVariant *tmp = g_variant_get_child_value(parameters, 0);
new_state = g_variant_get_uint32(tmp);
g_variant_unref(tmp);
g_print("NetworkManager state is: (%d) %s\n",
new_state,
nm_state_to_string((NMState) new_state));
}
}
int
main(int argc, char *argv[])
{
GMainLoop *loop;
GError *error = NULL;
GDBusProxyFlags flags;
GDBusProxy *proxy;
/* Monitor 'StateChanged' signal on 'org.freedesktop.NetworkManager' interface */
g_print("Monitor NetworkManager's state\n");
g_print("==============================\n");
flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START;
proxy = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SYSTEM,
flags,
NULL, /* GDBusInterfaceInfo */
"org.freedesktop.NetworkManager",
"/org/freedesktop/NetworkManager",
"org.freedesktop.NetworkManager",
NULL, /* GCancellable */
&error);
if (proxy == NULL) {
g_dbus_error_strip_remote_error(error);
g_printerr("Error creating D-Bus proxy: %s\n", error->message);
g_error_free(error);
return -1;
}
/* Connect to g-signal to receive signals from proxy (remote object) */
g_signal_connect(proxy, "g-signal", G_CALLBACK(on_signal), NULL);
/* Run main loop */
loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
g_object_unref(proxy);
return 0;
}