// Truck Computer Dooom! // // Douglas Thrift // // $Id$ #ifndef _posix_hpp_ #define _posix_hpp_ #include #include #include #include #include namespace Posix { inline int CheckError(int status); class Error : public std::exception { int code; char message[1024]; public: Error(); Error(int code); virtual ~Error() throw() {} virtual const char *what() const throw() { return message; } }; inline int CheckError(int status) { if (status == -1) throw Error(); return status; } #define _SysCall(call) \ int status; \ \ while ((status = call) == -1) \ if (errno != EINTR) \ throw Error(); \ else \ continue; \ \ return status template int SysCall(Function_ function, Arg0_ arg0) { _SysCall(function(arg0)); } template int SysCall(Function_ function, Arg0_ arg0, Arg1_ arg1) { _SysCall(function(arg0, arg1)); } template int SysCall(Function_ function, Arg0_ arg0, Arg1_ arg1, Arg2_ arg2) { _SysCall(function(arg0, arg1, arg2)); } #undef _SysCall int Open(const std::string &path, int flags, ::mode_t mode); inline int Open(const std::string &path, int flags) { return Open(path, flags, 0); } void Close(int fd); size_t Read(int fd, void *buffer, size_t bytes); size_t ReadMost(int fd, void *buffer, size_t bytes); size_t Write(int fd, const void *buffer, size_t bytes); int SigAction(int signal, const struct sigaction *action, struct sigaction *old); int SigEmptySet(sigset_t *set); int SigFillSet(sigset_t *set); int SigAddSet(sigset_t *set, int signal); int SigDelSet(sigset_t *set, int signal); int SigIsMember(const sigset_t *set, int signal); } #endif//_posix_hpp_