v4l2: v4l2_camera_file: Store file description

Create a string that describe the file from the path and file
descriptor. This will be used in log messages to clearly identify which
file an operation is related to.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2021-12-28 23:29:51 +02:00
parent 43c86fb0c6
commit 07d5fff29c
3 changed files with 37 additions and 3 deletions

View file

@ -7,20 +7,46 @@
#include "v4l2_camera_file.h" #include "v4l2_camera_file.h"
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include "v4l2_camera_proxy.h" #include "v4l2_camera_proxy.h"
using namespace libcamera; 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), : proxy_(proxy), nonBlocking_(nonBlocking), efd_(efd),
priority_(V4L2_PRIORITY_DEFAULT) priority_(V4L2_PRIORITY_DEFAULT)
{ {
proxy_->open(this); 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() V4L2CameraFile::~V4L2CameraFile()
{ {
proxy_->close(this); proxy_->close(this);
} }
const std::string &V4L2CameraFile::description() const
{
return description_;
}

View file

@ -7,6 +7,8 @@
#pragma once #pragma once
#include <string>
#include <linux/videodev2.h> #include <linux/videodev2.h>
class V4L2CameraProxy; class V4L2CameraProxy;
@ -14,7 +16,8 @@ class V4L2CameraProxy;
class V4L2CameraFile class V4L2CameraFile
{ {
public: public:
V4L2CameraFile(int efd, bool nonBlocking, V4L2CameraProxy *proxy); V4L2CameraFile(int dirfd, const char *path, int efd, bool nonBlocking,
V4L2CameraProxy *proxy);
~V4L2CameraFile(); ~V4L2CameraFile();
V4L2CameraProxy *proxy() const { return proxy_; } V4L2CameraProxy *proxy() const { return proxy_; }
@ -25,9 +28,12 @@ public:
enum v4l2_priority priority() const { return priority_; } enum v4l2_priority priority() const { return priority_; }
void setPriority(enum v4l2_priority priority) { priority_ = priority; } void setPriority(enum v4l2_priority priority) { priority_ = priority; }
const std::string &description() const;
private: private:
V4L2CameraProxy *proxy_; V4L2CameraProxy *proxy_;
std::string description_;
bool nonBlocking_; bool nonBlocking_;
int efd_; int efd_;
enum v4l2_priority priority_; enum v4l2_priority priority_;

View file

@ -156,7 +156,9 @@ int V4L2CompatManager::openat(int dirfd, const char *path, int oflag, mode_t mod
return efd; return efd;
V4L2CameraProxy *proxy = proxies_[ret].get(); 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; LOG(V4L2Compat, Debug) << "Opened " << path << " -> fd " << efd;
return efd; return efd;