am 72d9c0b1: am 56b1d74e: Merge "init/ueventd: adds wildcard matching for ueventd rules"

* commit '72d9c0b18ed6162b769ee07a7cd61b01cb3a2e74':
  init/ueventd: adds wildcard matching for ueventd rules
This commit is contained in:
Colin Cross 2014-06-20 22:40:37 +00:00 committed by Android Git Automerger
commit 105ecf71c2
3 changed files with 20 additions and 4 deletions

View file

@ -15,6 +15,7 @@
*/ */
#include <errno.h> #include <errno.h>
#include <fnmatch.h>
#include <stddef.h> #include <stddef.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@ -77,6 +78,7 @@ struct perms_ {
unsigned int uid; unsigned int uid;
unsigned int gid; unsigned int gid;
unsigned short prefix; unsigned short prefix;
unsigned short wildcard;
}; };
struct perm_node { struct perm_node {
@ -97,7 +99,8 @@ static list_declare(platform_names);
int add_dev_perms(const char *name, const char *attr, int add_dev_perms(const char *name, const char *attr,
mode_t perm, unsigned int uid, unsigned int gid, mode_t perm, unsigned int uid, unsigned int gid,
unsigned short prefix) { unsigned short prefix,
unsigned short wildcard) {
struct perm_node *node = calloc(1, sizeof(*node)); struct perm_node *node = calloc(1, sizeof(*node));
if (!node) if (!node)
return -ENOMEM; return -ENOMEM;
@ -116,6 +119,7 @@ int add_dev_perms(const char *name, const char *attr,
node->dp.uid = uid; node->dp.uid = uid;
node->dp.gid = gid; node->dp.gid = gid;
node->dp.prefix = prefix; node->dp.prefix = prefix;
node->dp.wildcard = wildcard;
if (attr) if (attr)
list_add_tail(&sys_perms, &node->plist); list_add_tail(&sys_perms, &node->plist);
@ -140,6 +144,9 @@ void fixup_sys_perms(const char *upath)
if (dp->prefix) { if (dp->prefix) {
if (strncmp(upath, dp->name + 4, strlen(dp->name + 4))) if (strncmp(upath, dp->name + 4, strlen(dp->name + 4)))
continue; continue;
} else if (dp->wildcard) {
if (fnmatch(dp->name + 4, upath, FNM_PATHNAME) != 0)
continue;
} else { } else {
if (strcmp(upath, dp->name + 4)) if (strcmp(upath, dp->name + 4))
continue; continue;
@ -180,6 +187,9 @@ static mode_t get_device_perm(const char *path, unsigned *uid, unsigned *gid)
if (dp->prefix) { if (dp->prefix) {
if (strncmp(path, dp->name, strlen(dp->name))) if (strncmp(path, dp->name, strlen(dp->name)))
continue; continue;
} else if (dp->wildcard) {
if (fnmatch(dp->name, path, FNM_PATHNAME) != 0)
continue;
} else { } else {
if (strcmp(path, dp->name)) if (strcmp(path, dp->name))
continue; continue;

View file

@ -23,6 +23,7 @@ extern void handle_device_fd();
extern void device_init(void); extern void device_init(void);
extern int add_dev_perms(const char *name, const char *attr, extern int add_dev_perms(const char *name, const char *attr,
mode_t perm, unsigned int uid, mode_t perm, unsigned int uid,
unsigned int gid, unsigned short prefix); unsigned int gid, unsigned short prefix,
unsigned short wildcard);
int get_device_fd(); int get_device_fd();
#endif /* _INIT_DEVICES_H */ #endif /* _INIT_DEVICES_H */

View file

@ -122,6 +122,7 @@ void set_device_permission(int nargs, char **args)
uid_t uid; uid_t uid;
gid_t gid; gid_t gid;
int prefix = 0; int prefix = 0;
int wildcard = 0;
char *endptr; char *endptr;
int ret; int ret;
char *tmp = 0; char *tmp = 0;
@ -154,9 +155,13 @@ void set_device_permission(int nargs, char **args)
name = tmp; name = tmp;
} else { } else {
int len = strlen(name); int len = strlen(name);
if (name[len - 1] == '*') { char *wildcard_chr = strchr(name, '*');
if ((name[len - 1] == '*') &&
(wildcard_chr == (name + len - 1))) {
prefix = 1; prefix = 1;
name[len - 1] = '\0'; name[len - 1] = '\0';
} else if (wildcard_chr) {
wildcard = 1;
} }
} }
@ -183,6 +188,6 @@ void set_device_permission(int nargs, char **args)
} }
gid = ret; gid = ret;
add_dev_perms(name, attr, perm, uid, gid, prefix); add_dev_perms(name, attr, perm, uid, gid, prefix, wildcard);
free(tmp); free(tmp);
} }