break;
case GL_SPLIT:
{
- char value[UTIL_PATH_SIZE];
+ const char *split;
+ size_t len;
- util_strlcpy(value, &rules->buf[token->key.value_off], sizeof(value));
- key_value = value;
- while (key_value != NULL) {
- pos = strchr(key_value, '|');
- if (pos != NULL) {
- pos[0] = '\0';
- pos = &pos[1];
- }
- dbg(rules->udev, "match %s '%s' <-> '%s'\n", token_str[token->type], key_value, val);
- match = (strcmp(key_value, val) == 0);
- if (match)
+ split = &rules->buf[token->key.value_off];
+ len = strlen(val);
+ while (1) {
+ const char *next;
+
+ next = strchr(split, '|');
+ if (next != NULL) {
+ size_t matchlen = (size_t)(next - split);
+
+ match = (matchlen == len && strncmp(split, val, matchlen) == 0);
+ if (match)
+ break;
+ } else {
+ match = (strcmp(split, val) == 0);
break;
- key_value = pos;
+ }
+ split = &next[1];
}
break;
}
char attr[UTIL_PATH_SIZE];
const char *key_name = &rules->buf[cur->key.attr_off];
const char *key_value = &rules->buf[cur->key.value_off];
- char value[UTIL_NAME_SIZE] = "";
+ char value[UTIL_NAME_SIZE];
size_t len;
util_strlcpy(attr, key_name, sizeof(attr));
+ util_strlcpy(value, "", sizeof(value));
util_resolve_subsys_kernel(event->udev, attr, value, sizeof(value), 1);
if (value[0] == '\0') {
const char *val;
{
struct token *cur;
struct token *rule;
+ enum escape_type esc = ESCAPE_UNSET;
if (rules->tokens == NULL)
return -1;
cur = &rules->tokens[0];
rule = cur;
while (cur != NULL && cur->type != TK_END) {
- enum escape_type esc = ESCAPE_UNSET;
unsigned int idx;
dump_token(rules, cur);