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.
This commit is contained in:
dramforever
2025-09-19 21:52:00 +08:00
parent bdd8728c91
commit d096f80b27

View File

@@ -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;