Message ID | 20200803211733.1037019-4-niklas.soderlund@ragnatech.se |
---|---|
State | Superseded |
Headers | show |
Series |
|
Related | show |
Hi Niklas, Thank you for the patch. On Mon, Aug 03, 2020 at 11:17:27PM +0200, Niklas Söderlund wrote: > Add a method to lookup a V4L2 devices path in sysfs. > > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> > --- > * Changes since v5 > - Expand documentation > - Use DeviceEnumerator interface to lookup device path > - Include stdlib.h > - Use realpath(..., nullptr); ...; free(); > > * Changes since v3 > - s/the device path/the device path in sysfs/ > --- > include/libcamera/internal/v4l2_device.h | 1 + > src/libcamera/v4l2_device.cpp | 27 ++++++++++++++++++++++++ > 2 files changed, 28 insertions(+) > > diff --git a/include/libcamera/internal/v4l2_device.h b/include/libcamera/internal/v4l2_device.h > index bf643f2ec966bb33..3b605aab343b3b94 100644 > --- a/include/libcamera/internal/v4l2_device.h > +++ b/include/libcamera/internal/v4l2_device.h > @@ -30,6 +30,7 @@ public: > int setControls(ControlList *ctrls); > > const std::string &deviceNode() const { return deviceNode_; } > + std::string devicePath() const; > > protected: > V4L2Device(const std::string &deviceNode); > diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp > index 56ea1ddda2c1425f..ef601d8e7e04b32a 100644 > --- a/src/libcamera/v4l2_device.cpp > +++ b/src/libcamera/v4l2_device.cpp > @@ -9,11 +9,14 @@ > > #include <fcntl.h> > #include <iomanip> > +#include <limits.h> > +#include <stdlib.h> > #include <string.h> > #include <sys/ioctl.h> > #include <sys/syscall.h> > #include <unistd.h> > > +#include "libcamera/internal/device_enumerator.h" > #include "libcamera/internal/log.h" > #include "libcamera/internal/utils.h" > #include "libcamera/internal/v4l2_controls.h" > @@ -350,6 +353,30 @@ int V4L2Device::setControls(ControlList *ctrls) > return ret; > } > > +/** > + * \brief Retrieve the device path in sysfs > + * > + * This function returns the sysfs path to the physical device backing the V4L2 > + * device. The path is guaranteed to be an absolute path, without any symbolic > + * link. > + * > + * \return The device path in sysfs > + */ > +std::string V4L2Device::devicePath() const > +{ > + std::unique_ptr<DeviceEnumerator> de = DeviceEnumerator::create(); Creating a new device enumerator just for this is a bit expensive :-( If you agree with my suggestion in 1/9, I think we can ditch the device enumerator. Otherwise it would be best to retrieve the instance created by the camera manager. > + std::string devicePath = de->lookupSysfsPath(deviceNode_) + "/device"; > + > + char *realPath = realpath(devicePath.c_str(), nullptr); > + if (!realPath) > + LOG(V4L2, Fatal) << "Can not resolve path for " << devicePath; > + > + std::string path{ realPath }; std::string::string(nullptr) has undefined behaviour. You should return {} in the error case above. > + free(realPath); > + > + return path; > +} > + > /** > * \brief Perform an IOCTL system call on the device node > * \param[in] request The IOCTL request code
diff --git a/include/libcamera/internal/v4l2_device.h b/include/libcamera/internal/v4l2_device.h index bf643f2ec966bb33..3b605aab343b3b94 100644 --- a/include/libcamera/internal/v4l2_device.h +++ b/include/libcamera/internal/v4l2_device.h @@ -30,6 +30,7 @@ public: int setControls(ControlList *ctrls); const std::string &deviceNode() const { return deviceNode_; } + std::string devicePath() const; protected: V4L2Device(const std::string &deviceNode); diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp index 56ea1ddda2c1425f..ef601d8e7e04b32a 100644 --- a/src/libcamera/v4l2_device.cpp +++ b/src/libcamera/v4l2_device.cpp @@ -9,11 +9,14 @@ #include <fcntl.h> #include <iomanip> +#include <limits.h> +#include <stdlib.h> #include <string.h> #include <sys/ioctl.h> #include <sys/syscall.h> #include <unistd.h> +#include "libcamera/internal/device_enumerator.h" #include "libcamera/internal/log.h" #include "libcamera/internal/utils.h" #include "libcamera/internal/v4l2_controls.h" @@ -350,6 +353,30 @@ int V4L2Device::setControls(ControlList *ctrls) return ret; } +/** + * \brief Retrieve the device path in sysfs + * + * This function returns the sysfs path to the physical device backing the V4L2 + * device. The path is guaranteed to be an absolute path, without any symbolic + * link. + * + * \return The device path in sysfs + */ +std::string V4L2Device::devicePath() const +{ + std::unique_ptr<DeviceEnumerator> de = DeviceEnumerator::create(); + std::string devicePath = de->lookupSysfsPath(deviceNode_) + "/device"; + + char *realPath = realpath(devicePath.c_str(), nullptr); + if (!realPath) + LOG(V4L2, Fatal) << "Can not resolve path for " << devicePath; + + std::string path{ realPath }; + free(realPath); + + return path; +} + /** * \brief Perform an IOCTL system call on the device node * \param[in] request The IOCTL request code
Add a method to lookup a V4L2 devices path in sysfs. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> --- * Changes since v5 - Expand documentation - Use DeviceEnumerator interface to lookup device path - Include stdlib.h - Use realpath(..., nullptr); ...; free(); * Changes since v3 - s/the device path/the device path in sysfs/ --- include/libcamera/internal/v4l2_device.h | 1 + src/libcamera/v4l2_device.cpp | 27 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+)