ueventd: fix subsystem list logic issues
1) Check subsystems list before doing usb subsystem logic. This allows developers to handle usb* subsystems in ueventd.rc files. 2) Fix a bug where each subsystem_ instance is not reinitialized, but rather only the name_ member was set. Test: boot bullhead Test: check that multiple uevent_devname subsystems work when specified in ueventd.rc Change-Id: Ifcac04763afcaf72a3b14ef5f3a6cb89981b51a1
This commit is contained in:
parent
334929b525
commit
9c8d6dd7de
|
@ -386,26 +386,24 @@ void DeviceHandler::HandleDeviceEvent(const Uevent& uevent) {
|
|||
if (StartsWith(uevent.path, "/devices")) {
|
||||
links = GetBlockDeviceSymlinks(uevent);
|
||||
}
|
||||
} else if (StartsWith(uevent.subsystem, "usb")) {
|
||||
if (uevent.subsystem == "usb") {
|
||||
if (!uevent.device_name.empty()) {
|
||||
devpath = "/dev/" + uevent.device_name;
|
||||
} else {
|
||||
// This imitates the file system that would be created
|
||||
// if we were using devfs instead.
|
||||
// Minors are broken up into groups of 128, starting at "001"
|
||||
int bus_id = uevent.minor / 128 + 1;
|
||||
int device_id = uevent.minor % 128 + 1;
|
||||
devpath = StringPrintf("/dev/bus/usb/%03d/%03d", bus_id, device_id);
|
||||
}
|
||||
} else {
|
||||
// ignore other USB events
|
||||
return;
|
||||
}
|
||||
} else if (const auto subsystem =
|
||||
std::find(subsystems_.cbegin(), subsystems_.cend(), uevent.subsystem);
|
||||
subsystem != subsystems_.cend()) {
|
||||
devpath = subsystem->ParseDevPath(uevent);
|
||||
} else if (uevent.subsystem == "usb") {
|
||||
if (!uevent.device_name.empty()) {
|
||||
devpath = "/dev/" + uevent.device_name;
|
||||
} else {
|
||||
// This imitates the file system that would be created
|
||||
// if we were using devfs instead.
|
||||
// Minors are broken up into groups of 128, starting at "001"
|
||||
int bus_id = uevent.minor / 128 + 1;
|
||||
int device_id = uevent.minor % 128 + 1;
|
||||
devpath = StringPrintf("/dev/bus/usb/%03d/%03d", bus_id, device_id);
|
||||
}
|
||||
} else if (StartsWith(uevent.subsystem, "usb")) {
|
||||
// ignore other USB events
|
||||
return;
|
||||
} else {
|
||||
devpath = "/dev/" + Basename(uevent.path);
|
||||
}
|
||||
|
|
|
@ -72,6 +72,7 @@ class Subsystem {
|
|||
friend class SubsystemParser;
|
||||
|
||||
Subsystem() {}
|
||||
Subsystem(std::string name) : name_(std::move(name)) {}
|
||||
|
||||
// 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
|
||||
|
|
|
@ -82,7 +82,7 @@ Result<Success> SubsystemParser::ParseSection(std::vector<std::string>&& args,
|
|||
return Error() << "ignoring duplicate subsystem entry";
|
||||
}
|
||||
|
||||
subsystem_.name_ = args[1];
|
||||
subsystem_ = Subsystem(std::move(args[1]));
|
||||
|
||||
return Success();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue