1*73030639SEd Tanous #include <fcntl.h> 2*73030639SEd Tanous #include <unistd.h> 3*73030639SEd Tanous 4*73030639SEd Tanous #include <FileHandle.hpp> 5*73030639SEd Tanous 6*73030639SEd Tanous #include <iostream> 7*73030639SEd Tanous #include <stdexcept> 8*73030639SEd Tanous 9*73030639SEd Tanous FileHandle::FileHandle(const std::filesystem::path& name, 10*73030639SEd Tanous std::ios_base::openmode mode) : 11*73030639SEd Tanous // NOLINTNEXTLINE(cppcoreguidelines-pro-type-vararg) 12*73030639SEd Tanous fd(open(name.c_str(), mode)) 13*73030639SEd Tanous { 14*73030639SEd Tanous if (fd < 0) 15*73030639SEd Tanous { 16*73030639SEd Tanous throw std::out_of_range(name.string() + " failed to open"); 17*73030639SEd Tanous } 18*73030639SEd Tanous } 19*73030639SEd Tanous 20*73030639SEd Tanous FileHandle::FileHandle(int fdIn) : fd(fdIn){}; 21*73030639SEd Tanous 22*73030639SEd Tanous FileHandle::FileHandle(FileHandle&& in) noexcept 23*73030639SEd Tanous { 24*73030639SEd Tanous fd = in.fd; 25*73030639SEd Tanous in.fd = -1; 26*73030639SEd Tanous } 27*73030639SEd Tanous 28*73030639SEd Tanous FileHandle& FileHandle::operator=(FileHandle&& in) noexcept 29*73030639SEd Tanous { 30*73030639SEd Tanous fd = in.fd; 31*73030639SEd Tanous in.fd = -1; 32*73030639SEd Tanous return *this; 33*73030639SEd Tanous } 34*73030639SEd Tanous 35*73030639SEd Tanous FileHandle::~FileHandle() 36*73030639SEd Tanous { 37*73030639SEd Tanous if (fd) 38*73030639SEd Tanous { 39*73030639SEd Tanous int r = close(fd); 40*73030639SEd Tanous if (r < 0) 41*73030639SEd Tanous { 42*73030639SEd Tanous std::cerr << "Failed to close fd " << std::to_string(fd); 43*73030639SEd Tanous } 44*73030639SEd Tanous } 45*73030639SEd Tanous } 46*73030639SEd Tanous 47*73030639SEd Tanous int FileHandle::handle() 48*73030639SEd Tanous { 49*73030639SEd Tanous return fd; 50*73030639SEd Tanous } 51