+struct udev_device *udev_device_new_from_devnum(struct udev *udev, char type, dev_t devnum)
+{
+ char path[UTIL_PATH_SIZE];
+ const char *type_str;
+ struct udev_enumerate *enumerate;
+ struct udev_list *list;
+ struct udev_device *device = NULL;
+
+ if (type == 'b')
+ type_str = "block";
+ else if (type == 'c')
+ type_str = "char";
+ else
+ return NULL;
+
+ /* /sys/dev/{block,char}/<maj>:<min> links */
+ snprintf(path, sizeof(path), "%s/dev/%s/%u:%u", udev_get_sys_path(udev),
+ type_str, major(devnum), minor(devnum));
+ if (util_resolve_sys_link(udev, path, sizeof(path)) == 0)
+ return udev_device_new_from_syspath(udev, path);
+
+ /* fallback to search all sys devices for the major/minor */
+ enumerate = udev_enumerate_new_from_subsystems(udev, NULL);
+ if (enumerate == NULL)
+ return NULL;
+ list = udev_enumerate_get_list(enumerate);
+ while (list != NULL) {
+ struct udev_device *device_loop;
+
+ device_loop = udev_device_new_from_syspath(udev, udev_list_get_name(list));
+ if (device_loop != NULL) {
+ if (udev_device_get_devnum(device_loop) == devnum) {
+ device = device_loop;
+ break;
+ }
+ udev_device_unref(device_loop);
+ }
+ list = udev_list_get_next(list);
+ }
+ udev_enumerate_unref(enumerate);
+ return device;
+}
+