diff options
author | Kay Sievers <kay.sievers@suse.de> | 2005-07-12 12:52:56 +0200 |
---|---|---|
committer | Kay Sievers <kay.sievers@suse.de> | 2005-07-12 12:52:56 +0200 |
commit | 0cd4ac473a51577e33e700beccb3479e5565d661 (patch) | |
tree | de636b6ac44f4f5a67156e3f8c80bb7d666565e7 | |
parent | cbbde2ba6c19d6515f09a2ed0955eb2808c91198 (diff) |
allow multiple values to be matched with KEY=="value1|value2"
Signed-off-by: Kay Sievers <kay.sievers@suse.de>
-rwxr-xr-x | test/udev-test.pl | 21 | ||||
-rw-r--r-- | udev_rules.c | 43 |
2 files changed, 48 insertions, 16 deletions
diff --git a/test/udev-test.pl b/test/udev-test.pl index 873780d70a..e8cb7c48a9 100755 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -1452,6 +1452,27 @@ KERNEL=="ttyUSB[0-9]*", NAME="" KERNEL=="ttyUSB[0-9]*", NAME="wrong" EOF }, + { + desc => "test multi matches", + subsys => "tty", + devpath => "/class/tty/ttyUSB0", + exp_name => "right", + rules => <<EOF +KERNEL=="ttyUSB*|nothing", NAME="right" +KERNEL=="ttyUSB*", NAME="wrong" +EOF + }, + { + desc => "test multi matches 2", + subsys => "tty", + devpath => "/class/tty/ttyUSB0", + exp_name => "right", + rules => <<EOF +KERNEL=="dontknow*|*nothing", NAME="nomatch" +KERNEL=="dontknow*|ttyUSB*|nothing*", NAME="right" +KERNEL=="ttyUSB*", NAME="wrong" +EOF + }, ); # set env diff --git a/udev_rules.c b/udev_rules.c index 77b97d7f99..8ec8fc54a4 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -635,25 +635,36 @@ static char *key_pair_name(struct udev_rule *rule, struct key_pair *pair) static int match_key(const char *key_name, struct udev_rule *rule, struct key *key, const char *val) { int match; + char value[PATH_SIZE]; char *key_value; + char *pos; if (key->operation == KEY_OP_UNSET) return 0; - key_value = rule->buf + key->val_off; + strlcpy(value, rule->buf + key->val_off, sizeof(value)); + key_value = value; - dbg("check for %s '%s' <-> '%s'", key_name, key_value, val); - match = (strcmp_pattern(key_value, val) == 0); - if (match && (key->operation != KEY_OP_NOMATCH)) { - dbg("%s is matching (matching value)", key_name); - return 0; - } - if (!match && (key->operation == KEY_OP_NOMATCH)) { - dbg("%s is matching, (non matching value)", key_name); - return 0; + dbg("key %s value='%s'", key_name, key_value); + while (key_value) { + pos = strchr(key_value, '|'); + if (pos) { + pos[0] = '\0'; + pos++; + } + dbg("match %s '%s' <-> '%s'", key_name, key_value, val); + match = (strcmp_pattern(key_value, val) == 0); + if (match && (key->operation != KEY_OP_NOMATCH)) { + dbg("%s is true (matching value)", key_name); + return 0; + } + if (!match && (key->operation == KEY_OP_NOMATCH)) { + dbg("%s is true (non-matching value)", key_name); + return 0; + } + key_value = pos; } - - dbg("%s is not matching", key_name); + dbg("%s is false", key_name); return -1; } @@ -709,14 +720,14 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule, match = (wait_for_sysfs(udev, key_val(rule, &rule->wait_for_sysfs), 3) == 0); if (match && (rule->wait_for_sysfs.operation != KEY_OP_NOMATCH)) { - dbg("WAIT_FOR_SYSFS is matching (matching value)"); + dbg("WAIT_FOR_SYSFS is true (matching value)"); return 0; } if (!match && (rule->wait_for_sysfs.operation == KEY_OP_NOMATCH)) { - dbg("WAIT_FOR_SYSFS is matching, (non matching value)"); + dbg("WAIT_FOR_SYSFS is true, (non matching value)"); return 0; } - dbg("WAIT_FOR_SYSFS is not matching"); + dbg("WAIT_FOR_SYSFS is false"); return -1; } @@ -826,7 +837,7 @@ try_parent: apply_format(udev, program, sizeof(program), class_dev, sysfs_device); dbg("check for PROGRAM program='%s", program); if (execute_program(program, udev->subsystem, result, sizeof(result), NULL) != 0) { - dbg("PROGRAM is not matching"); + dbg("PROGRAM is false"); if (rule->program.operation != KEY_OP_NOMATCH) goto exit; } else { |