#include "unix++.h"
#include <Security/debugging.h>
namespace Security {
namespace UnixPlusPlus {
void FileDesc::open(const char *path, int flags, mode_t mode)
{
checkSetFd(::open(path, flags, mode));
mAtEnd = false;
secdebug("unixio", "open(%s,0x%x,0x%x) = %d", path, flags, mode, mFd);
}
void FileDesc::close()
{
if (mFd >= 0) {
checkError(::close(mFd));
secdebug("unixio", "close(%d)", mFd);
mFd = invalidFd;
}
}
size_t FileDesc::read(void *addr, size_t length)
{
switch (ssize_t rc = ::read(mFd, addr, length)) {
case 0: if (length == 0) { secdebug("unixio", "%d zero read (ignored)", mFd);
return 0;
}
mAtEnd = true;
secdebug("unixio", "%d end of data", mFd);
return 0;
case -1: if (errno == EAGAIN)
return 0; UnixError::throwMe(); default: return rc;
}
}
size_t FileDesc::write(const void *addr, size_t length)
{
ssize_t rc = ::write(mFd, addr, length);
if (rc == -1) {
if (errno == EAGAIN)
return 0;
UnixError::throwMe();
}
return rc;
}
off_t FileDesc::seek(off_t position, int whence)
{
off_t rc = ::lseek(mFd, position, whence);
if (rc == -1)
UnixError::throwMe();
return rc;
}
void *FileDesc::mmap(int prot, size_t length, int flags, off_t offset, void *addr)
{
void *result = ::mmap(addr, length ? length : fileSize(), prot, flags, mFd, offset);
if (result == MAP_FAILED)
UnixError::throwMe();
return result;
}
int FileDesc::fcntl(int cmd, int arg) const
{
int rc = ::fcntl(mFd, cmd, arg);
secdebug("unixio", "%d fcntl(%d,%d) = %d", mFd, cmd, arg, rc);
if (rc == -1)
UnixError::throwMe();
return rc;
}
int FileDesc::fcntl(int cmd, void *arg) const
{
assert(sizeof(void *) <= sizeof(int));
return fcntl(cmd, reinterpret_cast<int>(arg));
}
int FileDesc::flags() const
{
int flags = fcntl(F_GETFL);
if (flags == -1)
UnixError::throwMe();
return flags;
}
void FileDesc::flags(int flags) const
{
if (fcntl(F_SETFL, flags) == -1)
UnixError::throwMe();
}
void FileDesc::setFlag(int flag, bool on) const
{
if (flag) { int oldFlags = flags();
flags(on ? (oldFlags | flag) : (oldFlags & ~flag));
}
}
int FileDesc::ioctl(int cmd, void *arg) const
{
int rc = ::ioctl(mFd, cmd, arg);
if (rc == -1)
UnixError::throwMe();
return rc;
}
void FileDesc::fstat(UnixStat &st) const
{
if (::fstat(mFd, &st))
UnixError::throwMe();
}
size_t FileDesc::fileSize() const
{
struct stat st;
fstat(st);
return st.st_size;
}
FILE *FileDesc::fdopen(const char *form)
{
return ::fdopen(mFd, form);
}
SigSet sigMask(SigSet set, int how )
{
sigset_t old;
checkError(::sigprocmask(how, &set.value(), &old));
return old;
}
} }