Merge "ueventd: Add devname sys_name to subsystem, pulling device names from sysfs" into main

This commit is contained in:
Treehugger Robot 2024-04-25 19:39:02 +00:00 committed by Gerrit Code Review
commit 6f5205229b
3 changed files with 20 additions and 6 deletions

View file

@ -59,9 +59,10 @@ device in. The section takes the below format of
`subsystem_name` is used to match uevent `SUBSYSTEM` value
`devname` takes one of two options
`devname` takes one of three options
1. `uevent_devname` specifies that the name of the node will be the uevent `DEVNAME`
2. `uevent_devpath` specified that the name of the node will be basename uevent `DEVPATH`
2. `uevent_devpath` specifies that the name of the node will be basename uevent `DEVPATH`
3. `sys_name` specifies that the name of the node will be the contents of `/sys/DEVPATH/name`
`dirname` is an optional parameter that specifies a directory within `/dev` where the node will be
created.

View file

@ -82,6 +82,7 @@ class Subsystem {
enum DevnameSource {
DEVNAME_UEVENT_DEVNAME,
DEVNAME_UEVENT_DEVPATH,
DEVNAME_SYS_NAME,
};
Subsystem() {}
@ -92,10 +93,18 @@ class Subsystem {
// Returns the full path for a uevent of a device that is a member of this subsystem,
// according to the rules parsed from ueventd.rc
std::string ParseDevPath(const Uevent& uevent) const {
std::string devname = devname_source_ == DEVNAME_UEVENT_DEVNAME
? uevent.device_name
: android::base::Basename(uevent.path);
std::string devname;
if (devname_source_ == DEVNAME_UEVENT_DEVNAME) {
devname = uevent.device_name;
} else if (devname_source_ == DEVNAME_UEVENT_DEVPATH) {
devname = android::base::Basename(uevent.path);
} else if (devname_source_ == DEVNAME_SYS_NAME) {
if (android::base::ReadFileToString("/sys/" + uevent.path + "/name", &devname)) {
devname.pop_back(); // Remove terminating newline
} else {
devname = uevent.device_name;
}
}
return dir_name_ + "/" + devname;
}

View file

@ -218,6 +218,10 @@ Result<void> SubsystemParser::ParseDevName(std::vector<std::string>&& args) {
subsystem_.devname_source_ = Subsystem::DEVNAME_UEVENT_DEVPATH;
return {};
}
if (args[1] == "sys_name") {
subsystem_.devname_source_ = Subsystem::DEVNAME_SYS_NAME;
return {};
}
return Error() << "invalid devname '" << args[1] << "'";
}