- /* look for file matching with specified suffix */
- if (suffix != NULL) {
- const char *ext;
-
- ext = strrchr(ent->d_name, '.');
- if (ext == NULL)
- continue;
- if (strcmp(ext, suffix) != 0)
- continue;
- }
- dbg(udev, "put file '%s/%s' into list\n", dirname, ent->d_name);
-
- snprintf(filename, sizeof(filename), "%s/%s", dirname, ent->d_name);
- filename[sizeof(filename)-1] = '\0';
- udev_list_entry_add(udev, file_list, filename, NULL, 1, 1);
- }
-
- closedir(dir);
- return 0;
-}
-
-struct udev_rules *udev_rules_new(struct udev *udev, int resolve_names)
-{
- struct udev_rules *rules;
- struct stat statbuf;
- char filename[PATH_MAX];
- struct udev_list_node file_list;
- struct udev_list_entry *file_loop, *file_tmp;
-
- rules = malloc(sizeof(struct udev_rules));
- if (rules == NULL)
- return rules;
- memset(rules, 0x00, sizeof(struct udev_rules));
- rules->udev = udev;
- rules->resolve_names = resolve_names;
- udev_list_init(&file_list);
-
- if (udev_get_rules_path(udev) != NULL) {
- /* custom rules location for testing */
- add_matching_files(udev, &file_list, udev_get_rules_path(udev), ".rules");
- } else {
- struct udev_list_node sort_list;
- struct udev_list_entry *sort_loop, *sort_tmp;
-
- /* read user/custom rules */
- add_matching_files(udev, &file_list, SYSCONFDIR "/udev/rules.d", ".rules");
-
- /* read dynamic/temporary rules */
- util_strlcpy(filename, udev_get_dev_path(udev), sizeof(filename));
- util_strlcat(filename, "/.udev/rules.d", sizeof(filename));
- if (stat(filename, &statbuf) != 0) {
- create_path(udev, filename);
- udev_selinux_setfscreatecon(udev, filename, S_IFDIR|0755);
- mkdir(filename, 0755);
- udev_selinux_resetfscreatecon(udev);
- }
- udev_list_init(&sort_list);
- add_matching_files(udev, &sort_list, filename, ".rules");
-
- /* read default rules */
- add_matching_files(udev, &sort_list, UDEV_PREFIX "/lib/udev/rules.d", ".rules");
-
- /* sort all rules files by basename into list of files */
- udev_list_entry_foreach_safe(sort_loop, sort_tmp, udev_list_get_entry(&sort_list)) {
- const char *sort_name = udev_list_entry_get_name(sort_loop);
- const char *sort_base = strrchr(sort_name, '/');
-
- if (sort_base == NULL)
- continue;
-
- udev_list_entry_foreach_safe(file_loop, file_tmp, udev_list_get_entry(&file_list)) {
- const char *file_name = udev_list_entry_get_name(file_loop);
- const char *file_base = strrchr(file_name, '/');
-
- if (file_base == NULL)
- continue;
- if (strcmp(file_base, sort_base) == 0) {
- info(udev, "rule file basename '%s' already added, ignoring '%s'\n",
- file_name, sort_name);
- udev_list_entry_remove(sort_loop);
- sort_loop = NULL;
- break;
- }
- if (strcmp(file_base, sort_base) > 0)
- break;
- }
- if (sort_loop != NULL)
- udev_list_entry_move_before(sort_loop, file_loop);