From f54cb6ab942ec716299d13c8f9d539b77b54b30b Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 17 Mar 2012 15:35:45 +0100 Subject: [PATCH] Added EAGAIN and made read(1) and write(1) retry if they get it. --- libmaxsi/decl/errno_values.h | 1 + libmaxsi/error.cpp | 1 + libmaxsi/io.cpp | 10 ++++++++-- 3 files changed, 10 insertions(+), 2 deletions(-) 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)