diff --git a/libmaxsi/decl/errno_values.h b/libmaxsi/decl/errno_values.h index 7c0cd67a..1c78d881 100644 --- a/libmaxsi/decl/errno_values.h +++ b/libmaxsi/decl/errno_values.h @@ -32,6 +32,7 @@ #define EILSEQ 40 #define ELAKE 41 #define EMFILE 42 +#define EAGAIN 43 #define EOPNOTSUPP ENOTSUP diff --git a/libmaxsi/error.cpp b/libmaxsi/error.cpp index 8e1b8259..ac6d6798 100644 --- a/libmaxsi/error.cpp +++ b/libmaxsi/error.cpp @@ -80,6 +80,7 @@ namespace Maxsi case EILSEQ: return (char*) "Illegal byte sequence"; case ELAKE: return (char*) "Sit by a lake"; case EMFILE: return (char*) "Too many open files"; + case EAGAIN: return (char*) "Resource temporarily unavailable"; default: return (char*) "Unknown error condition"; } } diff --git a/libmaxsi/io.cpp b/libmaxsi/io.cpp index c94ca1c7..9f42b8c5 100644 --- a/libmaxsi/io.cpp +++ b/libmaxsi/io.cpp @@ -214,12 +214,18 @@ namespace Maxsi extern "C" ssize_t read(int fd, void* buf, size_t count) { - return SysRead(fd, buf, count); +retry: + ssize_t result = SysRead(fd, buf, count); + if ( result < 0 && errno == EAGAIN ) { goto retry; } + return result; } extern "C" ssize_t write(int fd, const void* buf, size_t count) { - return SysWrite(fd, buf, count); +retry: + ssize_t result = SysWrite(fd, buf, count); + if ( result < 0 && errno == EAGAIN ) { goto retry; } + return result; } extern "C" int writeall(int fd, const void* buffer, size_t len)