- add_rule_key(rule, &rule->group, operation, value);
- continue;
- }
-
- if (strcasecmp(key, "MODE") == 0) {
- add_rule_key(rule, &rule->mode, operation, value);
- valid = 1;
- continue;
- }
-
- if (strcasecmp(key, "OPTIONS") == 0) {
- const char *pos;
-
- if (strstr(value, "last_rule") != NULL) {
- dbg(rules->udev, "last rule to be applied\n");
- rule->last_rule = 1;
- }
- if (strstr(value, "ignore_device") != NULL) {
- dbg(rules->udev, "device should be ignored\n");
- rule->ignore_device = 1;
- }
- if (strstr(value, "ignore_remove") != NULL) {
- dbg(rules->udev, "remove event should be ignored\n");
- rule->ignore_remove = 1;
- }
- pos = strstr(value, "link_priority=");
- if (pos != NULL) {
- rule->link_priority = atoi(&pos[strlen("link_priority=")]);
- dbg(rules->udev, "link priority=%i\n", rule->link_priority);
- }
- pos = strstr(value, "event_timeout=");
- if (pos != NULL) {
- rule->event_timeout = atoi(&pos[strlen("event_timeout=")]);
- dbg(rules->udev, "event timout=%i\n", rule->event_timeout);
- }
- pos = strstr(value, "string_escape=");
- if (pos != NULL) {
- pos = &pos[strlen("string_escape=")];
- if (strncmp(pos, "none", strlen("none")) == 0)
- rule->string_escape = ESCAPE_NONE;
- else if (strncmp(pos, "replace", strlen("replace")) == 0)
- rule->string_escape = ESCAPE_REPLACE;
- }
- if (strstr(value, "all_partitions") != NULL) {
- dbg(rules->udev, "creation of partition nodes requested\n");
- rule->partitions = DEFAULT_FAKE_PARTITIONS_COUNT;
- }
- valid = 1;
- continue;
- }
-
- err(rules->udev, "unknown key '%s' in %s:%u\n", key, filename, lineno);
- }
-
- if (physdev && rule->wait_for.operation == KEY_OP_UNSET)
- err(rules->udev, "PHYSDEV* values are deprecated and will be removed from a future kernel, \n"
- "please fix it in %s:%u", filename, lineno);
-
- /* skip line if not any valid key was found */
- if (!valid)
- goto invalid;
-
- /* grow buffer and add rule */
- rule_size = sizeof(struct udev_rule) + rule->bufsize;
- padding = (sizeof(size_t) - rule_size % sizeof(size_t)) % sizeof(size_t);
- dbg(rules->udev, "add %zi padding bytes\n", padding);
- rule_size += padding;
- rule->bufsize += padding;
-
- rules->buf = realloc(rules->buf, rules->bufsize + rule_size);
- if (!rules->buf) {
- err(rules->udev, "realloc failed\n");
- goto exit;
- }
- dbg(rules->udev, "adding rule to offset %zi\n", rules->bufsize);
- memcpy(rules->buf + rules->bufsize, rule, rule_size);
- rules->bufsize += rule_size;
-exit:
- return 0;
-
-invalid:
- err(rules->udev, "invalid rule '%s:%u'\n", filename, lineno);
- return -1;
-}
-
-static int parse_file(struct udev_rules *rules, const char *filename)
-{
- FILE *f;
- char line[UTIL_LINE_SIZE];
- size_t start;
- struct udev_rule *rule;
- struct udev_rules_iter iter;
-
- start = rules->bufsize;
- info(rules->udev, "reading '%s' as rules file\n", filename);
-
- f = fopen(filename, "r");
- if (f == NULL)
- return -1;
-
- while(fgets(line, sizeof(line), f) != NULL) {
- int line_nr = 0;
- char *key;
- size_t len;
-
- /* skip whitespace */
- line_nr++;
- key = line;
- while (isspace(key[0]))
- key++;
-
- /* comment */
- if (key[0] == '#')
- continue;
-
- len = strlen(line);
- if (len < 3)
- continue;
-
- /* continue reading if backslash+newline is found */
- while (line[len-2] == '\\') {
- if (fgets(&line[len-2], (sizeof(line)-len)+2, f) == NULL)
+ if (cur->key.op == OP_ASSIGN || cur->key.op == OP_ASSIGN_FINAL)
+ udev_list_cleanup_entries(event->udev, &event->run_list);
+ info(event->udev, "RUN '%s' %s:%u\n",
+ &rules->buf[cur->key.value_off],
+ &rules->buf[rule->rule.filename_off],
+ rule->rule.filename_line);
+ list_entry = udev_list_entry_add(event->udev, &event->run_list,
+ &rules->buf[cur->key.value_off], NULL, 1, 0);
+ if (cur->key.ignore_error)
+ udev_list_entry_set_flag(list_entry, 1);