summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHirokazu Honda <hiroh@chromium.org>2021-06-10 16:50:23 +0900
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-12-04 23:05:04 +0200
commitcfe4f9622ead96702d879835ca9dd2942d503399 (patch)
treec2d52be45b44f5fcd67e297a0da4fdd3ece44bed /src
parent91dcd719d7c4aba3cd9942a77d03068c3f05c0a5 (diff)
libcamera: v4l2_device: Use UniqueFD for a file descriptor
Manages a file descriptor owned by V4L2Device for a v4l2 device node by UniqueFD. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/v4l2_device.cpp23
-rw-r--r--src/libcamera/v4l2_videodevice.cpp16
2 files changed, 16 insertions, 23 deletions
diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp
index 9c783c9c..39f36009 100644
--- a/src/libcamera/v4l2_device.cpp
+++ b/src/libcamera/v4l2_device.cpp
@@ -53,7 +53,7 @@ LOG_DEFINE_CATEGORY(V4L2)
* at open() time, and the \a logTag to prefix log messages with.
*/
V4L2Device::V4L2Device(const std::string &deviceNode)
- : deviceNode_(deviceNode), fd_(-1), fdEventNotifier_(nullptr),
+ : deviceNode_(deviceNode), fdEventNotifier_(nullptr),
frameStartEnabled_(false)
{
}
@@ -81,15 +81,15 @@ int V4L2Device::open(unsigned int flags)
return -EBUSY;
}
- int ret = syscall(SYS_openat, AT_FDCWD, deviceNode_.c_str(), flags);
- if (ret < 0) {
- ret = -errno;
+ UniqueFD fd(syscall(SYS_openat, AT_FDCWD, deviceNode_.c_str(), flags));
+ if (!fd.isValid()) {
+ int ret = -errno;
LOG(V4L2, Error) << "Failed to open V4L2 device: "
<< strerror(-ret);
return ret;
}
- setFd(ret);
+ setFd(std::move(fd));
listControls();
@@ -112,14 +112,14 @@ int V4L2Device::open(unsigned int flags)
*
* \return 0 on success or a negative error code otherwise
*/
-int V4L2Device::setFd(int fd)
+int V4L2Device::setFd(UniqueFD fd)
{
if (isOpen())
return -EBUSY;
- fd_ = fd;
+ fd_ = std::move(fd);
- fdEventNotifier_ = new EventNotifier(fd_, EventNotifier::Exception);
+ fdEventNotifier_ = new EventNotifier(fd_.get(), EventNotifier::Exception);
fdEventNotifier_->activated.connect(this, &V4L2Device::eventAvailable);
fdEventNotifier_->setEnabled(false);
@@ -138,10 +138,7 @@ void V4L2Device::close()
delete fdEventNotifier_;
- if (::close(fd_) < 0)
- LOG(V4L2, Error) << "Failed to close V4L2 device: "
- << strerror(errno);
- fd_ = -1;
+ fd_.reset();
}
/**
@@ -440,7 +437,7 @@ int V4L2Device::ioctl(unsigned long request, void *argp)
* Printing out an error message is usually better performed
* in the caller, which can provide more context.
*/
- if (::ioctl(fd_, request, argp) < 0)
+ if (::ioctl(fd_.get(), request, argp) < 0)
return -errno;
return 0;
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index 0a85bcf6..c95626d3 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -24,6 +24,7 @@
#include <libcamera/base/event_notifier.h>
#include <libcamera/base/file_descriptor.h>
#include <libcamera/base/log.h>
+#include <libcamera/base/unique_fd.h>
#include <libcamera/base/utils.h>
#include "libcamera/internal/formats.h"
@@ -620,22 +621,17 @@ int V4L2VideoDevice::open()
*/
int V4L2VideoDevice::open(int handle, enum v4l2_buf_type type)
{
- int ret;
- int newFd;
-
- newFd = dup(handle);
- if (newFd < 0) {
- ret = -errno;
+ UniqueFD newFd(dup(handle));
+ if (!newFd.isValid()) {
LOG(V4L2, Error) << "Failed to duplicate file handle: "
- << strerror(-ret);
- return ret;
+ << strerror(errno);
+ return -errno;
}
- ret = V4L2Device::setFd(newFd);
+ int ret = V4L2Device::setFd(std::move(newFd));
if (ret < 0) {
LOG(V4L2, Error) << "Failed to set file handle: "
<< strerror(-ret);
- ::close(newFd);
return ret;
}