X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudev_rules_parse.c;h=90b139be4ba0e8206f3e0c6cd7b35fef1ff2fe3a;hb=0d1c29c3d143232dfedf0881524bb2ef803c3067;hp=3ada8b1c7d14c5bbc19d71857609ed1668e1771f;hpb=726687ad48bdececed1e7e44387c50e009e28208;p=elogind.git diff --git a/udev/udev_rules_parse.c b/udev/udev_rules_parse.c index 3ada8b1c7..90b139be4 100644 --- a/udev/udev_rules_parse.c +++ b/udev/udev_rules_parse.c @@ -17,6 +17,8 @@ * */ +#include "config.h" + #include #include #include @@ -39,7 +41,7 @@ void udev_rules_iter_init(struct udev_rules *rules) struct udev_rule *udev_rules_iter_next(struct udev_rules *rules) { - static struct udev_rule *rule; + struct udev_rule *rule; if (!rules) return NULL; @@ -59,7 +61,7 @@ struct udev_rule *udev_rules_iter_next(struct udev_rules *rules) struct udev_rule *udev_rules_iter_label(struct udev_rules *rules, const char *label) { - static struct udev_rule *rule; + struct udev_rule *rule; size_t start = rules->current; next: @@ -451,7 +453,7 @@ static int add_to_rules(struct udev_rules *rules, char *line, const char *filena /* allow programs in /lib/udev called without the path */ if (strchr(file, '/') == NULL) { - strlcpy(file, "/lib/udev/", sizeof(file)); + strlcpy(file, UDEV_PREFIX "/lib/udev/", sizeof(file)); strlcat(file, value, sizeof(file)); pos = strchr(file, ' '); if (pos) @@ -739,24 +741,24 @@ int udev_rules_init(struct udev_rules *rules, int resolve_names) if (udev_rules_dir[0] != '\0') { /* custom rules location for testing */ - add_matching_files(&name_list, udev_rules_dir, RULESFILE_SUFFIX); + add_matching_files(&name_list, udev_rules_dir, ".rules"); } else { - /* read default rules */ - add_matching_files(&name_list, RULES_LIB_DIR, RULESFILE_SUFFIX); - /* read user/custom rules */ - add_matching_files(&sort_list, RULES_ETC_DIR, RULESFILE_SUFFIX); + add_matching_files(&name_list, SYSCONFDIR "/udev/rules.d", ".rules"); /* read dynamic/temporary rules */ strlcpy(filename, udev_root, sizeof(filename)); - strlcat(filename, "/"RULES_DYN_DIR, sizeof(filename)); + strlcat(filename, "/.udev/rules.d", sizeof(filename)); if (stat(filename, &statbuf) != 0) { create_path(filename); selinux_setfscreatecon(filename, NULL, S_IFDIR|0755); mkdir(filename, 0755); selinux_resetfscreatecon(); } - add_matching_files(&sort_list, filename, RULESFILE_SUFFIX); + add_matching_files(&sort_list, filename, ".rules"); + + /* read default rules */ + add_matching_files(&sort_list, UDEV_PREFIX "/lib/udev/rules.d", ".rules"); /* sort all rules files by basename into list of files */ list_for_each_entry_safe(sort_loop, sort_tmp, &sort_list, node) { @@ -771,10 +773,20 @@ int udev_rules_init(struct udev_rules *rules, int resolve_names) if (name_base == NULL) continue; + if (strcmp(name_base, sort_base) == 0) { + info("rule file '%s' already added, ignoring '%s'\n", + name_loop->name, sort_loop->name); + list_del(&sort_loop->node); + free(sort_loop); + sort_loop = NULL; + continue; + } + if (strcmp(name_base, sort_base) > 0) break; } - list_move_tail(&sort_loop->node, &name_loop->node); + if (sort_loop != NULL) + list_move_tail(&sort_loop->node, &name_loop->node); } }