about summary refs log tree commit diff
path: root/libnm-core/nm-setting-hostname.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnm-core/nm-setting-hostname.c')
-rw-r--r--libnm-core/nm-setting-hostname.c339
1 files changed, 339 insertions, 0 deletions
diff --git a/libnm-core/nm-setting-hostname.c b/libnm-core/nm-setting-hostname.c
new file mode 100644
index 00000000..2396b7bd
--- /dev/null
+++ b/libnm-core/nm-setting-hostname.c
@@ -0,0 +1,339 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2020 Red Hat, Inc.
+ */
+
+#include "libnm-core/nm-default-libnm-core.h"
+
+#include "nm-setting-hostname.h"
+
+#include "nm-setting-private.h"
+#include "nm-utils-private.h"
+
+/**
+ * SECTION:nm-setting-hostname
+ * @short_description: Contains properties related to the hostname
+ * @include: nm-setting-hostname.h
+ **/
+
+/*****************************************************************************/
+
+NM_GOBJECT_PROPERTIES_DEFINE(NMSettingHostname,
+                             PROP_PRIORITY,
+                             PROP_FROM_DHCP,
+                             PROP_FROM_DNS_LOOKUP,
+                             PROP_ONLY_FROM_DEFAULT, );
+
+/**
+ * NMSettingHostname:
+ *
+ * Hostname settings
+ *
+ * Since: 1.30
+ */
+struct _NMSettingHostname {
+    NMSetting parent;
+    int       priority;
+    NMTernary from_dhcp;
+    NMTernary from_dns_lookup;
+    NMTernary only_from_default;
+};
+
+struct _NMSettingHostnameClass {
+    NMSettingClass parent;
+};
+
+G_DEFINE_TYPE(NMSettingHostname, nm_setting_hostname, NM_TYPE_SETTING)
+
+/**
+ * nm_setting_hostname_get_priority:
+ * @setting: the #NMSettingHostname
+ *
+ * Returns the value contained in the #NMSettingHostname:priority
+ * property.
+ *
+ * Returns: the 'priority' property value
+ *
+ * Since: 1.30
+ **/
+int
+nm_setting_hostname_get_priority(NMSettingHostname *setting)
+{
+    g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), 0);
+
+    return setting->priority;
+}
+
+/**
+ * nm_setting_hostname_get_from_dhcp:
+ * @setting: the #NMSettingHostname
+ *
+ * Returns the value contained in the #NMSettingHostname:from-dhcp
+ * property.
+ *
+ * Returns: the 'from-dhcp' property value
+ *
+ * Since: 1.30
+ **/
+NMTernary
+nm_setting_hostname_get_from_dhcp(NMSettingHostname *setting)
+{
+    g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), NM_TERNARY_DEFAULT);
+
+    return setting->from_dhcp;
+}
+
+/**
+ * nm_setting_hostname_get_from_dns_lookup:
+ * @setting: the #NMSettingHostname
+ *
+ * Returns the value contained in the #NMSettingHostname:from-dns-lookup
+ * property.
+ *
+ * Returns: the 'from-dns-lookup' property value
+ *
+ * Since: 1.30
+ **/
+NMTernary
+nm_setting_hostname_get_from_dns_lookup(NMSettingHostname *setting)
+{
+    g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), NM_TERNARY_DEFAULT);
+
+    return setting->from_dns_lookup;
+}
+
+/**
+ * nm_setting_hostname_get_only_from_default:
+ * @setting: the #NMSettingHostname
+ *
+ * Returns the value contained in the #NMSettingHostname:only-from-default
+ * property.
+ *
+ * Returns: the 'only-from-default' property value
+ *
+ * Since: 1.30
+ **/
+NMTernary
+nm_setting_hostname_get_only_from_default(NMSettingHostname *setting)
+{
+    g_return_val_if_fail(NM_IS_SETTING_HOSTNAME(setting), NM_TERNARY_DEFAULT);
+
+    return setting->only_from_default;
+}
+
+/*****************************************************************************/
+
+static void
+get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+    NMSettingHostname *self = NM_SETTING_HOSTNAME(object);
+
+    switch (prop_id) {
+    case PROP_PRIORITY:
+        g_value_set_int(value, self->priority);
+        break;
+    case PROP_FROM_DHCP:
+        g_value_set_enum(value, self->from_dhcp);
+        break;
+    case PROP_FROM_DNS_LOOKUP:
+        g_value_set_enum(value, self->from_dns_lookup);
+        break;
+    case PROP_ONLY_FROM_DEFAULT:
+        g_value_set_enum(value, self->only_from_default);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+    NMSettingHostname *self = NM_SETTING_HOSTNAME(object);
+
+    switch (prop_id) {
+    case PROP_PRIORITY:
+        self->priority = g_value_get_int(value);
+        break;
+    case PROP_FROM_DHCP:
+        self->from_dhcp = g_value_get_enum(value);
+        break;
+    case PROP_FROM_DNS_LOOKUP:
+        self->from_dns_lookup = g_value_get_enum(value);
+        break;
+    case PROP_ONLY_FROM_DEFAULT:
+        self->only_from_default = g_value_get_enum(value);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
+}
+
+/*****************************************************************************/
+
+static void
+nm_setting_hostname_init(NMSettingHostname *setting)
+{
+    setting->from_dhcp         = NM_TERNARY_DEFAULT;
+    setting->from_dns_lookup   = NM_TERNARY_DEFAULT;
+    setting->only_from_default = NM_TERNARY_DEFAULT;
+}
+
+/**
+ * nm_setting_hostname_new:
+ *
+ * Creates a new #NMSettingHostname object with default values.
+ *
+ * Returns: (transfer full): the new empty #NMSettingHostname object
+ *
+ * Since: 1.30
+ **/
+NMSetting *
+nm_setting_hostname_new(void)
+{
+    return g_object_new(NM_TYPE_SETTING_HOSTNAME, NULL);
+}
+
+static void
+nm_setting_hostname_class_init(NMSettingHostnameClass *klass)
+{
+    GObjectClass *  object_class  = G_OBJECT_CLASS(klass);
+    NMSettingClass *setting_class = NM_SETTING_CLASS(klass);
+
+    object_class->get_property = get_property;
+    object_class->set_property = set_property;
+
+    /**
+     * NMSettingHostname:priority
+     *
+     * The relative priority of this connection to determine the
+     * system hostname. A lower numerical value is better (higher
+     * priority).  A connection with higher priority is considered
+     * before connections with lower priority.
+     *
+     * If the value is zero, it can be overridden by a global value
+     * from NetworkManager configuration. If the property doesn't have
+     * a value in the global configuration, the value is assumed to be
+     * 100.
+     *
+     * Negative values have the special effect of excluding other
+     * connections with a greater numerical priority value; so in
+     * presence of at least one negative priority, only connections
+     * with the lowest priority value will be used to determine the
+     * hostname.
+     *
+     * Since: 1.30
+     **/
+    /* ---ifcfg-rh---
+     * property: priority
+     * variable: HOSTNAME_PRIORITY(+)
+     * default: missing variable means global value or 100
+     * description: hostname priority
+     * example: HOSTNAME_PRIORITY=50
+     * ---end---
+     */
+    obj_properties[PROP_PRIORITY] = g_param_spec_int(NM_SETTING_HOSTNAME_PRIORITY,
+                                                     "",
+                                                     "",
+                                                     G_MININT32,
+                                                     G_MAXINT32,
+                                                     0,
+                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    /**
+     * NMSettingHostname:from-dhcp
+     *
+     * Whether the system hostname can be determined from DHCP on
+     * this connection.
+     *
+     * When set to %NM_TERNARY_DEFAULT, the value from global configuration
+     * is used. If the property doesn't have a value in the global
+     * configuration, NetworkManager assumes the value to be %NM_TERNARY_TRUE.
+     *
+     * Since: 1.30
+     **/
+    /* ---ifcfg-rh---
+     * property: from-dhcp
+     * variable: HOSTNAME_FROM_DHCP(+)
+     * default: missing variable means global default or 1
+     * description: whether the system hostname can be determined from DHCP
+     * example: HOSTNAME_FROM_DHCP=0,1
+     * ---end---
+     */
+    obj_properties[PROP_FROM_DHCP] = g_param_spec_enum(
+        NM_SETTING_HOSTNAME_FROM_DHCP,
+        "",
+        "",
+        NM_TYPE_TERNARY,
+        NM_TERNARY_DEFAULT,
+        NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    /**
+     * NMSettingHostname:from-dns-lookup
+     *
+     * Whether the system hostname can be determined from reverse
+     * DNS lookup of addresses on this device.
+     *
+     * When set to %NM_TERNARY_DEFAULT, the value from global configuration
+     * is used. If the property doesn't have a value in the global
+     * configuration, NetworkManager assumes the value to be %NM_TERNARY_TRUE.
+     *
+     * Since: 1.30
+     **/
+    /* ---ifcfg-rh---
+     * property: from-dhcp
+     * variable: HOSTNAME_FROM_DNS_LOOKUP(+)
+     * default: missing variable means global default or 1
+     * description: whether the system hostname can be determined from reverse
+     *    DNS lookup
+     * example: HOSTNAME_FROM_DNS_LOOKUP=0,1
+     * ---end---
+     */
+    obj_properties[PROP_FROM_DNS_LOOKUP] = g_param_spec_enum(
+        NM_SETTING_HOSTNAME_FROM_DNS_LOOKUP,
+        "",
+        "",
+        NM_TYPE_TERNARY,
+        NM_TERNARY_DEFAULT,
+        NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    /**
+     * NMSettingHostname:only-from-default
+     *
+     * If set to %NM_TERNARY_TRUE, NetworkManager attempts to get
+     * the hostname via DHCPv4/DHCPv6 or reverse DNS lookup on this
+     * device only when the device has the default route for the given
+     * address family (IPv4/IPv6).
+     *
+     * If set to %NM_TERNARY_FALSE, the hostname can be set from this
+     * device even if it doesn't have the default route.
+     *
+     * When set to %NM_TERNARY_DEFAULT, the value from global configuration
+     * is used. If the property doesn't have a value in the global
+     * configuration, NetworkManager assumes the value to be %NM_TERNARY_FALSE.
+     *
+     * Since: 1.30
+     **/
+    /* ---ifcfg-rh---
+     * property: only-best-device
+     * variable: HOSTNAME_ONLY_FROM_DEFAULT(+)
+     * default: missing variable means global default or 1
+     * description: whether the hostname can be determined only from
+     *    devices with the default route
+     * example: HOSTNAME_ONLY_FROM_DEFAULT=0,1
+     * ---end---
+     */
+    obj_properties[PROP_ONLY_FROM_DEFAULT] = g_param_spec_enum(
+        NM_SETTING_HOSTNAME_ONLY_FROM_DEFAULT,
+        "",
+        "",
+        NM_TYPE_TERNARY,
+        NM_TERNARY_DEFAULT,
+        NM_SETTING_PARAM_FUZZY_IGNORE | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+    g_object_class_install_properties(object_class, _PROPERTY_ENUMS_LAST, obj_properties);
+
+    _nm_setting_class_commit(setting_class, NM_META_SETTING_TYPE_HOSTNAME);
+}