From: dramforever Date: Fri, 19 Sep 2025 13:52:00 +0000 (+0800) Subject: udev-builtin-net_id: Refactor names_devicetree() to avoid hardcoding X-Git-Tag: v259-rc1~459^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d096f80b27580fc124e7c0551f73e8432e836a05;p=thirdparty%2Fsystemd.git udev-builtin-net_id: Refactor names_devicetree() to avoid hardcoding Refactor most of the logic in names_devicetree() into a helper names_devicetree_alias_prefix() that takes an alias_prefix instead of hardcoding "ethernet". The return value names_devicetree_alias_prefix() will be used in further commits to allow for alias_prefix fallback. --- diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c index 36691b1f2da..fd80538638e 100644 --- a/src/udev/udev-builtin-net_id.c +++ b/src/udev/udev-builtin-net_id.c @@ -788,20 +788,20 @@ static int names_platform(UdevEvent *event, const char *prefix) { return 0; } -static int names_devicetree(UdevEvent *event, const char *prefix) { +static int names_devicetree_alias_prefix(UdevEvent *event, const char *prefix, const char *alias_prefix) { sd_device *dev = ASSERT_PTR(ASSERT_PTR(event)->dev); _cleanup_(sd_device_unrefp) sd_device *aliases_dev = NULL, *ofnode_dev = NULL, *devicetree_dev = NULL; const char *ofnode_path, *ofnode_syspath, *devicetree_syspath; int r; assert(prefix); + assert(alias_prefix); - if (!naming_scheme_has(NAMING_DEVICETREE_ALIASES)) - return 0; + /* Returns 1 if found, 0 if not found, negative if error */ - /* only ethernet supported for now */ - if (!streq(prefix, "en")) - return -EOPNOTSUPP; + _cleanup_free_ char *alias_prefix_0 = strjoin(alias_prefix, "0"); + if (!alias_prefix_0) + return log_oom_debug(); /* check if the device itself has an of_node */ if (naming_scheme_has(NAMING_DEVICETREE_PORT_ALIASES)) { @@ -860,7 +860,7 @@ static int names_devicetree(UdevEvent *event, const char *prefix) { const char *alias_path, *alias_index, *conflict; unsigned i; - alias_index = startswith(alias, "ethernet"); + alias_index = startswith(alias, alias_prefix); if (!alias_index) continue; @@ -873,31 +873,53 @@ static int names_devicetree(UdevEvent *event, const char *prefix) { /* If there's no index, we default to 0... */ if (isempty(alias_index)) { i = 0; - conflict = "ethernet0"; + conflict = alias_prefix_0; } else { r = safe_atou(alias_index, &i); if (r < 0) return log_device_debug_errno(dev, r, "Could not get index of alias %s: %m", alias); - conflict = "ethernet"; + conflict = alias_prefix; } /* ...but make sure we don't have an alias conflict */ if (i == 0 && device_get_sysattr_value_filtered(aliases_dev, conflict, NULL) >= 0) return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EEXIST), - "Ethernet alias conflict: ethernet and ethernet0 both exist."); + "DeviceTree alias conflict: %s and %s both exist.", + alias_prefix, alias_prefix_0); char str[ALTIFNAMSIZ]; if (snprintf_ok(str, sizeof str, "%sd%u", prefix, i)) udev_builtin_add_property(event, "ID_NET_NAME_ONBOARD", str); log_device_debug(dev, "DeviceTree identifier: alias_index=%u %s \"%s\"", i, glyph(GLYPH_ARROW_RIGHT), str + strlen(prefix)); - return 0; + return 1; } - return -ENOENT; + return 0; } +static int names_devicetree(UdevEvent *event, const char *prefix) { + int r; + + assert(event); + assert(prefix); + + if (!naming_scheme_has(NAMING_DEVICETREE_ALIASES)) + return 0; + + if (streq(prefix, "en")) + r = names_devicetree_alias_prefix(event, prefix, "ethernet"); + else + return -EOPNOTSUPP; /* Unsupported interface type */ + if (r < 0) + return r; + if (r == 0) /* Not found */ + return -ENOENT; + + return 0; /* Found */ +}; + static int names_pci(UdevEvent *event, const char *prefix) { sd_device *parent, *dev = ASSERT_PTR(ASSERT_PTR(event)->dev); _cleanup_(sd_device_unrefp) sd_device *physfn_pcidev = NULL;