+/* mapped compiled rules stored on disk */
+static struct udev_rule *rules_array = NULL;
+static size_t rules_array_current;
+static size_t rules_array_size = 0;
+
+static size_t rules_count = 0;
+
+int udev_rules_iter_init(void)
+{
+ rules_list_current = rules_list.next;
+ rules_array_current = 0;
+
+ return 0;
+}
+
+struct udev_rule *udev_rules_iter_next(void)
+{
+ static struct udev_rule *rule;
+
+ if (rules_array) {
+ if (rules_array_current >= rules_count)
+ return NULL;
+ rule = &rules_array[rules_array_current];
+ rules_array_current++;
+ } else {
+ dbg("head=%p current=%p next=%p", &rules_list, rules_list_current, rules_list_current->next);
+ if (rules_list_current == &rules_list)
+ return NULL;
+ rule = list_entry(rules_list_current, struct udev_rule, node);
+ rules_list_current = rules_list_current->next;
+ }
+ return rule;
+}
+
+static int add_rule_to_list(struct udev_rule *rule)