@@ -14,10 +14,11 @@ * file. */ #include "config.h" +#include #include /* Work around __block being used by glibc */ #ifdef __GLIBC__ # undef __USE_XOPEN @@ -454,20 +455,27 @@ #else DWORD ret; #endif #ifndef _WIN32 - if (_readPipe[0] == -1 || _atEndOfStream || - (ret = read(_readPipe[0], buffer, length)) < 0) + if (_readPipe[0] == -1 || _atEndOfStream) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length]; + + if ((ret = read(_readPipe[0], buffer, length)) < 0) + @throw [OFReadFailedException exceptionWithObject: self + requestedLength: length + errNo: errno]; #else if (length > UINT32_MAX) @throw [OFOutOfRangeException exception]; - if (_readPipe[0] == NULL || _atEndOfStream || - !ReadFile(_readPipe[0], buffer, (DWORD)length, &ret, NULL)) { + if (_readPipe[0] == NULL || _atEndOfStream) + @throw [OFReadFailedException exceptionWithObject: self + requestedLength: length]; + + if (!ReadFile(_readPipe[0], buffer, (DWORD)length, &ret, NULL)) { if (GetLastError() == ERROR_BROKEN_PIPE) { _atEndOfStream = true; return 0; } @@ -484,25 +492,39 @@ - (void)lowlevelWriteBuffer: (const void*)buffer length: (size_t)length { #ifndef _WIN32 - if (_writePipe[1] == -1 || _atEndOfStream || - write(_writePipe[1], buffer, length) < length) + if (_writePipe[1] == -1 || _atEndOfStream) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length]; + + if (write(_writePipe[1], buffer, length) < length) + @throw [OFWriteFailedException exceptionWithObject: self + requestedLength: length + errNo: errno]; #else DWORD ret; if (length > UINT32_MAX) @throw [OFOutOfRangeException exception]; - if (_writePipe[1] == NULL || _atEndOfStream || - !WriteFile(_writePipe[1], buffer, (DWORD)length, &ret, NULL) || - ret < length) + if (_writePipe[1] == NULL || _atEndOfStream) @throw [OFWriteFailedException exceptionWithObject: self requestedLength: length]; + + if (!WriteFile(_writePipe[1], buffer, (DWORD)length, &ret, NULL) || + ret < length) { + int errNo = 0; + + if (GetLastError() == ERROR_BROKEN_PIPE) + errNo = EPIPE; + + @throw [OFWriteFailedException exceptionWithObject: self + requestedLength: length + errNo: errNo]; + } #endif } - (int)fileDescriptorForReading {