match KEY="A|B" without temporary string copy

This commit is contained in:
Kay Sievers 2008-10-25 03:00:03 +02:00
parent b62557daff
commit 91a75e4ad4
2 changed files with 43 additions and 13 deletions

View file

@ -1448,6 +1448,31 @@ EOF
KERNEL=="dontknow*|*nothing", NAME="nomatch"
KERNEL=="ttyACM*", NAME="before"
KERNEL=="dontknow*|ttyACM*|nothing*", NAME="right"
EOF
},
{
desc => "test multi matches 3",
subsys => "tty",
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
exp_name => "right",
rules => <<EOF
KERNEL=="dontknow|nothing", NAME="nomatch"
KERNEL=="dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong1"
KERNEL=="X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong2"
KERNEL=="dontknow|ttyACM0|nothing", NAME="right"
EOF
},
{
desc => "test multi matches 4",
subsys => "tty",
devpath => "/devices/pci0000:00/0000:00:1d.7/usb5/5-2/5-2:1.0/tty/ttyACM0",
exp_name => "right",
rules => <<EOF
KERNEL=="dontknow|nothing", NAME="nomatch"
KERNEL=="dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong1"
KERNEL=="X|attyACM0|dontknow|ttyACM0a|nothing|attyACM0", NAME="wrong2"
KERNEL=="all|dontknow|ttyACM0", NAME="right"
KERNEL=="ttyACM0a|nothing", NAME="wrong3"
EOF
},
{

View file

@ -1726,21 +1726,26 @@ static int match_key(struct udev_rules *rules, struct token *token, const char *
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;
}