| 769 | } |
| 770 | |
| 771 | static struct hid_device_info * create_device_info_for_hid_device(hid_device *dev) { |
| 772 | struct udev *udev; |
| 773 | struct udev_device *udev_dev; |
| 774 | struct stat s; |
| 775 | int ret = -1; |
| 776 | struct hid_device_info *root = NULL; |
| 777 | |
| 778 | register_device_error(dev, NULL); |
| 779 | |
| 780 | /* Get the dev_t (major/minor numbers) from the file handle. */ |
| 781 | ret = fstat(dev->device_handle, &s); |
| 782 | if (-1 == ret) { |
| 783 | register_device_error(dev, "Failed to stat device handle"); |
| 784 | return NULL; |
| 785 | } |
| 786 | |
| 787 | /* Create the udev object */ |
| 788 | udev = udev_new(); |
| 789 | if (!udev) { |
| 790 | register_device_error(dev, "Couldn't create udev context"); |
| 791 | return NULL; |
| 792 | } |
| 793 | |
| 794 | /* Open a udev device from the dev_t. 'c' means character device. */ |
| 795 | udev_dev = udev_device_new_from_devnum(udev, 'c', s.st_rdev); |
| 796 | if (udev_dev) { |
| 797 | root = create_device_info_for_device(udev_dev); |
| 798 | } |
| 799 | |
| 800 | if (!root) { |
| 801 | /* TODO: have a better error reporting via create_device_info_for_device */ |
| 802 | register_device_error(dev, "Couldn't create hid_device_info"); |
| 803 | } |
| 804 | |
| 805 | udev_device_unref(udev_dev); |
| 806 | udev_unref(udev); |
| 807 | |
| 808 | return root; |
| 809 | } |
| 810 | |
| 811 | HID_API_EXPORT const struct hid_api_version* HID_API_CALL hid_version(void) |
| 812 | { |
no test coverage detected