- if (strncmp(attr, "device/", 7) == 0)
- err(rules->udev, "the 'device' link may not be available in a future kernel, "
- "please fix it in %s:%u", filename, lineno);
- else if (strstr(attr, "../") != NULL)
- err(rules->udev, "do not reference parent sysfs directories directly, "
- "it may break with a future kernel, please fix it in %s:%u", filename, lineno);
- if (add_rule_key_pair(rules, rule, &rule->attrs, operation, attr, value) != 0)
- goto invalid;
- valid = 1;
- continue;
- }
-
- if (strncasecmp(key, "ENV{", sizeof("ENV{")-1) == 0) {
- attr = get_key_attribute(rules, key + sizeof("ENV")-1);
- if (attr == NULL) {
- err(rules->udev, "error parsing ENV attribute\n");
- goto invalid;
- }
- if (strncmp(attr, "PHYSDEV", 7) == 0)
- physdev = 1;
- if (add_rule_key_pair(rules, rule, &rule->env, operation, attr, value) != 0)
- goto invalid;
- valid = 1;
- continue;
- }
-
- if (strcasecmp(key, "PROGRAM") == 0) {
- add_rule_key(rule, &rule->program, operation, value);
- valid = 1;
- continue;
- }
-
- if (strcasecmp(key, "RESULT") == 0) {
- if (operation != KEY_OP_MATCH &&
- operation != KEY_OP_NOMATCH) {
- err(rules->udev, "invalid RESULT operation\n");
- goto invalid;
- }
- add_rule_key(rule, &rule->result, operation, value);
- valid = 1;
- continue;
- }
-
- if (strncasecmp(key, "IMPORT", sizeof("IMPORT")-1) == 0) {
- attr = get_key_attribute(rules, key + sizeof("IMPORT")-1);
- if (attr != NULL && strstr(attr, "program")) {
- dbg(rules->udev, "IMPORT will be executed\n");
- rule->import_type = IMPORT_PROGRAM;
- } else if (attr != NULL && strstr(attr, "file")) {
- dbg(rules->udev, "IMPORT will be included as file\n");
- rule->import_type = IMPORT_FILE;
- } else if (attr != NULL && strstr(attr, "parent")) {
- dbg(rules->udev, "IMPORT will include the parent values\n");
- rule->import_type = IMPORT_PARENT;
- } else {
- /* figure it out if it is executable */
- char file[UTIL_PATH_SIZE];
- char *pos;
- struct stat statbuf;
-
- util_strlcpy(file, value, sizeof(file));
- pos = strchr(file, ' ');
- if (pos)
- pos[0] = '\0';
-
- /* allow programs in /lib/udev called without the path */
- if (strchr(file, '/') == NULL) {
- util_strlcpy(file, UDEV_PREFIX "/lib/udev/", sizeof(file));
- util_strlcat(file, value, sizeof(file));
- pos = strchr(file, ' ');
- if (pos)
- pos[0] = '\0';
- }
-
- dbg(rules->udev, "IMPORT auto mode for '%s'\n", file);
- if (!lstat(file, &statbuf) && (statbuf.st_mode & S_IXUSR)) {
- dbg(rules->udev, "IMPORT is executable, will be executed (autotype)\n");
- rule->import_type = IMPORT_PROGRAM;
+ case TK_A_OWNER_ID:
+ if (event->owner_final)
+ break;
+ if (cur->key.op == OP_ASSIGN_FINAL)
+ event->owner_final = 1;
+ event->uid = cur->key.uid;
+ info(event->udev, "OWNER %u %s:%u\n",
+ event->uid,
+ &rules->buf[rule->rule.filename_off],
+ rule->rule.filename_line);
+ break;
+ case TK_A_GROUP_ID:
+ if (event->group_final)
+ break;
+ if (cur->key.op == OP_ASSIGN_FINAL)
+ event->group_final = 1;
+ event->gid = cur->key.gid;
+ info(event->udev, "GROUP %u %s:%u\n",
+ event->gid,
+ &rules->buf[rule->rule.filename_off],
+ rule->rule.filename_line);
+ break;
+ case TK_A_MODE_ID:
+ if (event->mode_final)
+ break;
+ if (cur->key.op == OP_ASSIGN_FINAL)
+ event->mode_final = 1;
+ event->mode = cur->key.mode;
+ info(event->udev, "MODE %#o %s:%u\n",
+ event->mode,
+ &rules->buf[rule->rule.filename_off],
+ rule->rule.filename_line);
+ break;
+ case TK_A_ENV:
+ {
+ const char *name = &rules->buf[cur->key.attr_off];
+ char *value = &rules->buf[cur->key.value_off];
+
+ if (value[0] != '\0') {
+ char temp_value[UTIL_NAME_SIZE];
+ struct udev_list_entry *entry;
+
+ udev_event_apply_format(event, value, temp_value, sizeof(temp_value));
+ entry = udev_device_add_property(event->dev, name, temp_value);
+ /* store in db, skip private keys */
+ if (name[0] != '.')
+ udev_list_entry_set_flag(entry, 1);