- /* check for matching result of external program */
- if (rule->result_operation != KEY_OP_UNSET) {
- dbg("check for " KEY_RESULT " rule->result='%s', udev->program_result='%s'",
- rule->result, udev->program_result);
- if (strcmp_pattern(rule->result, udev->program_result) != 0) {
- dbg(KEY_RESULT " is not matching");
- if (rule->result_operation != KEY_OP_NOMATCH)
- goto exit;
- } else {
- dbg(KEY_RESULT " matches");
- if (rule->result_operation == KEY_OP_NOMATCH)
- goto exit;
+ /* if we have ATTR assignments, write value to sysfs file */
+ for (i = 0; i < rule->attr.count; i++) {
+ struct key_pair *pair = &rule->attr.keys[i];
+
+ if (pair->key.operation == KEY_OP_ASSIGN) {
+ const char *key_name = key_pair_name(rule, pair);
+ char devpath[PATH_SIZE];
+ char *attrib;
+ char attr[PATH_SIZE] = "";
+ char value[NAME_SIZE];
+ FILE *f;
+
+ 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);
+ f = fopen(attr, "w");
+ if (f != NULL) {
+ if (!udev->test_run)
+ if (fprintf(f, "%s", value) <= 0)
+ err("error writing ATTR{%s}: %s", attr, strerror(errno));
+ fclose(f);
+ } else
+ err("error opening ATTR{%s} for writing: %s", attr, strerror(errno));