Lines Matching refs:udev_enumerate
50 * udev_enumerate:
54 struct udev_enumerate {
81 _public_ struct udev_enumerate *udev_enumerate_new(struct udev *udev)
83 struct udev_enumerate *udev_enumerate;
87 udev_enumerate = new0(struct udev_enumerate, 1);
88 if (udev_enumerate == NULL)
90 udev_enumerate->refcount = 1;
91 udev_enumerate->udev = udev;
92 udev_list_init(udev, &udev_enumerate->sysattr_match_list, false);
93 udev_list_init(udev, &udev_enumerate->sysattr_nomatch_list, false);
94 udev_list_init(udev, &udev_enumerate->subsystem_match_list, true);
95 udev_list_init(udev, &udev_enumerate->subsystem_nomatch_list, true);
96 udev_list_init(udev, &udev_enumerate->sysname_match_list, true);
97 udev_list_init(udev, &udev_enumerate->properties_match_list, false);
98 udev_list_init(udev, &udev_enumerate->tags_match_list, true);
99 udev_list_init(udev, &udev_enumerate->devices_list, false);
100 return udev_enumerate;
105 * @udev_enumerate: context
111 _public_ struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate)
113 if (udev_enumerate == NULL)
115 udev_enumerate->refcount++;
116 return udev_enumerate;
121 * @udev_enumerate: context
128 _public_ struct udev_enumerate *udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
132 if (udev_enumerate == NULL)
134 udev_enumerate->refcount--;
135 if (udev_enumerate->refcount > 0)
137 udev_list_cleanup(&udev_enumerate->sysattr_match_list);
138 udev_list_cleanup(&udev_enumerate->sysattr_nomatch_list);
139 udev_list_cleanup(&udev_enumerate->subsystem_match_list);
140 udev_list_cleanup(&udev_enumerate->subsystem_nomatch_list);
141 udev_list_cleanup(&udev_enumerate->sysname_match_list);
142 udev_list_cleanup(&udev_enumerate->properties_match_list);
143 udev_list_cleanup(&udev_enumerate->tags_match_list);
144 udev_device_unref(udev_enumerate->parent_match);
145 udev_list_cleanup(&udev_enumerate->devices_list);
146 for (i = 0; i < udev_enumerate->devices_cur; i++)
147 free(udev_enumerate->devices[i].syspath);
148 free(udev_enumerate->devices);
149 free(udev_enumerate);
155 * @udev_enumerate: context
161 _public_ struct udev *udev_enumerate_get_udev(struct udev_enumerate *udev_enumerate)
163 if (udev_enumerate == NULL)
165 return udev_enumerate->udev;
168 static int syspath_add(struct udev_enumerate *udev_enumerate, const char *syspath)
174 if (udev_enumerate->devices_cur >= udev_enumerate->devices_max) {
178 add = udev_enumerate->devices_max;
181 buf = realloc(udev_enumerate->devices, (udev_enumerate->devices_max + add) * sizeof(struct syspath));
184 udev_enumerate->devices = buf;
185 udev_enumerate->devices_max += add;
191 entry = &udev_enumerate->devices[udev_enumerate->devices_cur];
194 udev_enumerate->devices_cur++;
195 udev_enumerate->devices_uptodate = false;
262 * @udev_enumerate: context
268 _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate)
270 if (udev_enumerate == NULL)
272 if (!udev_enumerate->devices_uptodate) {
279 udev_list_cleanup(&udev_enumerate->devices_list);
280 qsort_safe(udev_enumerate->devices, udev_enumerate->devices_cur, sizeof(struct syspath), syspath_cmp);
282 max = udev_enumerate->devices_cur;
284 struct syspath *entry = &udev_enumerate->devices[i];
294 if (devices_delay_end(udev_enumerate->udev, entry->syspath)) {
295 syspath_add(udev_enumerate, entry->syspath);
297 prev = &udev_enumerate->devices[i];
305 move_later_prefix = devices_delay_later(udev_enumerate->udev, entry->syspath);
314 !strneq(entry->syspath, udev_enumerate->devices[move_later].syspath, move_later_prefix)) {
316 udev_list_entry_add(&udev_enumerate->devices_list,
317 udev_enumerate->devices[move_later].syspath, NULL);
321 udev_list_entry_add(&udev_enumerate->devices_list, entry->syspath, NULL);
325 udev_list_entry_add(&udev_enumerate->devices_list,
326 udev_enumerate->devices[move_later].syspath, NULL);
329 for (i = max; i < udev_enumerate->devices_cur; i++) {
330 struct syspath *entry = &udev_enumerate->devices[i];
332 udev_list_entry_add(&udev_enumerate->devices_list, entry->syspath, NULL);
335 udev_enumerate->devices_cur = max;
337 udev_enumerate->devices_uptodate = true;
339 return udev_list_get_entry(&udev_enumerate->devices_list);
344 * @udev_enumerate: context
351 _public_ int udev_enumerate_add_match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
353 if (udev_enumerate == NULL)
357 if (udev_list_entry_add(&udev_enumerate->subsystem_match_list, subsystem, NULL) == NULL)
364 * @udev_enumerate: context
371 _public_ int udev_enumerate_add_nomatch_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
373 if (udev_enumerate == NULL)
377 if (udev_list_entry_add(&udev_enumerate->subsystem_nomatch_list, subsystem, NULL) == NULL)
384 * @udev_enumerate: context
392 _public_ int udev_enumerate_add_match_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value)
394 if (udev_enumerate == NULL)
398 if (udev_list_entry_add(&udev_enumerate->sysattr_match_list, sysattr, value) == NULL)
405 * @udev_enumerate: context
413 _public_ int udev_enumerate_add_nomatch_sysattr(struct udev_enumerate *udev_enumerate, const char *sysattr, const char *value)
415 if (udev_enumerate == NULL)
419 if (udev_list_entry_add(&udev_enumerate->sysattr_nomatch_list, sysattr, value) == NULL)
446 * @udev_enumerate: context
454 _public_ int udev_enumerate_add_match_property(struct udev_enumerate *udev_enumerate, const char *property, const char *value)
456 if (udev_enumerate == NULL)
460 if (udev_list_entry_add(&udev_enumerate->properties_match_list, property, value) == NULL)
467 * @udev_enumerate: context
474 _public_ int udev_enumerate_add_match_tag(struct udev_enumerate *udev_enumerate, const char *tag)
476 if (udev_enumerate == NULL)
480 if (udev_list_entry_add(&udev_enumerate->tags_match_list, tag, NULL) == NULL)
487 * @udev_enumerate: context
493 * A reference for the device is held until the udev_enumerate context
498 _public_ int udev_enumerate_add_match_parent(struct udev_enumerate *udev_enumerate, struct udev_device *parent)
500 if (udev_enumerate == NULL)
504 if (udev_enumerate->parent_match != NULL)
505 udev_device_unref(udev_enumerate->parent_match);
506 udev_enumerate->parent_match = udev_device_ref(parent);
512 * @udev_enumerate: context
528 _public_ int udev_enumerate_add_match_is_initialized(struct udev_enumerate *udev_enumerate)
530 if (udev_enumerate == NULL)
532 udev_enumerate->match_is_initialized = true;
538 * @udev_enumerate: context
545 _public_ int udev_enumerate_add_match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname)
547 if (udev_enumerate == NULL)
551 if (udev_list_entry_add(&udev_enumerate->sysname_match_list, sysname, NULL) == NULL)
556 static bool match_sysattr(struct udev_enumerate *udev_enumerate, struct udev_device *dev)
561 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->sysattr_nomatch_list)) {
567 if (udev_list_get_entry(&udev_enumerate->sysattr_match_list) != NULL) {
568 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->sysattr_match_list)) {
579 static bool match_property(struct udev_enumerate *udev_enumerate, struct udev_device *dev)
585 if (udev_list_get_entry(&udev_enumerate->properties_match_list) == NULL)
589 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->properties_match_list)) {
617 static bool match_tag(struct udev_enumerate *udev_enumerate, struct udev_device *dev)
622 if (udev_list_get_entry(&udev_enumerate->tags_match_list) == NULL)
626 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->tags_match_list))
633 static bool match_parent(struct udev_enumerate *udev_enumerate, struct udev_device *dev)
635 if (udev_enumerate->parent_match == NULL)
638 return startswith(udev_device_get_devpath(dev), udev_device_get_devpath(udev_enumerate->parent_match));
641 static bool match_sysname(struct udev_enumerate *udev_enumerate, const char *sysname)
645 if (udev_list_get_entry(&udev_enumerate->sysname_match_list) == NULL)
648 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->sysname_match_list)) {
656 static int scan_dir_and_add_devices(struct udev_enumerate *udev_enumerate,
681 if (!match_sysname(udev_enumerate, dent->d_name))
685 dev = udev_device_new_from_syspath(udev_enumerate->udev, syspath);
689 if (udev_enumerate->match_is_initialized) {
704 if (!match_parent(udev_enumerate, dev))
706 if (!match_tag(udev_enumerate, dev))
708 if (!match_property(udev_enumerate, dev))
710 if (!match_sysattr(udev_enumerate, dev))
713 syspath_add(udev_enumerate, udev_device_get_syspath(dev));
721 static bool match_subsystem(struct udev_enumerate *udev_enumerate, const char *subsystem)
728 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->subsystem_nomatch_list)) {
733 if (udev_list_get_entry(&udev_enumerate->subsystem_match_list) != NULL) {
734 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->subsystem_match_list)) {
744 static int scan_dir(struct udev_enumerate *udev_enumerate, const char *basedir, const char *subdir, const char *subsystem)
757 if (!match_subsystem(udev_enumerate, subsystem != NULL ? subsystem : dent->d_name))
759 scan_dir_and_add_devices(udev_enumerate, basedir, dent->d_name, subdir);
767 * @udev_enumerate: context
774 _public_ int udev_enumerate_add_syspath(struct udev_enumerate *udev_enumerate, const char *syspath)
778 if (udev_enumerate == NULL)
783 udev_device = udev_device_new_from_syspath(udev_enumerate->udev, syspath);
786 syspath_add(udev_enumerate, udev_device_get_syspath(udev_device));
791 static int scan_devices_tags(struct udev_enumerate *udev_enumerate)
796 udev_list_entry_foreach(list_entry, udev_list_get_entry(&udev_enumerate->tags_match_list)) {
811 dev = udev_device_new_from_device_id(udev_enumerate->udev, dent->d_name);
815 if (!match_subsystem(udev_enumerate, udev_device_get_subsystem(dev)))
817 if (!match_sysname(udev_enumerate, udev_device_get_sysname(dev)))
819 if (!match_parent(udev_enumerate, dev))
821 if (!match_property(udev_enumerate, dev))
823 if (!match_sysattr(udev_enumerate, dev))
826 syspath_add(udev_enumerate, udev_device_get_syspath(dev));
835 static int parent_add_child(struct udev_enumerate *enumerate, const char *path)
861 static int parent_crawl_children(struct udev_enumerate *enumerate, const char *path, int maxdepth)
889 static int scan_devices_children(struct udev_enumerate *enumerate)
898 static int scan_devices_all(struct udev_enumerate *udev_enumerate)
904 scan_dir(udev_enumerate, "subsystem", "devices", NULL);
906 scan_dir(udev_enumerate, "bus", "devices", NULL);
907 scan_dir(udev_enumerate, "class", NULL, NULL);
914 * @udev_enumerate: udev enumeration context
921 _public_ int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)
923 if (udev_enumerate == NULL)
927 if (udev_list_get_entry(&udev_enumerate->tags_match_list) != NULL)
928 return scan_devices_tags(udev_enumerate);
931 if (udev_enumerate->parent_match != NULL)
932 return scan_devices_children(udev_enumerate);
935 return scan_devices_all(udev_enumerate);
940 * @udev_enumerate: udev enumeration context
946 _public_ int udev_enumerate_scan_subsystems(struct udev_enumerate *udev_enumerate)
951 if (udev_enumerate == NULL)
955 if (match_subsystem(udev_enumerate, "module"))
956 scan_dir_and_add_devices(udev_enumerate, "module", NULL, NULL);
964 if (match_subsystem(udev_enumerate, "subsystem"))
965 scan_dir_and_add_devices(udev_enumerate, subsysdir, NULL, NULL);
968 if (match_subsystem(udev_enumerate, "drivers"))
969 scan_dir(udev_enumerate, subsysdir, "drivers", "drivers");