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:
commit
a0c90085ec
1 changed files with 23 additions and 14 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue