22 if (read_mode && write_mode) {
23 return O_RDWR | O_CREAT;
29 return O_WRONLY | O_CREAT;
37 open(file,i_flags,perm);
46OksSystem::Descriptor::operator int()
const throw() {
59 bool alreadyExists = file->exists();
60 m_fd = ::open(*file,i_flags,perm);
61 m_name = file->full_name();
62 if (m_fd<0)
throw OksSystem::OpenFileIssue(
ERS_HERE, errno, m_name.c_str() );
63 if((alreadyExists ==
false) && ((i_flags & O_CREAT) != 0)) {
74 const int status = ::close(m_fd);
76 throw OksSystem::CloseFileIssue(
ERS_HERE, errno, m_name.c_str() );
87 const int status = ::close(m_fd);
94 ssize_t status = ::read(m_fd,buffer,number);
95 if (status<0)
throw OksSystem::ReadIssue(
ERS_HERE, errno, m_name.c_str() );
101 ssize_t status = ::write(m_fd,buffer,number);
102 if (status<0)
throw OksSystem::WriteIssue(
ERS_HERE, errno, m_name.c_str() );
116 bool success =
false;
119 int oldFlags = ::fcntl(m_fd, F_GETFD);
121 int newFlags = ::fcntl(m_fd, F_SETFD, oldFlags|FD_CLOEXEC);
132 std::string eMsg =
"File descriptor for file " + m_name +
133 " will not be closed after exec. Reason: " + std::string(::strerror(storeErrno));
134 throw OksSystem::OksSystemCallIssue(
ERS_HERE, storeErrno,
"fcntl", eMsg.c_str());
#define ERS_ASSERT(expression)
Descriptor(const File *file, int flags, mode_t perm)
int read(void *buffer, size_t number) const
int fd() const
file descritptor
static int flags(bool read_mode, bool write_mode)
void open(const File *file, int flags, mode_t perm)
internal open method
void closeOnExec()
It flags the file descriptor to be closed after any call to the exec okssystem function.
void close()
close the descriptor
void close_safe()
close the descriptor no exception
int write(const void *buffer, size_t number) const
Wrapper for file operations.
void warning(const Issue &issue)