chiark / gitweb /
vol_id: make the --offset= argument optional
[elogind.git] / udev / udev_rules_parse.c
index 3ada8b1c7d14c5bbc19d71857609ed1668e1771f..705b3feb04ac436b57b9525feebedbec52a7bf7f 100644 (file)
@@ -17,6 +17,8 @@
  *
  */
 
+#include "config.h"
+
 #include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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);
                }
        }