chiark / gitweb /
allow rules to have labels and skip to next label
[elogind.git] / udev_rules_parse.c
index 7c3c2e7fc252698aed9bb4be6c3d0c551a588b14..0259268c8faa36b0ce8e7327c844798d4d7c12e0 100644 (file)
@@ -52,8 +52,10 @@ struct udev_rule *udev_rules_iter_next(struct udev_rules *rules)
                return NULL;
 
        dbg("current=%zi", rules->current);
                return NULL;
 
        dbg("current=%zi", rules->current);
-       if (rules->current >= rules->bufsize)
+       if (rules->current >= rules->bufsize) {
+               dbg("no more rules");
                return NULL;
                return NULL;
+       }
 
        /* get next rule */
        rule = (struct udev_rule *) (rules->buf + rules->current);
 
        /* get next rule */
        rule = (struct udev_rule *) (rules->buf + rules->current);
@@ -62,6 +64,28 @@ struct udev_rule *udev_rules_iter_next(struct udev_rules *rules)
        return rule;
 }
 
        return rule;
 }
 
+struct udev_rule *udev_rules_iter_label(struct udev_rules *rules, const char *label)
+{
+       static struct udev_rule *rule;
+
+next:
+       dbg("current=%zi", rules->current);
+       if (rules->current >= rules->bufsize) {
+               dbg("no more rules");
+               return NULL;
+       }
+       rule = (struct udev_rule *) (rules->buf + rules->current);
+
+       if (strcmp(&rule->buf[rule->label.val_off], label) != 0) {
+               dbg("moving forward, looking for label '%s'", label);
+               rules->current += sizeof(struct udev_rule) + rule->bufsize;
+               goto next;
+       }
+
+       dbg("found label '%s'", label);
+       return rule;
+}
+
 static int get_key(char **line, char **key, enum key_operation *operation, char **value)
 {
        char *linepos;
 static int get_key(char **line, char **key, enum key_operation *operation, char **value)
 {
        char *linepos;
@@ -237,6 +261,18 @@ static int add_to_rules(struct udev_rules *rules, char *line)
                if (retval)
                        break;
 
                if (retval)
                        break;
 
+               if (strcasecmp(key, "LABEL") == 0) {
+                       add_rule_key(rule, &rule->label, operation, value);
+                       valid = 1;
+                       continue;
+               }
+
+               if (strcasecmp(key, "GOTO") == 0) {
+                       add_rule_key(rule, &rule->goto_label, operation, value);
+                       valid = 1;
+                       continue;
+               }
+
                if (strcasecmp(key, "KERNEL") == 0) {
                        add_rule_key(rule, &rule->kernel_name, operation, value);
                        valid = 1;
                if (strcasecmp(key, "KERNEL") == 0) {
                        add_rule_key(rule, &rule->kernel_name, operation, value);
                        valid = 1;
@@ -475,6 +511,7 @@ static int add_to_rules(struct udev_rules *rules, char *line)
                err("realloc failed");
                goto exit;
        }
                err("realloc failed");
                goto exit;
        }
+       dbg("adding rule to offset %zi", rules->bufsize);
        memcpy(rules->buf + rules->bufsize, rule, rule_size);
        rules->bufsize += rule_size;
 exit:
        memcpy(rules->buf + rules->bufsize, rule, rule_size);
        rules->bufsize += rule_size;
 exit: