]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/handle.cpp
Move some common operations to helper functions
[libs/core.git] / source / io / handle.cpp
index d5183e5b4a349d286f9858e85c3c28234ac5970f..0e9b82aa000c9382fe954b764f36d6614710934e 100644 (file)
@@ -1,3 +1,6 @@
+#include <cerrno>
+#include <unistd.h>
+#include <msp/core/systemerror.h>
 #include "handle.h"
 #include "handle_private.h"
 
@@ -49,5 +52,55 @@ Handle::Private &Handle::Private::operator=(H h)
        return *this;
 }
 
+
+unsigned sys_read(Handle &handle, char *buf, unsigned size)
+{
+#ifdef WIN32
+       DWORD ret;
+       if(ReadFile(*handle, buf, size, &ret, 0)==0)
+               throw system_error("ReadFile");
+#else
+       int ret = read(*handle, buf, size);
+       if(ret==-1)
+       {
+               if(errno==EAGAIN)
+                       return 0;
+               else
+                       throw system_error("read");
+       }
+#endif
+
+       return ret;
+}
+
+unsigned sys_write(Handle &handle, const char *buf, unsigned size)
+{
+#ifdef WIN32
+       DWORD ret;
+       if(WriteFile(*handle, buf, size, &ret, 0)==0)
+               throw system_error("WriteFile");
+#else
+       int ret = write(*handle, buf, size);
+       if(ret==-1)
+       {
+               if(errno==EAGAIN)
+                       return 0;
+               else
+                       throw system_error("write");
+       }
+#endif
+
+       return ret;
+}
+
+void sys_close(Handle &handle)
+{
+#ifdef WIN32
+       CloseHandle(*handle);
+#else
+       close(*handle);
+#endif
+}
+
 } // namespace IO
 } // namespace Msp