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:
Hirokazu Honda 2021-06-10 16:50:20 +09:00 committed by Laurent Pinchart
parent a59c471e5a
commit edd70612e5
2 changed files with 15 additions and 15 deletions

View file

@ -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_;

View file

@ -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 {};