X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_rules.c;h=03b3f2a1165de1910354677eb9522047b7f49bf6;hb=b879c303a787e9430a5234aff3c1185ff9a4b019;hp=5b1e6889ece2cdf53525c1d603f75789f88d5aa9;hpb=7ba2d2e6ae70964b68056283fcea209cb4b617ec;p=elogind.git diff --git a/udev_rules.c b/udev_rules.c index 5b1e6889e..03b3f2a11 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -2,17 +2,17 @@ * udev_rules.c * * Copyright (C) 2003 Greg Kroah-Hartman - * Copyright (C) 2003-2005 Kay Sievers + * Copyright (C) 2003-2006 Kay Sievers * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation version 2 of the License. - * + * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. - * + * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. @@ -401,7 +401,6 @@ void udev_rules_apply_format(struct udevice *udev, char *string, size_t maxsize) SUBST_PARENT, SUBST_TEMP_NODE, SUBST_ROOT, - SUBST_MODALIAS, SUBST_ENV, }; static const struct subst_map { @@ -421,7 +420,6 @@ void udev_rules_apply_format(struct udevice *udev, char *string, size_t maxsize) { .name = "parent", .fmt = 'P', .type = SUBST_PARENT }, { .name = "tempnode", .fmt = 'N', .type = SUBST_TEMP_NODE }, { .name = "root", .fmt = 'r', .type = SUBST_ROOT }, - { .name = "modalias", .fmt = 'A', .type = SUBST_MODALIAS }, { .name = "env", .fmt = 'E', .type = SUBST_ENV }, { NULL, '\0', 0 } }; @@ -451,8 +449,7 @@ void udev_rules_apply_format(struct udevice *udev, char *string, size_t maxsize) goto found; } } - } - else if (head[0] == '%') { + } else if (head[0] == '%') { /* substitute format char */ if (head[1] == '\0') break; @@ -619,24 +616,6 @@ found: strlcat(string, udev_root, maxsize); dbg("substitute udev_root '%s'", udev_root); break; - case SUBST_MODALIAS: - { - const char *value; - static int warn = 1; - - if (warn) { - err("$modalias is deprecated, use $env{MODALIAS} or " - "$sysfs{modalias} instead."); - warn = 0; - } - - value = sysfs_attr_get_value(udev->dev->devpath, "modalias"); - if (value != NULL) { - strlcat(string, value, maxsize); - dbg("substitute MODALIAS '%s'", temp2); - } - } - break; case SUBST_ENV: if (attr == NULL) { dbg("missing attribute"); @@ -680,7 +659,8 @@ static int match_key(const char *key_name, struct udev_rule *rule, struct key *k char *key_value; char *pos; - if (key->operation == KEY_OP_UNSET) + if (key->operation != KEY_OP_MATCH && + key->operation != KEY_OP_NOMATCH) return 0; strlcpy(value, rule->buf + key->val_off, sizeof(value)); @@ -726,29 +706,16 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule) if (match_key("DEVPATH", rule, &rule->devpath, udev->dev->devpath)) goto nomatch; - if (rule->modalias.operation != KEY_OP_UNSET) { - const char *value; - static int warn = 1; - - if (warn) { - err("MODALIAS is deprecated, use ENV{MODALIAS} or SYSFS{modalias} instead."); - warn = 0; - } - - value = sysfs_attr_get_value(udev->dev->devpath, "modalias"); - if (value == NULL) { - dbg("MODALIAS value not found"); - goto nomatch; - } - if (match_key("MODALIAS", rule, &rule->modalias, value)) - goto nomatch; - } + /* compare NAME against a previously assigned value */ + if (match_key("NAME", rule, &rule->name, udev->name)) + goto nomatch; for (i = 0; i < rule->env.count; i++) { struct key_pair *pair = &rule->env.keys[i]; /* we only check for matches, assignments will be handled later */ - if (pair->key.operation != KEY_OP_ASSIGN) { + if (pair->key.operation == KEY_OP_MATCH || + pair->key.operation == KEY_OP_NOMATCH) { const char *key_name = key_pair_name(rule, pair); const char *value = getenv(key_name); @@ -775,22 +742,16 @@ static int match_rule(struct udevice *udev, struct udev_rule *rule) udev->dev_parent = udev->dev; while (1) { /* check for matching driver */ - if (rule->driver.operation != KEY_OP_UNSET) { - if (match_key("DRIVER", rule, &rule->driver, udev->dev_parent->driver)) - goto try_parent; - } + if (match_key("DRIVER", rule, &rule->driver, udev->dev_parent->driver)) + goto try_parent; /* check for matching subsystem/bus value */ - if (rule->bus.operation != KEY_OP_UNSET) { - if (match_key("BUS", rule, &rule->bus, udev->dev_parent->subsystem)) - goto try_parent; - } + if (match_key("BUS", rule, &rule->bus, udev->dev_parent->subsystem)) + goto try_parent; /* check for matching bus id (device name) */ - if (rule->id.operation != KEY_OP_UNSET) { - if (match_key("ID", rule, &rule->id, udev->dev_parent->kernel_name)) - goto try_parent; - } + if (match_key("ID", rule, &rule->id, udev->dev_parent->kernel_name)) + goto try_parent; /* check for matching sysfs pairs */ if (rule->sysfs.count) { @@ -934,7 +895,10 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev) if (rule == NULL) break; - if (name_set && rule->name.operation != KEY_OP_UNSET) { + if (name_set && + (rule->name.operation == KEY_OP_ASSIGN || + rule->name.operation == KEY_OP_ASSIGN_FINAL || + rule->name.operation == KEY_OP_ADD)) { dbg("node name already set, rule ignored"); continue; } @@ -1020,7 +984,9 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev) } /* set name, later rules with name set will be ignored */ - if (rule->name.operation != KEY_OP_UNSET) { + if (rule->name.operation == KEY_OP_ASSIGN || + rule->name.operation == KEY_OP_ASSIGN_FINAL || + rule->name.operation == KEY_OP_ADD) { int count; name_set = 1;