summary refs log tree commit diff
path: root/libnm/nm-libnm-utils.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2021-10-01 23:05:04 +0200
committerMichael Biebl <biebl@debian.org>2021-10-01 23:05:04 +0200
commite74c568b07b50b97873fb4ee1d776dedefbd54d6 (patch)
tree3469f17ea9af91f7ff169b890633bda68b0cf76e /libnm/nm-libnm-utils.c
parentbfe522304da217296e2a61040f58e35ec5d6f3f2 (diff)
New upstream version 1.32.12 upstream/1.32.12
Diffstat (limited to 'libnm/nm-libnm-utils.c')
-rw-r--r--libnm/nm-libnm-utils.c915
1 files changed, 0 insertions, 915 deletions
diff --git a/libnm/nm-libnm-utils.c b/libnm/nm-libnm-utils.c
deleted file mode 100644
index 1000e04d..00000000
--- a/libnm/nm-libnm-utils.c
+++ /dev/null
@@ -1,915 +0,0 @@
-/* SPDX-License-Identifier: LGPL-2.1-or-later */
-/*
- * Copyright (C) 2007 - 2008 Novell, Inc.
- * Copyright (C) 2007 - 2018 Red Hat, Inc.
- */
-
-#include "libnm/nm-default-libnm.h"
-
-#include "nm-libnm-utils.h"
-
-#include "nm-glib-aux/nm-time-utils.h"
-#include "nm-libnm-core-intern/nm-common-macros.h"
-#include "nm-object.h"
-
-/*****************************************************************************/
-
-volatile int _nml_dbus_log_level = 0;
-
-int
-_nml_dbus_log_level_init(void)
-{
-    const GDebugKey keys[] = {
-        {"trace", _NML_DBUS_LOG_LEVEL_TRACE},
-        {"debug", _NML_DBUS_LOG_LEVEL_DEBUG},
-        {"warning", _NML_DBUS_LOG_LEVEL_WARN},
-        {"error", _NML_DBUS_LOG_LEVEL_ERROR},
-        {"stdout", NML_DBUS_LOG_STDOUT},
-    };
-    int l;
-
-    l = _NML_DBUS_LOG_LEVEL_INITIALIZED
-        | nm_utils_parse_debug_string(g_getenv("LIBNM_CLIENT_DEBUG"), keys, G_N_ELEMENTS(keys));
-
-    if (!g_atomic_int_compare_and_exchange(&_nml_dbus_log_level, 0, l))
-        l = g_atomic_int_get(&_nml_dbus_log_level);
-
-    nm_assert(l & _NML_DBUS_LOG_LEVEL_INITIALIZED);
-    return l;
-}
-
-void
-_nml_dbus_log(NMLDBusLogLevel level, gboolean use_stdout, const char *fmt, ...)
-{
-    NMLDBusLogLevel configured_log_level;
-    gs_free char *  msg = NULL;
-    va_list         args;
-    const char *    prefix = "";
-    gint64          ts;
-    pid_t           pid;
-
-    /* we only call _nml_dbus_log() after nml_dbus_log_enabled(), which already does
-     * an atomic access to the variable. Since the value is only initialized once and
-     * never changes, we can just access it without additional locking. */
-    configured_log_level = _nml_dbus_log_level;
-
-    nm_assert(level & configured_log_level);
-
-    va_start(args, fmt);
-    msg = g_strdup_vprintf(fmt, args);
-    va_end(args);
-
-    switch (level) {
-    case NML_DBUS_LOG_LEVEL_TRACE:
-        prefix = "<trace> ";
-        break;
-    case NML_DBUS_LOG_LEVEL_DEBUG:
-        prefix = "<debug> ";
-        break;
-    case NML_DBUS_LOG_LEVEL_WARN:
-        prefix = "<warn > ";
-        if (NM_FLAGS_HAS(configured_log_level, _NML_DBUS_LOG_LEVEL_WARN)) {
-            g_warning("libnm-dbus: %s%s", prefix, msg);
-            return;
-        }
-        break;
-    case NML_DBUS_LOG_LEVEL_ERROR:
-        prefix = "<error> ";
-        if (NM_FLAGS_HAS(configured_log_level, _NML_DBUS_LOG_LEVEL_ERROR)) {
-            g_critical("libnm-dbus: %s%s", prefix, msg);
-            return;
-        }
-        if (NM_FLAGS_HAS(configured_log_level, _NML_DBUS_LOG_LEVEL_WARN)) {
-            g_warning("libnm-dbus: %s%s", prefix, msg);
-            return;
-        }
-        break;
-    default:
-        break;
-    }
-
-    ts = nm_utils_clock_gettime_nsec(CLOCK_BOOTTIME);
-
-    pid = getpid();
-
-    if (use_stdout) {
-        g_print("libnm-dbus[%lld]: %s[%" G_GINT64_FORMAT ".%05" G_GINT64_FORMAT "] %s\n",
-                (long long) pid,
-                prefix,
-                ts / NM_UTILS_NSEC_PER_SEC,
-                (ts / (NM_UTILS_NSEC_PER_SEC / 10000)) % 10000,
-                msg);
-    } else {
-        g_printerr("libnm-dbus[%lld]: %s[%" G_GINT64_FORMAT ".%05" G_GINT64_FORMAT "] %s\n",
-                   (long long) pid,
-                   prefix,
-                   ts / NM_UTILS_NSEC_PER_SEC,
-                   (ts / (NM_UTILS_NSEC_PER_SEC / 10000)) % 10000,
-                   msg);
-    }
-}
-
-/*****************************************************************************/
-
-/* Stolen from dbus-glib */
-char *
-nm_utils_wincaps_to_dash(const char *caps)
-{
-    const char *p;
-    GString *   str;
-
-    str = g_string_new(NULL);
-    p   = caps;
-    while (*p) {
-        if (g_ascii_isupper(*p)) {
-            if (str->len > 0 && (str->len < 2 || str->str[str->len - 2] != '-'))
-                g_string_append_c(str, '-');
-            g_string_append_c(str, g_ascii_tolower(*p));
-        } else
-            g_string_append_c(str, *p);
-        ++p;
-    }
-
-    return g_string_free(str, FALSE);
-}
-
-/*****************************************************************************/
-
-static char *
-_fixup_string(const char *       desc,
-              const char *const *ignored_phrases,
-              const char *const *ignored_words,
-              gboolean           square_brackets_sensible)
-{
-    char *   desc_full;
-    gboolean in_paren = FALSE;
-    char *   p, *q;
-    int      i;
-
-    if (!desc || !desc[0])
-        return NULL;
-
-    /* restore original non-UTF-8-safe text. */
-    desc_full = nm_utils_str_utf8safe_unescape_cp(desc, NM_UTILS_STR_UTF8_SAFE_FLAG_NONE);
-
-    /* replace all invalid UTF-8 bytes with space. */
-    p = desc_full;
-    while (!g_utf8_validate(p, -1, (const char **) &q)) {
-        /* the byte is invalid UTF-8. Replace it with space and proceed. */
-        *q = ' ';
-        p  = q + 1;
-    }
-
-    /* replace '_', ',', ASCII control characters and parentheses, with space. */
-    for (p = desc_full; p[0]; p++) {
-        if (*p == '(')
-            in_paren = TRUE;
-        if (NM_IN_SET(*p, '_', ',') || *p < ' ' || in_paren)
-            *p = ' ';
-        if (*p == ')')
-            in_paren = FALSE;
-    }
-
-    /* Attempt to shorten ID by ignoring certain phrases */
-    for (i = 0; ignored_phrases[i]; i++) {
-        p = strstr(desc_full, ignored_phrases[i]);
-        if (p) {
-            const char *eow = &p[strlen(ignored_phrases[i])];
-
-            /* require that the phrase is delimited by space, or
-             * at the beginning or end of the description. */
-            if ((p == desc_full || p[-1] == ' ') && NM_IN_SET(eow[0], '\0', ' '))
-                memmove(p, eow, strlen(eow) + 1); /* +1 for the \0 */
-        }
-    }
-
-    /* Attempt to shorten ID by ignoring certain individual words.
-     * - word-split the description at spaces
-     * - coalesce multiple spaces
-     * - skip over ignored_words */
-    p = desc_full;
-    q = desc_full;
-    for (;;) {
-        char *eow;
-        gsize l;
-
-        /* skip leading spaces. */
-        while (p[0] == ' ')
-            p++;
-
-        if (!p[0])
-            break;
-
-        /* split leading word on first space */
-        eow = strchr(p, ' ');
-        if (eow)
-            *eow = '\0';
-
-        if (nm_utils_strv_find_first((char **) ignored_words, -1, p) >= 0)
-            goto next;
-
-        l = strlen(p);
-        if (q != p) {
-            if (q != desc_full)
-                *q++ = ' ';
-            memmove(q, p, l);
-        }
-        q += l;
-
-next:
-        if (!eow)
-            break;
-        p = eow + 1;
-    }
-
-    *q++ = '\0';
-
-    p = strchr(desc_full, '[');
-    if (p == desc_full) {
-        /* All we're left with is in square brackets.
-         * Always prefer that to a blank string.*/
-        square_brackets_sensible = TRUE;
-    }
-    if (square_brackets_sensible) {
-        /* If there's a [<string>] that survived the substitution, then the string
-         * is a short form that is generally preferable. */
-        q = strchr(desc_full, ']');
-        if (p && q > p) {
-            p++;
-            memmove(desc_full, p, q - p);
-            desc_full[q - p] = '\0';
-        }
-    } else {
-        /* [<string>] sometimes contains the preferred human-readable name, but
-         * mostly it's utterly useless. Sigh. Drop it. */
-        if (p) {
-            if (p > desc_full && p[-1] == ' ')
-                p--;
-            *p = '\0';
-        }
-    }
-
-    if (!desc_full[0]) {
-        g_free(desc_full);
-        return NULL;
-    }
-
-    return desc_full;
-}
-
-char *
-nm_utils_fixup_vendor_string(const char *desc)
-{
-    static const char *const IGNORED_PHRASES[] = {
-        "Access Systems",
-        "Business Mobile Networks BV",
-        "Communications & Multimedia",
-        "Company of Japan",
-        "Computer Co.",
-        "Computer Corp.",
-        "Computer Corporation",
-        "Computer Inc.",
-        "Computer, Inc.",
-        "Information and Communication Products",
-        "Macao Commercial Offshore",
-        "Mobile Phones",
-        "(M) Son",
-        "Multimedia Internet Technology",
-        "Technology Group Ltd.",
-        "Wireless Networks",
-        "Wireless Solutions",
-        NULL,
-    };
-    static const char *const IGNORED_WORDS[] = {
-        "AB",
-        "AG",
-        "A/S",
-        "ASA",
-        "B.V.",
-        "Chips",
-        "Co.",
-        "Co",
-        "Communications",
-        "Components",
-        "Computers",
-        "Computertechnik",
-        "corp.",
-        "Corp.",
-        "Corp",
-        "Corporation",
-        "Design",
-        "Electronics",
-        "Enterprise",
-        "Enterprises",
-        "Europe",
-        "GmbH",
-        "Hardware",
-        "[hex]",
-        "Holdings",
-        "Inc.",
-        "Inc",
-        "INC.",
-        "Incorporated",
-        "Instruments",
-        "International",
-        "Intl.",
-        "Labs",
-        "Limited.",
-        "Limited",
-        "Ltd.",
-        "Ltd",
-        "Microelectronics",
-        "Microsystems",
-        "MSM",
-        "Multimedia",
-        "Networks",
-        "Norway",
-        "Optical",
-        "PCS",
-        "Semiconductor",
-        "Systems",
-        "Systemtechnik",
-        "Techcenter",
-        "Technik",
-        "Technologies",
-        "Technology",
-        "TECHNOLOGY",
-        "Telephonics",
-        "USA",
-        "WCDMA",
-        NULL,
-    };
-    char *desc_full;
-    char *p;
-
-    desc_full = _fixup_string(desc, IGNORED_PHRASES, IGNORED_WORDS, TRUE);
-    if (!desc_full)
-        return NULL;
-
-    /* Chop off everything after a slash. */
-    for (p = desc_full; *p; p++) {
-        if ((p[0] == ' ' && p[1] == '/') || p[0] == '/') {
-            p[0] = '\0';
-            break;
-        }
-    }
-
-    nm_assert(g_utf8_validate(desc_full, -1, NULL));
-
-    return desc_full;
-}
-
-char *
-nm_utils_fixup_product_string(const char *desc)
-{
-    static const char *const IGNORED_PHRASES[] = {
-        "100/10 MBit",
-        "10/100 Mbps",
-        "1.0 GbE",
-        "10 GbE",
-        "10 Gigabit",
-        "10 Mbps",
-        "1/10 Gigabit",
-        "150 Mbps",
-        "2.5 GbE",
-        "54 Mbps",
-        "Attached Port",
-        "+ BT",
-        "\"CDC Subset\"",
-        "CE Media Processor",
-        "Controller Area Network",
-        "Converged Network",
-        "DEC-Tulip compatible",
-        "Dish Adapter",
-        "Double 108 Mbps",
-        "Dual Band",
-        "Dual Port",
-        "Embedded UTP",
-        "Ethernet Connection",
-        "Ethernet Pro 100",
-        "Express Module",
-        "Fabric Adapter",
-        "Fast Ethernet",
-        "for 10GBASE-T",
-        "for 10GbE backplane",
-        "for 10GbE QSFP+",
-        "for 10GbE SFP+",
-        "for 1GbE",
-        "for 20GbE backplane",
-        "for 25GbE backplane",
-        "for 25GbE SFP28",
-        "for 40GbE backplane",
-        "for 40GbE QSFP+",
-        "G Adapter",
-        "Gigabit Desktop Network",
-        "Gigabit Ethernet",
-        "Gigabit or",
-        "Host Interface",
-        "Host Virtual Interface",
-        "IEEE 802.11a/b/g",
-        "IEEE 802.11g",
-        "IEEE 802.11G",
-        "IEEE 802.11n",
-        "MAC + PHY",
-        "Mini Card",
-        "Mini Wireless",
-        "multicore SoC",
-        "Multi Function",
-        "N Draft 11n Wireless",
-        "Network Connection",
-        "Network Everywhere",
-        "N Wireless",
-        "N+ Wireless",
-        "OCT To Fast Ethernet Converter",
-        "PC Card",
-        "PCI Express",
-        "Platform Controller Hub",
-        "Plus Bluetooth",
-        "Quad Gigabit",
-        "rev 1",
-        "rev 17",
-        "rev 2",
-        "rev A",
-        "rev B",
-        "rev F",
-        "TO Ethernet",
-        "Turbo Wireless Adapter",
-        "Unified Wire",
-        "USB 1.1",
-        "USB 2.0",
-        "Virtual media for",
-        "WiFi Link",
-        "+ WiMAX",
-        "WiMAX/WiFi Link",
-        "Wireless G",
-        "Wireless G+",
-        "Wireless Lan",
-        "Wireless Mini adapter",
-        "Wireless Mini Adapter",
-        "Wireless N",
-        "with 1000-BASE-T interface",
-        "with CX4 copper interface",
-        "with Range Amplifier",
-        "with SR-XFP optical interface",
-        "w/ Upgradable Antenna",
-        NULL,
-    };
-    static const char *const IGNORED_WORDS[] = {
-        "1000BaseSX",
-        "1000BASE-T",
-        "1000Base-ZX",
-        "100/10M",
-        "100baseFx",
-        "100Base-MII",
-        "100Base-T",
-        "100BaseT4",
-        "100Base-TX",
-        "100BaseTX",
-        "100GbE",
-        "100Mbps",
-        "100MBps",
-        "10/100",
-        "10/100/1000",
-        "10/100/1000Base-T",
-        "10/100/1000BASE-T",
-        "10/100BaseT",
-        "10/100baseTX",
-        "10/100BaseTX",
-        "10/100/BNC",
-        "10/100M",
-        "10/20-Gigabit",
-        "10/25/40/50GbE",
-        "10/40G",
-        "10base-FL",
-        "10BaseT",
-        "10BASE-T",
-        "10G",
-        "10Gb",
-        "10Gb/25Gb",
-        "10Gb/25Gb/40Gb/50Gb",
-        "10Gbase-T",
-        "10GBase-T",
-        "10GBASE-T",
-        "10GbE",
-        "10Gbps",
-        "10-Giga",
-        "10-Gigabit",
-        "10mbps",
-        "10Mbps",
-        "1/10GbE",
-        "1/10-Gigabit",
-        "11b/g/n",
-        "11g",
-        "150Mbps",
-        "16Gbps/10Gbps",
-        "1GbE",
-        "1x2:2",
-        "20GbE",
-        "25Gb",
-        "25GbE",
-        "2-Port",
-        "2x3:3",
-        "3G",
-        "3G/4G",
-        "3x3:3",
-        "40GbE",
-        "4G",
-        "54g",
-        "54M",
-        "54Mbps",
-        "56k",
-        "5G",
-        "802.11",
-        "802.11a/b/g",
-        "802.11abg",
-        "802.11a/b/g/n",
-        "802.11abgn",
-        "802.11ac",
-        "802.11ad",
-        "802.11a/g",
-        "802.11b",
-        "802.11b/g",
-        "802.11bg",
-        "802.11b/g/n",
-        "802.11bgn",
-        "802.11b/g/n-draft",
-        "802.11g",
-        "802.11n",
-        "802.11N",
-        "802.11n/b/g",
-        "802.11ng",
-        "802AIN",
-        "802UIG-1",
-        "adapter",
-        "Adapter",
-        "adaptor",
-        "ADSL",
-        "Basic",
-        "CAN-Bus",
-        "card",
-        "Card",
-        "Cardbus",
-        "CardBus",
-        "CDMA",
-        "CNA",
-        "Composite",
-        "controller",
-        "Controller",
-        "Copper",
-        "DB",
-        "Desktop",
-        "device",
-        "Device",
-        "dongle",
-        "driver",
-        "Dual-band",
-        "Dual-Protocol",
-        "EISA",
-        "Enhanced",
-        "ethernet.",
-        "ethernet",
-        "Ethernet",
-        "Ethernet/RNDIS",
-        "ExpressModule",
-        "family",
-        "Family",
-        "Fast/Gigabit",
-        "Fiber",
-        "gigabit",
-        "Gigabit",
-        "G-NIC",
-        "Hi-Gain",
-        "Hi-Speed",
-        "HSDPA",
-        "HSUPA",
-        "integrated",
-        "Integrated",
-        "interface",
-        "LAN",
-        "LAN+Winmodem",
-        "Laptop",
-        "LTE",
-        "LTE/UMTS/GSM",
-        "MAC",
-        "Micro",
-        "Mini-Card",
-        "Mini-USB",
-        "misprogrammed",
-        "modem",
-        "Modem",
-        "Modem/Networkcard",
-        "Module",
-        "Multimode",
-        "Multithreaded",
-        "Name:",
-        "net",
-        "network",
-        "Network",
-        "n/g/b",
-        "NIC",
-        "Notebook",
-        "OEM",
-        "PCI",
-        "PCI64",
-        "PCIe",
-        "PCI-E",
-        "PCI-Express",
-        "PCI-X",
-        "PCMCIA",
-        "PDA",
-        "PnP",
-        "RDMA",
-        "RJ-45",
-        "Series",
-        "Server",
-        "SoC",
-        "Switch",
-        "Technologies",
-        "TOE",
-        "USB",
-        "USB2.0",
-        "USB/Ethernet",
-        "UTP",
-        "UTP/Coax",
-        "v1",
-        "v1.1",
-        "v2",
-        "V2.0",
-        "v3",
-        "v4",
-        "wifi",
-        "Wi-Fi",
-        "WiFi",
-        "wireless",
-        "Wireless",
-        "Wireless-150N",
-        "Wireless-300N",
-        "Wireless-G",
-        "Wireless-N",
-        "WLAN",
-        NULL,
-    };
-    char *desc_full;
-    char *p;
-
-    desc_full = _fixup_string(desc, IGNORED_PHRASES, IGNORED_WORDS, FALSE);
-    if (!desc_full)
-        return NULL;
-
-    /* Chop off everything after a '-'. */
-    for (p = desc_full; *p; p++) {
-        if (p[0] == ' ' && p[1] == '-' && p[2] == ' ') {
-            p[0] = '\0';
-            break;
-        }
-    }
-
-    nm_assert(g_utf8_validate(desc_full, -1, NULL));
-
-    return desc_full;
-}
-
-/*****************************************************************************/
-
-const NMLDBusMetaIface *const _nml_dbus_meta_ifaces[] = {
-    &_nml_dbus_meta_iface_nm,
-    &_nml_dbus_meta_iface_nm_accesspoint,
-    &_nml_dbus_meta_iface_nm_agentmanager,
-    &_nml_dbus_meta_iface_nm_checkpoint,
-    &_nml_dbus_meta_iface_nm_connection_active,
-    &_nml_dbus_meta_iface_nm_dhcp4config,
-    &_nml_dbus_meta_iface_nm_dhcp6config,
-    &_nml_dbus_meta_iface_nm_device,
-    &_nml_dbus_meta_iface_nm_device_adsl,
-    &_nml_dbus_meta_iface_nm_device_bluetooth,
-    &_nml_dbus_meta_iface_nm_device_bond,
-    &_nml_dbus_meta_iface_nm_device_bridge,
-    &_nml_dbus_meta_iface_nm_device_dummy,
-    &_nml_dbus_meta_iface_nm_device_generic,
-    &_nml_dbus_meta_iface_nm_device_iptunnel,
-    &_nml_dbus_meta_iface_nm_device_infiniband,
-    &_nml_dbus_meta_iface_nm_device_lowpan,
-    &_nml_dbus_meta_iface_nm_device_macsec,
-    &_nml_dbus_meta_iface_nm_device_macvlan,
-    &_nml_dbus_meta_iface_nm_device_modem,
-    &_nml_dbus_meta_iface_nm_device_olpcmesh,
-    &_nml_dbus_meta_iface_nm_device_ovsbridge,
-    &_nml_dbus_meta_iface_nm_device_ovsinterface,
-    &_nml_dbus_meta_iface_nm_device_ovsport,
-    &_nml_dbus_meta_iface_nm_device_ppp,
-    &_nml_dbus_meta_iface_nm_device_statistics,
-    &_nml_dbus_meta_iface_nm_device_team,
-    &_nml_dbus_meta_iface_nm_device_tun,
-    &_nml_dbus_meta_iface_nm_device_veth,
-    &_nml_dbus_meta_iface_nm_device_vlan,
-    &_nml_dbus_meta_iface_nm_device_vrf,
-    &_nml_dbus_meta_iface_nm_device_vxlan,
-    &_nml_dbus_meta_iface_nm_device_wifip2p,
-    &_nml_dbus_meta_iface_nm_device_wireguard,
-    &_nml_dbus_meta_iface_nm_device_wired,
-    &_nml_dbus_meta_iface_nm_device_wireless,
-    &_nml_dbus_meta_iface_nm_device_wpan,
-    &_nml_dbus_meta_iface_nm_dnsmanager,
-    &_nml_dbus_meta_iface_nm_ip4config,
-    &_nml_dbus_meta_iface_nm_ip6config,
-    &_nml_dbus_meta_iface_nm_settings,
-    &_nml_dbus_meta_iface_nm_settings_connection,
-    &_nml_dbus_meta_iface_nm_vpn_connection,
-    &_nml_dbus_meta_iface_nm_wifip2ppeer,
-};
-
-#define COMMON_PREFIX "org.freedesktop.NetworkManager"
-
-static int
-_strcmp_common_prefix(gconstpointer a, gconstpointer b, gpointer user_data)
-{
-    const NMLDBusMetaIface *iface           = a;
-    const char *            dbus_iface_name = b;
-
-    nm_assert(g_str_has_prefix(iface->dbus_iface_name, COMMON_PREFIX));
-
-    return strcmp(&iface->dbus_iface_name[NM_STRLEN(COMMON_PREFIX)], dbus_iface_name);
-}
-
-const NMLDBusMetaIface *
-nml_dbus_meta_iface_get(const char *dbus_iface_name)
-{
-    gssize idx;
-
-    nm_assert(dbus_iface_name);
-
-    G_STATIC_ASSERT_EXPR(G_STRUCT_OFFSET(NMLDBusMetaIface, dbus_iface_name) == 0);
-
-    /* we assume that NetworkManager only uses unique interface names. E.g. one
-     * interface name always has one particular meaning (and offers one set of
-     * properties, signals and methods). This is a convenient assumption, and
-     * we sure would never violate it when extending NM's D-Bus API. */
-
-    if (NM_STR_HAS_PREFIX(dbus_iface_name, COMMON_PREFIX)) {
-        /* optimize, that in fact all our interfaces have the same prefix. */
-        idx = nm_utils_ptrarray_find_binary_search((gconstpointer *) _nml_dbus_meta_ifaces,
-                                                   G_N_ELEMENTS(_nml_dbus_meta_ifaces),
-                                                   &dbus_iface_name[NM_STRLEN(COMMON_PREFIX)],
-                                                   _strcmp_common_prefix,
-                                                   NULL,
-                                                   NULL,
-                                                   NULL);
-    } else
-        return NULL;
-
-    if (idx < 0)
-        return NULL;
-    return _nml_dbus_meta_ifaces[idx];
-}
-
-const NMLDBusMetaProperty *
-nml_dbus_meta_property_get(const NMLDBusMetaIface *meta_iface,
-                           const char *            dbus_property_name,
-                           guint *                 out_idx)
-{
-    gssize idx;
-
-    nm_assert(meta_iface);
-    nm_assert(dbus_property_name);
-
-    idx = nm_utils_array_find_binary_search(meta_iface->dbus_properties,
-                                            sizeof(meta_iface->dbus_properties[0]),
-                                            meta_iface->n_dbus_properties,
-                                            &dbus_property_name,
-                                            nm_strcmp_p_with_data,
-                                            NULL);
-    if (idx < 0) {
-        NM_SET_OUT(out_idx, meta_iface->n_dbus_properties);
-        return NULL;
-    }
-    NM_SET_OUT(out_idx, idx);
-    return &meta_iface->dbus_properties[idx];
-}
-
-void
-_nml_dbus_meta_class_init_with_properties_impl(GObjectClass *                 object_class,
-                                               const NMLDBusMetaIface *const *meta_ifaces)
-{
-    int i_iface;
-
-    nm_assert(G_IS_OBJECT_CLASS(object_class));
-    nm_assert(meta_ifaces);
-    nm_assert(meta_ifaces[0]);
-
-    for (i_iface = 0; meta_ifaces[i_iface]; i_iface++) {
-        const NMLDBusMetaIface *meta_iface = meta_ifaces[i_iface];
-        guint8 *                reverse_idx;
-        guint8                  i;
-
-        nm_assert(g_type_is_a(meta_iface->get_type_fcn(), G_OBJECT_CLASS_TYPE(object_class)));
-        nm_assert(meta_iface->n_obj_properties > 0);
-        nm_assert(meta_iface->obj_properties);
-        nm_assert(meta_iface->obj_properties_reverse_idx[0] == 0);
-        nm_assert(meta_iface->obj_properties == meta_ifaces[0]->obj_properties);
-
-        if (i_iface == 0)
-            g_object_class_install_properties(object_class,
-                                              meta_iface->n_obj_properties,
-                                              (GParamSpec **) meta_iface->obj_properties);
-
-        reverse_idx = (guint8 *) meta_iface->obj_properties_reverse_idx;
-
-        for (i = 0; i < meta_iface->n_obj_properties; i++)
-            reverse_idx[i] = 0xFFu;
-        for (i = 0; i < meta_iface->n_dbus_properties; i++) {
-            const NMLDBusMetaProperty *mpr = &meta_iface->dbus_properties[i];
-
-            if (mpr->obj_properties_idx != 0 && !mpr->obj_property_no_reverse_idx) {
-                nm_assert(mpr->obj_properties_idx < meta_iface->n_obj_properties);
-                nm_assert(reverse_idx[mpr->obj_properties_idx] == 0xFFu);
-
-                reverse_idx[mpr->obj_properties_idx] = i;
-            }
-        }
-    }
-}
-
-gboolean
-nm_utils_g_param_spec_is_default(const GParamSpec *pspec)
-{
-    g_return_val_if_fail(pspec, FALSE);
-
-    if (pspec->value_type == G_TYPE_BOOLEAN)
-        return ((((GParamSpecBoolean *) pspec)->default_value) == FALSE);
-    if (pspec->value_type == G_TYPE_UCHAR)
-        return ((((GParamSpecUChar *) pspec)->default_value) == 0u);
-    if (pspec->value_type == G_TYPE_INT)
-        return ((((GParamSpecInt *) pspec)->default_value) == 0);
-    if (pspec->value_type == G_TYPE_UINT)
-        return ((((GParamSpecUInt *) pspec)->default_value) == 0u);
-    if (pspec->value_type == G_TYPE_INT64)
-        return ((((GParamSpecInt64 *) pspec)->default_value) == 0);
-    if (pspec->value_type == G_TYPE_UINT64)
-        return ((((GParamSpecUInt64 *) pspec)->default_value) == 0u);
-    if (g_type_is_a(pspec->value_type, G_TYPE_ENUM))
-        return ((((GParamSpecEnum *) pspec)->default_value) == 0);
-    if (g_type_is_a(pspec->value_type, G_TYPE_FLAGS))
-        return ((((GParamSpecFlags *) pspec)->default_value) == 0u);
-    if (pspec->value_type == G_TYPE_STRING)
-        return ((((GParamSpecString *) pspec)->default_value) == NULL);
-    if (NM_IN_SET(pspec->value_type,
-                  G_TYPE_BYTES,
-                  G_TYPE_PTR_ARRAY,
-                  G_TYPE_ARRAY,
-                  G_TYPE_HASH_TABLE,
-                  G_TYPE_STRV)) {
-        /* boxed types have NULL default. */
-        g_return_val_if_fail(G_IS_PARAM_SPEC_BOXED(pspec), FALSE);
-        g_return_val_if_fail(G_TYPE_IS_BOXED(pspec->value_type), FALSE);
-        return TRUE;
-    }
-    if (g_type_is_a(pspec->value_type, NM_TYPE_OBJECT)) {
-        /* object types have NULL default. */
-        g_return_val_if_fail(G_IS_PARAM_SPEC_OBJECT(pspec), FALSE);
-        g_return_val_if_fail(G_TYPE_IS_OBJECT(pspec->value_type), FALSE);
-        return TRUE;
-    }
-
-    /* This function is only used for asserting/testing. It thus
-     * strictly asserts and only support argument types that we expect. */
-    g_return_val_if_reached(FALSE);
-}
-
-/*****************************************************************************/
-
-/**
- * nm_utils_print:
- * @output_mode: if 1 it uses g_print(). If 2, it uses g_printerr().
- *   If 0, it uses either g_print() or g_printerr(), depending
- *   on LIBNM_CLIENT_DEBUG (and the "stdout" flag).
- * @msg: the message to print. The function does not append
- *   a trailing newline.
- *
- * The only purpose of this function is to give access to g_print()
- * or g_printerr() from pygobject. libnm can do debug logging by
- * setting LIBNM_CLIENT_DEBUG and uses thereby g_printerr() or
- * g_print(). A plain "print()" function in python is not in sync
- * with these functions (it implements additional buffering). By
- * using nm_utils_print(), the same logging mechanisms can be used.
- *
- * Since: 1.30
- */
-void
-nm_utils_print(int output_mode, const char *msg)
-{
-    gboolean use_stdout;
-
-    g_return_if_fail(msg);
-
-    if (output_mode == 0) {
-        nml_dbus_log_enabled_full(NML_DBUS_LOG_LEVEL_ANY, &use_stdout);
-        output_mode = use_stdout ? 1 : 2;
-    }
-
-    if (output_mode == 1)
-        g_print("%s", msg);
-    else if (output_mode == 2)
-        g_printerr("%s", msg);
-    else
-        g_return_if_reached();
-}