X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev_rules.c;h=cb74da56e37ae0da284a5f67b1692ce5965b11b0;hb=2e23125e112c0a56e1ccee193c2cfe0e26af1bad;hp=598c1ba7393a9d62828404abf88647dee4e8433e;hpb=4ad47b2de6534dce23fd3182ec1e7472e299b05f;p=elogind.git diff --git a/udev_rules.c b/udev_rules.c index 598c1ba73..cb74da56e 100644 --- a/udev_rules.c +++ b/udev_rules.c @@ -837,7 +837,8 @@ try_parent: strlcpy(program, key_val(rule, &rule->program), sizeof(program)); udev_rules_apply_format(udev, program, sizeof(program)); - if (run_program(program, udev->dev->subsystem, result, sizeof(result), NULL, (udev_log_priority >= LOG_INFO)) != 0) { + if (run_program(program, udev->dev->subsystem, result, sizeof(result), + NULL, (udev_log_priority >= LOG_INFO)) != 0) { dbg("PROGRAM is false"); udev->program_result[0] = '\0'; if (rule->program.operation != KEY_OP_NOMATCH) @@ -847,9 +848,12 @@ try_parent: dbg("PROGRAM matches"); remove_trailing_chars(result, '\n'); - count = replace_chars(result, ALLOWED_CHARS_INPUT); - if (count) - info("%i character(s) replaced" , count); + if (rule->string_escape == ESCAPE_UNSET || + rule->string_escape == ESCAPE_REPLACE) { + count = replace_chars(result, ALLOWED_CHARS_INPUT); + if (count > 0) + info("%i character(s) replaced" , count); + } dbg("result is '%s'", result); strlcpy(udev->program_result, result, sizeof(udev->program_result)); dbg("PROGRAM returned successful"); @@ -923,14 +927,28 @@ try_parent: if (pair->key.operation == KEY_OP_ASSIGN) { const char *key_name = key_pair_name(rule, pair); - char attr[PATH_SIZE]; + char devpath[PATH_SIZE]; + char *attrib; + char attr[PATH_SIZE] = ""; char value[NAME_SIZE]; FILE *f; - strlcpy(attr, sysfs_path, sizeof(attr)); - strlcat(attr, udev->dev->devpath, sizeof(attr)); - strlcat(attr, "/", sizeof(attr)); - strlcat(attr, key_name, sizeof(attr)); + if (attr_get_by_subsys_id(key_name, devpath, sizeof(devpath), &attrib)) { + if (attrib != NULL) { + strlcpy(attr, sysfs_path, sizeof(attr)); + strlcat(attr, devpath, sizeof(attr)); + strlcat(attr, "/", sizeof(attr)); + strlcat(attr, attrib, sizeof(attr)); + } + } + + if (attr[0] == '\0') { + strlcpy(attr, sysfs_path, sizeof(attr)); + strlcat(attr, udev->dev->devpath, sizeof(attr)); + strlcat(attr, "/", sizeof(attr)); + strlcat(attr, key_name, sizeof(attr)); + } + strlcpy(value, key_val(rule, &pair->key), sizeof(value)); udev_rules_apply_format(udev, value, sizeof(value)); info("writing '%s' to sysfs file '%s'", value, attr); @@ -1033,9 +1051,12 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev) /* allow multiple symlinks separated by spaces */ strlcpy(temp, key_val(rule, &rule->symlink), sizeof(temp)); udev_rules_apply_format(udev, temp, sizeof(temp)); - count = replace_chars(temp, ALLOWED_CHARS_FILE " "); - if (count) - info("%i character(s) replaced" , count); + if (rule->string_escape == ESCAPE_UNSET || + rule->string_escape == ESCAPE_REPLACE) { + count = replace_chars(temp, ALLOWED_CHARS_FILE " "); + if (count > 0) + info("%i character(s) replaced" , count); + } dbg("rule applied, added symlink(s) '%s'", temp); pos = temp; while (isspace(pos[0])) @@ -1065,9 +1086,12 @@ int udev_rules_get_name(struct udev_rules *rules, struct udevice *udev) name_set = 1; strlcpy(udev->name, key_val(rule, &rule->name), sizeof(udev->name)); udev_rules_apply_format(udev, udev->name, sizeof(udev->name)); - count = replace_chars(udev->name, ALLOWED_CHARS_FILE); - if (count) - info("%i character(s) replaced", count); + if (rule->string_escape == ESCAPE_UNSET || + rule->string_escape == ESCAPE_REPLACE) { + count = replace_chars(udev->name, ALLOWED_CHARS_FILE); + if (count > 0) + info("%i character(s) replaced", count); + } info("rule applied, '%s' becomes '%s'", udev->dev->kernel, udev->name); if (strcmp(udev->dev->subsystem, "net") != 0)