chiark / gitweb /
libudev: more list rework
[elogind.git] / udev / lib / libudev-enumerate.c
index 80df8bd72d8d1adc5976200f5a34910f19c8b574..8f5c5640b25113748239e6568b4210d169df1831 100644 (file)
@@ -32,7 +32,7 @@
 struct udev_enumerate {
        struct udev *udev;
        int refcount;
-       struct list_head devices_list;
+       struct list_node devices_list;
 };
 
 struct udev_enumerate *udev_enumerate_ref(struct udev_enumerate *udev_enumerate)
@@ -54,7 +54,7 @@ void udev_enumerate_unref(struct udev_enumerate *udev_enumerate)
        free(udev_enumerate);
 }
 
-struct udev_list *udev_enumerate_get_devices_list(struct udev_enumerate *udev_enumerate)
+struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enumerate *udev_enumerate)
 {
        if (udev_enumerate == NULL)
                return NULL;
@@ -63,7 +63,7 @@ struct udev_list *udev_enumerate_get_devices_list(struct udev_enumerate *udev_en
 
 static int devices_scan_subsystem(struct udev *udev,
                                  const char *basedir, const char *subsystem, const char *subdir,
-                                 struct list_head *device_list)
+                                 struct list_node *device_list)
 {
        char path[UTIL_PATH_SIZE];
        DIR *dir;
@@ -87,7 +87,7 @@ static int devices_scan_subsystem(struct udev *udev,
                util_strlcat(syspath, "/", sizeof(syspath));
                util_strlcat(syspath, dent->d_name, sizeof(syspath));
                util_resolve_sys_link(udev, syspath, sizeof(syspath));
-               list_insert(udev, device_list, syspath, NULL, 1);
+               list_entry_add(udev, device_list, syspath, NULL, 1, 1);
        }
        closedir(dir);
        return 0;
@@ -95,7 +95,7 @@ static int devices_scan_subsystem(struct udev *udev,
 
 static int devices_scan_subsystems(struct udev *udev,
                                   const char *basedir, const char *subsystem, const char *subdir,
-                                  struct list_head *device_list)
+                                  struct list_node *device_list)
 {
        char path[UTIL_PATH_SIZE];
        DIR *dir;
@@ -151,7 +151,7 @@ struct udev_enumerate *udev_enumerate_new_from_subsystems(struct udev *udev, con
        struct udev_enumerate *udev_enumerate;
        char base[UTIL_PATH_SIZE];
        struct stat statbuf;
-       struct udev_list *list;
+       struct udev_list_entry *list_entry;
 
        if (udev == NULL)
                return NULL;
@@ -162,24 +162,25 @@ struct udev_enumerate *udev_enumerate_new_from_subsystems(struct udev *udev, con
        memset(udev_enumerate, 0x00, (sizeof(struct udev_enumerate)));
        udev_enumerate->refcount = 1;
        udev_enumerate->udev = udev;
-       INIT_LIST_HEAD(&udev_enumerate->devices_list);
+       list_init(&udev_enumerate->devices_list);
 
        /* if we have /sys/subsystem/, forget all the old stuff */
        util_strlcpy(base, udev_get_sys_path(udev), sizeof(base));
        util_strlcat(base, "/subsystem", sizeof(base));
        if (stat(base, &statbuf) == 0) {
+               info(udev, "searching 'subsystem/*/devices/*' dir\n");
                devices_scan_subsystems(udev, "/subsystem", subsystem, "/devices", &udev_enumerate->devices_list);
        } else {
+               info(udev, "searching 'bus/*/devices/*' dir\n");
                devices_scan_subsystems(udev, "/bus", subsystem, "/devices", &udev_enumerate->devices_list);
+               info(udev, "searching 'class/*' dir\n");
                devices_scan_subsystems(udev, "/class", subsystem, NULL, &udev_enumerate->devices_list);
        }
 
        /* sort delayed devices to the end of the list */
-       list = list_get_entry(&udev_enumerate->devices_list);
-       while (list != NULL) {
-               if (devices_delay(udev, udev_list_get_name(list)))
-                       list_move_to_end(list, &udev_enumerate->devices_list);
-               list = udev_list_get_next(list);
+       udev_list_entry_foreach(list_entry, list_get_entry(&udev_enumerate->devices_list)) {
+               if (devices_delay(udev, udev_list_entry_get_name(list_entry)))
+                       list_entry_move_to_end(list_entry);
        }
        return udev_enumerate;
 }