+ add_matching_files(&sort_list, filename, RULESFILE_SUFFIX);
+
+ /* sort all rules files by basename into list of files */
+ list_for_each_entry_safe(sort_loop, sort_tmp, &sort_list, node) {
+ const char *sort_base = strrchr(sort_loop->name, '/');
+
+ if (sort_base == NULL)
+ continue;
+
+ list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) {
+ const char *name_base = strrchr(name_loop->name, '/');
+
+ if (name_base == NULL)
+ continue;
+
+ if (strcmp(name_base, sort_base) > 0)
+ break;
+ }
+ list_move_tail(&sort_loop->node, &name_loop->node);
+ }
+ }
+
+ /* parse list of files */
+ list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) {
+ if (stat(name_loop->name, &statbuf) == 0) {
+ if (statbuf.st_size)
+ parse_file(rules, name_loop->name);
+ else
+ dbg("empty rules file '%s'\n", name_loop->name);
+ } else
+ err("could not read '%s': %s\n", name_loop->name, strerror(errno));
+ list_del(&name_loop->node);
+ free(name_loop);