// Truck Computer Dooom! // // Douglas Thrift // // $Id$ #ifdef _GNU_SOURCE #undef _GNU_SOURCE #endif #define _XOPEN_SOURCE 600 #include #include "posix.hpp" namespace Posix { Error::Error() : code(errno) { CheckError(::strerror_r(code, message, sizeof (message))); } Error::Error(int code) : code(code) { CheckError(::strerror_r(code, message, sizeof (message))); } int Open(const std::string &path, int flags, ::mode_t mode) { return SysCall(::open, path.c_str(), flags, mode); } void Close(int fd) { SysCall(::close, fd); } size_t Read(int fd, void *buffer, size_t bytes) { return SysCall(::read, fd, buffer, bytes); } size_t ReadMost(int fd, void *buffer, size_t bytes) { size_t rest(bytes); uint8_t *data = reinterpret_cast(buffer); while (rest != 0) { size_t read(Read(fd, data, rest)); if (read == 0) return bytes - rest; data += read; rest -= read; } return bytes; } size_t Write(int fd, const void *buffer, size_t bytes) { return SysCall(::write, fd, buffer, bytes); } int SigAction(int signal, const struct sigaction *action, struct sigaction *old) { return SysCall(::sigaction, signal, action, old); } int SigEmptySet(sigset_t *set) { return SysCall(::sigemptyset, set); } int SigFillSet(sigset_t *set) { return SysCall(::sigfillset, set); } int SigAddSet(sigset_t *set, int signal) { return SysCall(::sigaddset, set, signal); } int SigDelSet(sigset_t *set, int signal) { return SysCall(::sigdelset, set, signal); } int SigIsMember(const sigset_t *set, int signal) { return SysCall(::sigismember, set, signal); } }