mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-25 17:45:06 +03:00
libcamera: file: Manage fd by UniqueFD
Manages the file descriptor owned by File by UniqueFD. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
a59c471e5a
commit
edd70612e5
2 changed files with 15 additions and 15 deletions
|
@ -17,6 +17,7 @@
|
||||||
#include <libcamera/base/class.h>
|
#include <libcamera/base/class.h>
|
||||||
#include <libcamera/base/flags.h>
|
#include <libcamera/base/flags.h>
|
||||||
#include <libcamera/base/span.h>
|
#include <libcamera/base/span.h>
|
||||||
|
#include <libcamera/base/unique_fd.h>
|
||||||
|
|
||||||
namespace libcamera {
|
namespace libcamera {
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ public:
|
||||||
bool exists() const;
|
bool exists() const;
|
||||||
|
|
||||||
bool open(OpenMode mode);
|
bool open(OpenMode mode);
|
||||||
bool isOpen() const { return fd_ != -1; }
|
bool isOpen() const { return fd_.isValid(); }
|
||||||
OpenMode openMode() const { return mode_; }
|
OpenMode openMode() const { return mode_; }
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
|
@ -73,7 +74,7 @@ private:
|
||||||
void unmapAll();
|
void unmapAll();
|
||||||
|
|
||||||
std::string name_;
|
std::string name_;
|
||||||
int fd_;
|
UniqueFD fd_;
|
||||||
OpenMode mode_;
|
OpenMode mode_;
|
||||||
|
|
||||||
int error_;
|
int error_;
|
||||||
|
|
|
@ -83,7 +83,7 @@ LOG_DEFINE_CATEGORY(File)
|
||||||
* before performing I/O operations.
|
* before performing I/O operations.
|
||||||
*/
|
*/
|
||||||
File::File(const std::string &name)
|
File::File(const std::string &name)
|
||||||
: name_(name), fd_(-1), mode_(OpenModeFlag::NotOpen), error_(0)
|
: name_(name), mode_(OpenModeFlag::NotOpen), error_(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ File::File(const std::string &name)
|
||||||
* setFileName().
|
* setFileName().
|
||||||
*/
|
*/
|
||||||
File::File()
|
File::File()
|
||||||
: fd_(-1), mode_(OpenModeFlag::NotOpen), error_(0)
|
: mode_(OpenModeFlag::NotOpen), error_(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,8 +177,8 @@ bool File::open(File::OpenMode mode)
|
||||||
if (mode & OpenModeFlag::WriteOnly)
|
if (mode & OpenModeFlag::WriteOnly)
|
||||||
flags |= O_CREAT;
|
flags |= O_CREAT;
|
||||||
|
|
||||||
fd_ = ::open(name_.c_str(), flags, 0666);
|
fd_ = UniqueFD(::open(name_.c_str(), flags, 0666));
|
||||||
if (fd_ < 0) {
|
if (!fd_.isValid()) {
|
||||||
error_ = -errno;
|
error_ = -errno;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -209,11 +209,10 @@ bool File::open(File::OpenMode mode)
|
||||||
*/
|
*/
|
||||||
void File::close()
|
void File::close()
|
||||||
{
|
{
|
||||||
if (fd_ == -1)
|
if (!fd_.isValid())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
::close(fd_);
|
fd_.reset();
|
||||||
fd_ = -1;
|
|
||||||
mode_ = OpenModeFlag::NotOpen;
|
mode_ = OpenModeFlag::NotOpen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,7 +242,7 @@ ssize_t File::size() const
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
int ret = fstat(fd_, &st);
|
int ret = fstat(fd_.get(), &st);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
|
@ -262,7 +261,7 @@ off_t File::pos() const
|
||||||
if (!isOpen())
|
if (!isOpen())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return lseek(fd_, 0, SEEK_CUR);
|
return lseek(fd_.get(), 0, SEEK_CUR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -276,7 +275,7 @@ off_t File::seek(off_t pos)
|
||||||
if (!isOpen())
|
if (!isOpen())
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
off_t ret = lseek(fd_, pos, SEEK_SET);
|
off_t ret = lseek(fd_.get(), pos, SEEK_SET);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
|
@ -308,7 +307,7 @@ ssize_t File::read(const Span<uint8_t> &data)
|
||||||
|
|
||||||
/* Retry in case of interrupted system calls. */
|
/* Retry in case of interrupted system calls. */
|
||||||
while (readBytes < data.size()) {
|
while (readBytes < data.size()) {
|
||||||
ret = ::read(fd_, data.data() + readBytes,
|
ret = ::read(fd_.get(), data.data() + readBytes,
|
||||||
data.size() - readBytes);
|
data.size() - readBytes);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
|
@ -345,7 +344,7 @@ ssize_t File::write(const Span<const uint8_t> &data)
|
||||||
|
|
||||||
/* Retry in case of interrupted system calls. */
|
/* Retry in case of interrupted system calls. */
|
||||||
while (writtenBytes < data.size()) {
|
while (writtenBytes < data.size()) {
|
||||||
ssize_t ret = ::write(fd_, data.data() + writtenBytes,
|
ssize_t ret = ::write(fd_.get(), data.data() + writtenBytes,
|
||||||
data.size() - writtenBytes);
|
data.size() - writtenBytes);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
|
@ -408,7 +407,7 @@ Span<uint8_t> File::map(off_t offset, ssize_t size, File::MapFlags flags)
|
||||||
if (flags & MapFlag::Private)
|
if (flags & MapFlag::Private)
|
||||||
prot |= PROT_WRITE;
|
prot |= PROT_WRITE;
|
||||||
|
|
||||||
void *map = mmap(NULL, size, prot, mmapFlags, fd_, offset);
|
void *map = mmap(NULL, size, prot, mmapFlags, fd_.get(), offset);
|
||||||
if (map == MAP_FAILED) {
|
if (map == MAP_FAILED) {
|
||||||
error_ = -errno;
|
error_ = -errno;
|
||||||
return {};
|
return {};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue