Merge "init: support matching sysfs class paths in ueventd.rc" am: faa14b94d5

am: 0da9f42f2c

* commit '0da9f42f2c2ec6985018ad45603b32532d096a60':
  init: support matching sysfs class paths in ueventd.rc

Change-Id: Ifc85ba3205a5207a4285da94b483164490dbde4d
This commit is contained in:
Rob Herring 2016-05-13 21:54:48 +00:00 committed by android-build-merger
commit a0c90085ec

View file

@ -43,6 +43,7 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <android-base/file.h> #include <android-base/file.h>
#include <android-base/stringprintf.h>
#include <cutils/list.h> #include <cutils/list.h>
#include <cutils/uevent.h> #include <cutils/uevent.h>
@ -146,22 +147,30 @@ static bool perm_path_matches(const char *path, struct perms_ *dp)
return false; return false;
} }
void fixup_sys_perms(const char *upath) static bool match_subsystem(perms_* dp, const char* pattern,
{ const char* path, const char* subsystem) {
struct listnode *node; if (!pattern || !subsystem || strstr(dp->name, subsystem) == NULL) {
return false;
}
/* upaths omit the "/sys" that paths in this list std::string subsys_path = android::base::StringPrintf(pattern, subsystem, basename(path));
* contain, so we prepend it... return perm_path_matches(subsys_path.c_str(), dp);
*/ }
std::string path = SYSFS_PREFIX;
path += upath;
static void fixup_sys_perms(const char* upath, const char* subsystem) {
// upaths omit the "/sys" that paths in this list
// contain, so we prepend it...
std::string path = std::string(SYSFS_PREFIX) + upath;
listnode* node;
list_for_each(node, &sys_perms) { list_for_each(node, &sys_perms) {
perms_ *dp; perms_* dp = &(node_to_item(node, perm_node, plist))->dp;
if (match_subsystem(dp, SYSFS_PREFIX "/class/%s/%s", path.c_str(), subsystem)) {
dp = &(node_to_item(node, struct perm_node, plist))->dp; ; // matched
if (!perm_path_matches(path.c_str(), dp)) { } else if (match_subsystem(dp, SYSFS_PREFIX "/bus/%s/devices/%s", path.c_str(), subsystem)) {
continue; ; // matched
} else if (!perm_path_matches(path.c_str(), dp)) {
continue;
} }
std::string attr_file = path + "/" + dp->attr; std::string attr_file = path + "/" + dp->attr;
@ -734,7 +743,7 @@ static void handle_generic_device_event(struct uevent *uevent)
static void handle_device_event(struct uevent *uevent) static void handle_device_event(struct uevent *uevent)
{ {
if (!strcmp(uevent->action,"add") || !strcmp(uevent->action, "change") || !strcmp(uevent->action, "online")) if (!strcmp(uevent->action,"add") || !strcmp(uevent->action, "change") || !strcmp(uevent->action, "online"))
fixup_sys_perms(uevent->path); fixup_sys_perms(uevent->path, uevent->subsystem);
if (!strncmp(uevent->subsystem, "block", 5)) { if (!strncmp(uevent->subsystem, "block", 5)) {
handle_block_device_event(uevent); handle_block_device_event(uevent);