mirror of
https://github.com/AuxXxilium/eudev.git
synced 2024-12-03 21:27:00 +07:00
match KEY="A|B" without temporary string copy
This commit is contained in:
parent
b62557daff
commit
91a75e4ad4
@ -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
|
||||
},
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user