Added EAGAIN and made read(1) and write(1) retry if they get it.

This commit is contained in:
Jonas 'Sortie' Termansen 2012-03-17 15:35:45 +01:00
parent 1ff0321400
commit f54cb6ab94
3 changed files with 10 additions and 2 deletions

View File

@ -32,6 +32,7 @@
#define EILSEQ 40
#define ELAKE 41
#define EMFILE 42
#define EAGAIN 43
#define EOPNOTSUPP ENOTSUP

View File

@ -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";
}
}

View File

@ -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)