diff options
-rw-r--r-- | src/v4l2/v4l2_camera_file.cpp | 28 | ||||
-rw-r--r-- | src/v4l2/v4l2_camera_file.h | 8 | ||||
-rw-r--r-- | src/v4l2/v4l2_compat_manager.cpp | 4 |
3 files changed, 37 insertions, 3 deletions
diff --git a/src/v4l2/v4l2_camera_file.cpp b/src/v4l2/v4l2_camera_file.cpp index a07679b5..0a41587c 100644 --- a/src/v4l2/v4l2_camera_file.cpp +++ b/src/v4l2/v4l2_camera_file.cpp @@ -7,20 +7,46 @@ #include "v4l2_camera_file.h" +#include <fcntl.h> +#include <stdlib.h> +#include <unistd.h> + #include <linux/videodev2.h> #include "v4l2_camera_proxy.h" using namespace libcamera; -V4L2CameraFile::V4L2CameraFile(int efd, bool nonBlocking, V4L2CameraProxy *proxy) +V4L2CameraFile::V4L2CameraFile(int dirfd, const char *path, int efd, + bool nonBlocking, V4L2CameraProxy *proxy) : proxy_(proxy), nonBlocking_(nonBlocking), efd_(efd), priority_(V4L2_PRIORITY_DEFAULT) { proxy_->open(this); + + if (path[0] != '/') { + if (dirfd == AT_FDCWD) { + char *cwd = getcwd(nullptr, 0); + if (cwd) { + description_ = std::string(cwd) + "/"; + free(cwd); + } else { + description_ = std::string("(unreachable)/"); + } + } else { + description_ = "(dirfd:" + std::to_string(dirfd) + ")/"; + } + } + + description_ += std::string(path) + " (fd:" + std::to_string(efd) + ")"; } V4L2CameraFile::~V4L2CameraFile() { proxy_->close(this); } + +const std::string &V4L2CameraFile::description() const +{ + return description_; +} diff --git a/src/v4l2/v4l2_camera_file.h b/src/v4l2/v4l2_camera_file.h index 6c4cb5d8..1a7b6a63 100644 --- a/src/v4l2/v4l2_camera_file.h +++ b/src/v4l2/v4l2_camera_file.h @@ -7,6 +7,8 @@ #pragma once +#include <string> + #include <linux/videodev2.h> class V4L2CameraProxy; @@ -14,7 +16,8 @@ class V4L2CameraProxy; class V4L2CameraFile { public: - V4L2CameraFile(int efd, bool nonBlocking, V4L2CameraProxy *proxy); + V4L2CameraFile(int dirfd, const char *path, int efd, bool nonBlocking, + V4L2CameraProxy *proxy); ~V4L2CameraFile(); V4L2CameraProxy *proxy() const { return proxy_; } @@ -25,9 +28,12 @@ public: enum v4l2_priority priority() const { return priority_; } void setPriority(enum v4l2_priority priority) { priority_ = priority; } + const std::string &description() const; + private: V4L2CameraProxy *proxy_; + std::string description_; bool nonBlocking_; int efd_; enum v4l2_priority priority_; diff --git a/src/v4l2/v4l2_compat_manager.cpp b/src/v4l2/v4l2_compat_manager.cpp index c64cdb86..585046e9 100644 --- a/src/v4l2/v4l2_compat_manager.cpp +++ b/src/v4l2/v4l2_compat_manager.cpp @@ -156,7 +156,9 @@ int V4L2CompatManager::openat(int dirfd, const char *path, int oflag, mode_t mod return efd; V4L2CameraProxy *proxy = proxies_[ret].get(); - files_.emplace(efd, std::make_shared<V4L2CameraFile>(efd, oflag & O_NONBLOCK, proxy)); + files_.emplace(efd, std::make_shared<V4L2CameraFile>(dirfd, path, efd, + oflag & O_NONBLOCK, + proxy)); LOG(V4L2Compat, Debug) << "Opened " << path << " -> fd " << efd; return efd; |