diff options
Diffstat (limited to 'src/libcamera/device_enumerator.cpp')
-rw-r--r-- | src/libcamera/device_enumerator.cpp | 157 |
1 files changed, 3 insertions, 154 deletions
diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp index 49467546..f6878b3d 100644 --- a/src/libcamera/device_enumerator.cpp +++ b/src/libcamera/device_enumerator.cpp @@ -6,14 +6,9 @@ */ #include "device_enumerator.h" +#include "device_enumerator_udev.h" -#include <fcntl.h> -#include <libudev.h> #include <string.h> -#include <sys/ioctl.h> -#include <unistd.h> - -#include <libcamera/event_notifier.h> #include "log.h" #include "media_device.h" @@ -148,13 +143,11 @@ std::unique_ptr<DeviceEnumerator> DeviceEnumerator::create() { std::unique_ptr<DeviceEnumerator> enumerator; - /** - * \todo Add compile time checks to only try udev enumerator if libudev - * is available. - */ +#ifdef HAVE_LIBUDEV enumerator = utils::make_unique<DeviceEnumeratorUdev>(); if (!enumerator->init()) return enumerator; +#endif /* * Either udev is not available or udev initialization failed. Fall back @@ -327,148 +320,4 @@ std::shared_ptr<MediaDevice> DeviceEnumerator::search(const DeviceMatch &dm) * fails */ -/** - * \class DeviceEnumeratorUdev - * \brief Device enumerator based on libudev - */ - -DeviceEnumeratorUdev::DeviceEnumeratorUdev() - : udev_(nullptr) -{ -} - -DeviceEnumeratorUdev::~DeviceEnumeratorUdev() -{ - delete notifier_; - - if (monitor_) - udev_monitor_unref(monitor_); - if (udev_) - udev_unref(udev_); -} - -int DeviceEnumeratorUdev::init() -{ - int ret; - - if (udev_) - return -EBUSY; - - udev_ = udev_new(); - if (!udev_) - return -ENODEV; - - monitor_ = udev_monitor_new_from_netlink(udev_, "udev"); - if (!monitor_) - return -ENODEV; - - ret = udev_monitor_filter_add_match_subsystem_devtype(monitor_, "media", - nullptr); - if (ret < 0) - return ret; - - return 0; -} - -int DeviceEnumeratorUdev::enumerate() -{ - struct udev_enumerate *udev_enum = nullptr; - struct udev_list_entry *ents, *ent; - int ret; - - udev_enum = udev_enumerate_new(udev_); - if (!udev_enum) - return -ENOMEM; - - ret = udev_enumerate_add_match_subsystem(udev_enum, "media"); - if (ret < 0) - goto done; - - ret = udev_enumerate_scan_devices(udev_enum); - if (ret < 0) - goto done; - - ents = udev_enumerate_get_list_entry(udev_enum); - if (!ents) - goto done; - - udev_list_entry_foreach(ent, ents) { - struct udev_device *dev; - const char *devnode; - const char *syspath = udev_list_entry_get_name(ent); - - dev = udev_device_new_from_syspath(udev_, syspath); - if (!dev) { - LOG(DeviceEnumerator, Warning) - << "Failed to get device for '" - << syspath << "', skipping"; - continue; - } - - devnode = udev_device_get_devnode(dev); - if (!devnode) { - udev_device_unref(dev); - ret = -ENODEV; - goto done; - } - - addDevice(devnode); - - udev_device_unref(dev); - } -done: - udev_enumerate_unref(udev_enum); - if (ret < 0) - return ret; - - ret = udev_monitor_enable_receiving(monitor_); - if (ret < 0) - return ret; - - int fd = udev_monitor_get_fd(monitor_); - notifier_ = new EventNotifier(fd, EventNotifier::Read); - notifier_->activated.connect(this, &DeviceEnumeratorUdev::udevNotify); - - return 0; -} - -std::string DeviceEnumeratorUdev::lookupDeviceNode(int major, int minor) -{ - struct udev_device *device; - const char *name; - dev_t devnum; - std::string deviceNode = std::string(); - - devnum = makedev(major, minor); - device = udev_device_new_from_devnum(udev_, 'c', devnum); - if (!device) - return std::string(); - - name = udev_device_get_devnode(device); - if (name) - deviceNode = name; - - udev_device_unref(device); - - return deviceNode; -} - -void DeviceEnumeratorUdev::udevNotify(EventNotifier *notifier) -{ - struct udev_device *dev = udev_monitor_receive_device(monitor_); - std::string action(udev_device_get_action(dev)); - std::string deviceNode(udev_device_get_devnode(dev)); - - LOG(DeviceEnumerator, Debug) - << action << " device " << udev_device_get_devnode(dev); - - if (action == "add") { - addDevice(deviceNode); - } else if (action == "remove") { - removeDevice(deviceNode); - } - - udev_device_unref(dev); -} - } /* namespace libcamera */ |