core: merge branch 'th/hostname-cleanup'

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1057
This commit is contained in:
Thomas Haller 2022-01-10 20:45:03 +01:00
commit daba069eab
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
8 changed files with 77 additions and 57 deletions

View file

@ -959,7 +959,7 @@ config_init(NMDhcpClientConfig *config, const NMDhcpClientConfig *src)
const char *hostname;
gs_free char *hostname_tmp = NULL;
hostname = nm_hostname_manager_get_hostname(nm_hostname_manager_get());
hostname = nm_hostname_manager_get_static_hostname(nm_hostname_manager_get());
if (nm_utils_is_specific_hostname(hostname)) {
if (config->addr_family == AF_INET) {

View file

@ -2001,22 +2001,18 @@ nm_dns_manager_set_initial_hostname(NMDnsManager *self, const char *hostname)
void
nm_dns_manager_set_hostname(NMDnsManager *self, const char *hostname, gboolean skip_update)
{
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self);
const char *filtered = NULL;
NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE(self);
/* Certain hostnames we don't want to include in resolv.conf 'searches' */
if (hostname && nm_utils_is_specific_hostname(hostname) && !strstr(hostname, ".in-addr.arpa")
&& strchr(hostname, '.')) {
filtered = hostname;
}
/* pass */
} else
hostname = NULL;
if ((!priv->hostname && !filtered)
|| (priv->hostname && filtered && !strcmp(priv->hostname, filtered)))
if (!nm_strdup_reset(&priv->hostname, hostname))
return;
g_free(priv->hostname);
priv->hostname = g_strdup(filtered);
if (skip_update)
return;

View file

@ -52,10 +52,10 @@
/*****************************************************************************/
NM_GOBJECT_PROPERTIES_DEFINE(NMHostnameManager, PROP_HOSTNAME, );
NM_GOBJECT_PROPERTIES_DEFINE(NMHostnameManager, PROP_STATIC_HOSTNAME, );
typedef struct {
char *current_hostname;
char *static_hostname;
GFileMonitor *monitor;
GFileMonitor *dhcp_monitor;
gulong monitor_id;
@ -178,32 +178,46 @@ hostname_is_dynamic(void)
/*****************************************************************************/
const char *
nm_hostname_manager_get_hostname(NMHostnameManager *self)
nm_hostname_manager_get_static_hostname(NMHostnameManager *self)
{
g_return_val_if_fail(NM_IS_HOSTNAME_MANAGER(self), NULL);
return NM_HOSTNAME_MANAGER_GET_PRIVATE(self)->current_hostname;
return NM_HOSTNAME_MANAGER_GET_PRIVATE(self)->static_hostname;
}
static void
_set_hostname(NMHostnameManager *self, const char *hostname)
{
NMHostnameManagerPrivate *priv = NM_HOSTNAME_MANAGER_GET_PRIVATE(self);
NMHostnameManagerPrivate *priv = NM_HOSTNAME_MANAGER_GET_PRIVATE(self);
gs_free char *hostname_free = NULL;
char *old_hostname;
hostname = nm_str_not_empty(hostname);
if (nm_streq0(hostname, priv->current_hostname))
if (hostname) {
/* as we also read the file from disk, it might not be in UTF-8 encoding.
*
* A hostname in non-UTF-8 encoding would be odd and cause issues when we
* try to expose them on D-Bus via the NM_SETTINGS_STATIC_HOSTNAME property.
*
* Sanitize somewhat. It's wrong anyway. */
hostname = nm_utils_str_utf8safe_escape(hostname,
NM_UTILS_STR_UTF8_SAFE_FLAG_ESCAPE_CTRL,
&hostname_free);
}
if (nm_streq0(hostname, priv->static_hostname))
return;
_LOGI("hostname changed from %s%s%s to %s%s%s",
NM_PRINT_FMT_QUOTED(priv->current_hostname, "\"", priv->current_hostname, "\"", "(none)"),
_LOGI("static hostname changed from %s%s%s to %s%s%s",
NM_PRINT_FMT_QUOTED(priv->static_hostname, "\"", priv->static_hostname, "\"", "(none)"),
NM_PRINT_FMT_QUOTED(hostname, "\"", hostname, "\"", "(none)"));
old_hostname = priv->current_hostname;
priv->current_hostname = g_strdup(hostname);
old_hostname = priv->static_hostname;
priv->static_hostname = g_strdup(hostname);
g_free(old_hostname);
_notify(self, PROP_HOSTNAME);
_notify(self, PROP_STATIC_HOSTNAME);
}
static void
@ -499,8 +513,8 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
NMHostnameManager *self = NM_HOSTNAME_MANAGER(object);
switch (prop_id) {
case PROP_HOSTNAME:
g_value_set_string(value, nm_hostname_manager_get_hostname(self));
case PROP_STATIC_HOSTNAME:
g_value_set_string(value, nm_hostname_manager_get_static_hostname(self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@ -572,7 +586,7 @@ dispose(GObject *object)
_file_monitors_clear(self);
nm_clear_g_free(&priv->current_hostname);
nm_clear_g_free(&priv->static_hostname);
G_OBJECT_CLASS(nm_hostname_manager_parent_class)->dispose(object);
}
@ -586,11 +600,12 @@ nm_hostname_manager_class_init(NMHostnameManagerClass *class)
object_class->get_property = get_property;
object_class->dispose = dispose;
obj_properties[PROP_HOSTNAME] = g_param_spec_string(NM_HOSTNAME_MANAGER_HOSTNAME,
"",
"",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_STATIC_HOSTNAME] =
g_param_spec_string(NM_HOSTNAME_MANAGER_STATIC_HOSTNAME,
"",
"",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
}

View file

@ -21,7 +21,7 @@
#define NM_HOSTNAME_MANAGER_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_HOSTNAME_MANAGER, NMHostnameManagerClass))
#define NM_HOSTNAME_MANAGER_HOSTNAME "hostname"
#define NM_HOSTNAME_MANAGER_STATIC_HOSTNAME "static-hostname"
typedef struct _NMHostnameManager NMHostnameManager;
typedef struct _NMHostnameManagerClass NMHostnameManagerClass;
@ -34,7 +34,7 @@ GType nm_hostname_manager_get_type(void);
NMHostnameManager *nm_hostname_manager_get(void);
const char *nm_hostname_manager_get_hostname(NMHostnameManager *self);
const char *nm_hostname_manager_get_static_hostname(NMHostnameManager *self);
gboolean nm_hostname_manager_write_hostname(NMHostnameManager *self, const char *hostname);

View file

@ -2270,7 +2270,7 @@ system_unmanaged_devices_changed_cb(NMSettings *settings, GParamSpec *pspec, gpo
}
static void
hostname_changed_cb(NMHostnameManager *hostname_manager, GParamSpec *pspec, NMManager *self)
_static_hostname_changed_cb(NMHostnameManager *hostname_manager, GParamSpec *pspec, NMManager *self)
{
nm_dispatcher_call_hostname(NULL, NULL, NULL);
}
@ -6954,7 +6954,7 @@ nm_manager_start(NMManager *self, GError **error)
system_unmanaged_devices_changed_cb(priv->settings, NULL, self);
hostname_changed_cb(priv->hostname_manager, NULL, self);
_static_hostname_changed_cb(priv->hostname_manager, NULL, self);
if (!nm_settings_start(priv->settings, error))
return FALSE;
@ -7838,8 +7838,8 @@ constructed(GObject *object)
priv->hostname_manager = g_object_ref(nm_hostname_manager_get());
g_signal_connect(priv->hostname_manager,
"notify::" NM_HOSTNAME_MANAGER_HOSTNAME,
G_CALLBACK(hostname_changed_cb),
"notify::" NM_HOSTNAME_MANAGER_STATIC_HOSTNAME,
G_CALLBACK(_static_hostname_changed_cb),
self);
/*
@ -8227,7 +8227,9 @@ dispose(GObject *object)
}
if (priv->hostname_manager) {
g_signal_handlers_disconnect_by_func(priv->hostname_manager, hostname_changed_cb, self);
g_signal_handlers_disconnect_by_func(priv->hostname_manager,
_static_hostname_changed_cb,
self);
g_clear_object(&priv->hostname_manager);
}

View file

@ -830,7 +830,7 @@ update_system_hostname(NMPolicy *self, const char *msg)
*/
/* Try a persistent hostname first */
configured_hostname = nm_hostname_manager_get_hostname(priv->hostname_manager);
configured_hostname = nm_hostname_manager_get_static_hostname(priv->hostname_manager);
if (configured_hostname && nm_utils_is_specific_hostname(configured_hostname)) {
_set_hostname(self, configured_hostname, "from system configuration");
priv->dhcp_hostname = FALSE;
@ -1518,7 +1518,9 @@ process_secondaries(NMPolicy *self, NMActiveConnection *active, gboolean connect
}
static void
hostname_changed(NMHostnameManager *hostname_manager, GParamSpec *pspec, gpointer user_data)
_static_hostname_changed_cb(NMHostnameManager *hostname_manager,
GParamSpec *pspec,
gpointer user_data)
{
NMPolicyPrivate *priv = user_data;
NMPolicy *self = _PRIV_TO_SELF(priv);
@ -2744,8 +2746,8 @@ constructed(GObject *object)
self);
g_signal_connect(priv->hostname_manager,
"notify::" NM_HOSTNAME_MANAGER_HOSTNAME,
G_CALLBACK(hostname_changed),
"notify::" NM_HOSTNAME_MANAGER_STATIC_HOSTNAME,
G_CALLBACK(_static_hostname_changed_cb),
priv);
g_signal_connect(priv->manager,

View file

@ -327,7 +327,7 @@ _sett_conn_entry_find_shadowed_storage(SettConnEntry *sett_conn_entry,
NM_GOBJECT_PROPERTIES_DEFINE(NMSettings,
PROP_MANAGER,
PROP_UNMANAGED_SPECS,
PROP_HOSTNAME,
PROP_STATIC_HOSTNAME,
PROP_CAN_MODIFY,
PROP_CONNECTIONS,
PROP_STARTUP_COMPLETE, );
@ -3480,9 +3480,11 @@ err:
/*****************************************************************************/
static void
_hostname_changed_cb(NMHostnameManager *hostname_manager, GParamSpec *pspec, gpointer user_data)
_static_hostname_changed_cb(NMHostnameManager *hostname_manager,
GParamSpec *pspec,
gpointer user_data)
{
_notify(user_data, PROP_HOSTNAME);
_notify(user_data, PROP_STATIC_HOSTNAME);
}
/*****************************************************************************/
@ -3892,11 +3894,11 @@ nm_settings_start(NMSettings *self, GError **error)
_plugin_connections_reload(self);
g_signal_connect(priv->hostname_manager,
"notify::" NM_HOSTNAME_MANAGER_HOSTNAME,
G_CALLBACK(_hostname_changed_cb),
"notify::" NM_HOSTNAME_MANAGER_STATIC_HOSTNAME,
G_CALLBACK(_static_hostname_changed_cb),
self);
if (nm_hostname_manager_get_hostname(priv->hostname_manager))
_notify(self, PROP_HOSTNAME);
if (nm_hostname_manager_get_static_hostname(priv->hostname_manager))
_notify(self, PROP_STATIC_HOSTNAME);
priv->started = TRUE;
_startup_complete_check(self, 0);
@ -3923,10 +3925,10 @@ get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
g_value_take_boxed(value,
_nm_utils_slist_to_strv(nm_settings_get_unmanaged_specs(self), TRUE));
break;
case PROP_HOSTNAME:
case PROP_STATIC_HOSTNAME:
g_value_set_string(value,
priv->hostname_manager
? nm_hostname_manager_get_hostname(priv->hostname_manager)
? nm_hostname_manager_get_static_hostname(priv->hostname_manager)
: NULL);
break;
case PROP_CAN_MODIFY:
@ -4025,7 +4027,7 @@ dispose(GObject *object)
if (priv->hostname_manager) {
g_signal_handlers_disconnect_by_func(priv->hostname_manager,
G_CALLBACK(_hostname_changed_cb),
G_CALLBACK(_static_hostname_changed_cb),
self);
g_clear_object(&priv->hostname_manager);
}
@ -4167,7 +4169,9 @@ static const NMDBusInterfaceInfoExtended interface_info_settings = {
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE("Connections",
"ao",
NM_SETTINGS_CONNECTIONS),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE("Hostname", "s", NM_SETTINGS_HOSTNAME),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE("Hostname",
"s",
NM_SETTINGS_STATIC_HOSTNAME),
NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE("CanModify",
"b",
NM_SETTINGS_CAN_MODIFY), ), ),
@ -4200,11 +4204,12 @@ nm_settings_class_init(NMSettingsClass *class)
G_TYPE_STRV,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_HOSTNAME] = g_param_spec_string(NM_SETTINGS_HOSTNAME,
"",
"",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_STATIC_HOSTNAME] =
g_param_spec_string(NM_SETTINGS_STATIC_HOSTNAME,
"",
"",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
obj_properties[PROP_CAN_MODIFY] =
g_param_spec_boolean(NM_SETTINGS_CAN_MODIFY,

View file

@ -24,7 +24,7 @@
(G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_SETTINGS, NMSettingsClass))
#define NM_SETTINGS_UNMANAGED_SPECS "unmanaged-specs"
#define NM_SETTINGS_HOSTNAME "hostname"
#define NM_SETTINGS_STATIC_HOSTNAME "static-hostname"
#define NM_SETTINGS_CAN_MODIFY "can-modify"
#define NM_SETTINGS_CONNECTIONS "connections"
#define NM_SETTINGS_STARTUP_COMPLETE "startup-complete"