diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c index 7175717fdb..c9f45a7a9d 100644 --- a/src/devices/nm-device.c +++ b/src/devices/nm-device.c @@ -15269,7 +15269,7 @@ nm_device_class_init (NMDeviceClass *klass) g_type_class_add_private (object_class, sizeof (NMDevicePrivate)); - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/Devices"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/Devices"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_device, &nm_interface_info_device_statistics); diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c index 31af1be803..60767032cd 100644 --- a/src/devices/wifi/nm-wifi-ap.c +++ b/src/devices/wifi/nm-wifi-ap.c @@ -1391,7 +1391,7 @@ nm_wifi_ap_class_init (NMWifiAPClass *ap_class) GObjectClass *object_class = G_OBJECT_CLASS (ap_class); NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (ap_class); - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH_ACCESS_POINT); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH_ACCESS_POINT); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_access_point); object_class->get_property = get_property; diff --git a/src/dns/nm-dns-manager.c b/src/dns/nm-dns-manager.c index 037e4835fb..9b5120e783 100644 --- a/src/dns/nm-dns-manager.c +++ b/src/dns/nm-dns-manager.c @@ -2127,7 +2127,7 @@ nm_dns_manager_class_init (NMDnsManagerClass *klass) object_class->finalize = finalize; object_class->get_property = get_property; - dbus_object_class->export_path = NM_DBUS_PATH "/DnsManager"; + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_STATIC (NM_DBUS_PATH "/DnsManager"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_dns_manager); dbus_object_class->export_on_construction = TRUE; diff --git a/src/nm-active-connection.c b/src/nm-active-connection.c index 49e34169d8..6e0e39ea9e 100644 --- a/src/nm-active-connection.c +++ b/src/nm-active-connection.c @@ -1447,7 +1447,7 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class) g_type_class_add_private (ac_class, sizeof (NMActiveConnectionPrivate)); - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/ActiveConnection"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/ActiveConnection"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_active_connection); object_class->get_property = get_property; diff --git a/src/nm-checkpoint.c b/src/nm-checkpoint.c index 0ae3aac215..402d217f87 100644 --- a/src/nm-checkpoint.c +++ b/src/nm-checkpoint.c @@ -558,7 +558,7 @@ nm_checkpoint_class_init (NMCheckpointClass *checkpoint_class) GObjectClass *object_class = G_OBJECT_CLASS (checkpoint_class); NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (checkpoint_class); - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/Checkpoint"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/Checkpoint"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_checkpoint); object_class->dispose = dispose; diff --git a/src/nm-dbus-object.c b/src/nm-dbus-object.c index b8670041fb..cd3a23509e 100644 --- a/src/nm-dbus-object.c +++ b/src/nm-dbus-object.c @@ -56,36 +56,32 @@ G_DEFINE_ABSTRACT_TYPE (NMDBusObject, nm_dbus_object, G_TYPE_OBJECT); static char * _create_export_path (NMDBusObjectClass *klass) { - const char *class_export_path, *p; - static GHashTable *prefix_counters; - guint64 *counter; + nm_assert (NM_IS_DBUS_OBJECT_CLASS (klass)); + nm_assert (klass->export_path.path); - class_export_path = klass->export_path; +#if NM_MORE_ASSERTS + { + const char *p; - nm_assert (class_export_path); - - p = strchr (class_export_path, '%'); - if (p) { - if (G_UNLIKELY (!prefix_counters)) - prefix_counters = g_hash_table_new (nm_str_hash, g_str_equal); - - nm_assert (p[1] == 'l'); - nm_assert (p[2] == 'l'); - nm_assert (p[3] == 'u'); - nm_assert (p[4] == '\0'); - - counter = g_hash_table_lookup (prefix_counters, class_export_path); - if (!counter) { - counter = g_slice_new0 (guint64); - g_hash_table_insert (prefix_counters, (char *) class_export_path, counter); - } + p = strchr (klass->export_path.path, '%'); + if (klass->export_path.int_counter) { + nm_assert (p); + nm_assert (p[1] == 'l'); + nm_assert (p[2] == 'l'); + nm_assert (p[3] == 'u'); + nm_assert (p[4] == '\0'); + } else + nm_assert (!p); + } +#endif + if (klass->export_path.int_counter) { NM_PRAGMA_WARNING_DISABLE("-Wformat-nonliteral") - return g_strdup_printf (class_export_path, (unsigned long long) (++(*counter))); + return g_strdup_printf (klass->export_path.path, + ++(*klass->export_path.int_counter)); NM_PRAGMA_WARNING_REENABLE } - - return g_strdup (class_export_path); + return g_strdup (klass->export_path.path); } /** diff --git a/src/nm-dbus-object.h b/src/nm-dbus-object.h index bf2f2d0c64..f6629289a5 100644 --- a/src/nm-dbus-object.h +++ b/src/nm-dbus-object.h @@ -32,6 +32,38 @@ void nm_dbus_object_set_quitting (void); /*****************************************************************************/ +typedef struct { + const char *path; + + /* if path is of type NM_DBUS_EXPORT_PATH_NUMBERED(), we need a + * per-class counter when generating a new numbered path. + * + * Each NMDBusObjectClass instance has a shallow clone of the NMDBusObjectClass parent + * instance in every derived type. Hence we cannot embed the counter there directly, + * because it must be shared, e.g. between NMDeviceBond and NMDeviceEthernet. + * Make int_counter a pointer to the actual counter that is used by ever sibling + * class. */ + long long unsigned *int_counter; +} NMDBusExportPath; + +#define NM_DBUS_EXPORT_PATH_STATIC(basepath) \ + ({ \ + ((NMDBusExportPath) { \ + .path = ""basepath"", \ + }); \ + }) + +#define NM_DBUS_EXPORT_PATH_NUMBERED(basepath) \ + ({ \ + static long long unsigned _int_counter = 0; \ + ((NMDBusExportPath) { \ + .path = ""basepath"/%llu", \ + .int_counter = &_int_counter, \ + }); \ + }) + +/*****************************************************************************/ + /* "org.freedesktop.NetworkManager.Device.Statistics" is a special interface, * because although it has a legacy PropertiesChanged signal, it only notifies * about properties that actually exist on that interface. That is, because it @@ -82,7 +114,7 @@ struct _NMDBusObject { typedef struct { GObjectClass parent; - const char *export_path; + NMDBusExportPath export_path; const NMDBusInterfaceInfoExtended *const*interface_infos; diff --git a/src/nm-dbus-utils.h b/src/nm-dbus-utils.h index 9c322a6d75..0a28bebcae 100644 --- a/src/nm-dbus-utils.h +++ b/src/nm-dbus-utils.h @@ -23,10 +23,6 @@ /*****************************************************************************/ -#define NM_EXPORT_PATH_NUMBERED(basepath) ""basepath"/%llu" - -/*****************************************************************************/ - struct _NMDBusInterfaceInfoExtended; struct _NMDBusMethodInfoExtended; diff --git a/src/nm-dhcp4-config.c b/src/nm-dhcp4-config.c index 9bf5919e02..08becf3c34 100644 --- a/src/nm-dhcp4-config.c +++ b/src/nm-dhcp4-config.c @@ -167,7 +167,7 @@ nm_dhcp4_config_class_init (NMDhcp4ConfigClass *config_class) object_class->get_property = get_property; object_class->finalize = finalize; - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/DHCP4Config"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/DHCP4Config"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_dhcp4_config); dbus_object_class->export_on_construction = TRUE; diff --git a/src/nm-dhcp6-config.c b/src/nm-dhcp6-config.c index 1b9f9a5009..5bb6c7403a 100644 --- a/src/nm-dhcp6-config.c +++ b/src/nm-dhcp6-config.c @@ -165,7 +165,7 @@ nm_dhcp6_config_class_init (NMDhcp6ConfigClass *config_class) object_class->get_property = get_property; object_class->finalize = finalize; - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/DHCP6Config"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/DHCP6Config"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_dhcp6_config); dbus_object_class->export_on_construction = TRUE; diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 3fc176ca38..fa7e78c18a 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -3240,7 +3240,7 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class) GObjectClass *object_class = G_OBJECT_CLASS (config_class); NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (config_class); - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP4Config"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP4Config"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_ip4_config); object_class->get_property = get_property; diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 184c318c4f..883e8e00fa 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -2800,7 +2800,7 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class) GObjectClass *object_class = G_OBJECT_CLASS (config_class); NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (config_class); - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP6Config"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP6Config"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_ip6_config); object_class->get_property = get_property; diff --git a/src/nm-manager.c b/src/nm-manager.c index 8aec327703..0b34ff44ab 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -7047,7 +7047,7 @@ nm_manager_class_init (NMManagerClass *manager_class) GObjectClass *object_class = G_OBJECT_CLASS (manager_class); NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (manager_class); - dbus_object_class->export_path = NM_DBUS_PATH; + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_STATIC (NM_DBUS_PATH); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_manager); object_class->constructed = constructed; diff --git a/src/ppp/nm-ppp-manager.c b/src/ppp/nm-ppp-manager.c index 2bf230a86b..7d1eb4089d 100644 --- a/src/ppp/nm-ppp-manager.c +++ b/src/ppp/nm-ppp-manager.c @@ -1419,7 +1419,7 @@ nm_ppp_manager_class_init (NMPPPManagerClass *manager_class) object_class->get_property = get_property; object_class->set_property = set_property; - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/PPP"); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/PPP"); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_ppp); obj_properties[PROP_PARENT_IFACE] = diff --git a/src/settings/nm-agent-manager.c b/src/settings/nm-agent-manager.c index 06eaf51e41..b2cdc7d922 100644 --- a/src/settings/nm-agent-manager.c +++ b/src/settings/nm-agent-manager.c @@ -1687,7 +1687,7 @@ nm_agent_manager_class_init (NMAgentManagerClass *agent_manager_class) GObjectClass *object_class = G_OBJECT_CLASS (agent_manager_class); NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (agent_manager_class); - dbus_object_class->export_path = NM_DBUS_PATH_AGENT_MANAGER; + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_STATIC (NM_DBUS_PATH_AGENT_MANAGER); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_agent_manager); object_class->constructed = constructed; diff --git a/src/settings/nm-settings-connection.c b/src/settings/nm-settings-connection.c index 657ac14213..6878fb7fb9 100644 --- a/src/settings/nm-settings-connection.c +++ b/src/settings/nm-settings-connection.c @@ -3181,7 +3181,7 @@ nm_settings_connection_class_init (NMSettingsConnectionClass *klass) g_type_class_add_private (klass, sizeof (NMSettingsConnectionPrivate)); - dbus_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH_SETTINGS); + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH_SETTINGS); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_settings_connection); object_class->constructed = constructed; diff --git a/src/settings/nm-settings.c b/src/settings/nm-settings.c index 8d804175f9..7cb5a2234b 100644 --- a/src/settings/nm-settings.c +++ b/src/settings/nm-settings.c @@ -2080,7 +2080,7 @@ nm_settings_class_init (NMSettingsClass *class) GObjectClass *object_class = G_OBJECT_CLASS (class); NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (class); - dbus_object_class->export_path = NM_DBUS_PATH_SETTINGS; + dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_STATIC (NM_DBUS_PATH_SETTINGS); dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_settings); object_class->get_property = get_property;