Merge "init: support matching sysfs class paths in ueventd.rc"
am: faa14b94d5
* commit 'faa14b94d5a6d0c3d429516bf226b9836f65da91':
init: support matching sysfs class paths in ueventd.rc
Change-Id: Icb642a52ec834d450b2f7357b63370021986a06e
This commit is contained in:
commit
0da9f42f2c
1 changed files with 23 additions and 14 deletions
|
@ -43,6 +43,7 @@
|
|||
#include <sys/wait.h>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/stringprintf.h>
|
||||
#include <cutils/list.h>
|
||||
#include <cutils/uevent.h>
|
||||
|
||||
|
@ -146,22 +147,30 @@ static bool perm_path_matches(const char *path, struct perms_ *dp)
|
|||
return false;
|
||||
}
|
||||
|
||||
void fixup_sys_perms(const char *upath)
|
||||
{
|
||||
struct listnode *node;
|
||||
static bool match_subsystem(perms_* dp, const char* pattern,
|
||||
const char* path, const char* subsystem) {
|
||||
if (!pattern || !subsystem || strstr(dp->name, subsystem) == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* upaths omit the "/sys" that paths in this list
|
||||
* contain, so we prepend it...
|
||||
*/
|
||||
std::string path = SYSFS_PREFIX;
|
||||
path += upath;
|
||||
std::string subsys_path = android::base::StringPrintf(pattern, subsystem, basename(path));
|
||||
return perm_path_matches(subsys_path.c_str(), dp);
|
||||
}
|
||||
|
||||
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) {
|
||||
perms_ *dp;
|
||||
|
||||
dp = &(node_to_item(node, struct perm_node, plist))->dp;
|
||||
if (!perm_path_matches(path.c_str(), dp)) {
|
||||
continue;
|
||||
perms_* dp = &(node_to_item(node, perm_node, plist))->dp;
|
||||
if (match_subsystem(dp, SYSFS_PREFIX "/class/%s/%s", path.c_str(), subsystem)) {
|
||||
; // matched
|
||||
} else if (match_subsystem(dp, SYSFS_PREFIX "/bus/%s/devices/%s", path.c_str(), subsystem)) {
|
||||
; // matched
|
||||
} else if (!perm_path_matches(path.c_str(), dp)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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)) {
|
||||
handle_block_device_event(uevent);
|
||||
|
|
Loading…
Reference in a new issue