@@ -262,24 +262,49 @@ if ((flags = parseMode([mode UTF8String], &handle.append)) == -1) @throw [OFInvalidArgumentException exception]; if ((handle.handle = Open([path cStringWithEncoding: - [OFLocalization encoding]], flags)) == 0) + [OFLocalization encoding]], flags)) == 0) { + int errNo; + + switch (IoErr()) { + case ERROR_OBJECT_IN_USE: + case ERROR_DISK_NOT_VALIDATED: + errNo = EBUSY; + break; + case ERROR_OBJECT_NOT_FOUND: + errNo = ENOENT; + break; + case ERROR_DISK_WRITE_PROTECTED: + errNo = EROFS; + break; + case ERROR_WRITE_PROTECTED: + case ERROR_READ_PROTECTED: + errNo = EACCES; + break; + default: + errNo = 0; + break; + } + @throw [OFOpenItemFailedException exceptionWithPath: path - mode: mode]; + mode: mode + errNo: errNo]; + } [openHandles addItem: &handle.handle]; handle.index = [openHandles count] - 1; if (handle.append) { if (Seek64(handle.handle, 0, OFFSET_END) == -1) { closeHandle(handle); @throw [OFOpenItemFailedException exceptionWithPath: path - mode: mode]; + mode: mode + errNo: EIO]; } } #endif objc_autoreleasePoolPop(pool); @@ -335,11 +360,12 @@ if (length > LONG_MAX) @throw [OFOutOfRangeException exception]; if ((ret = Read(_handle.handle, buffer, length)) < 0) @throw [OFReadFailedException exceptionWithObject: self - requestedLength: length]; + requestedLength: length + errNo: EIO]; #else if ((ret = read(_handle, buffer, length)) < 0) @throw [OFReadFailedException exceptionWithObject: self requestedLength: length errNo: errno]; @@ -371,16 +397,18 @@ if (_handle.append) { if (Seek64(_handle.handle, 0, OFFSET_END) == -1) @throw [OFWriteFailedException exceptionWithObject: self - requestedLength: length]; + requestedLength: length + errNo: EIO]; } if (Write(_handle.handle, (void *)buffer, length) != (LONG)length) @throw [OFWriteFailedException exceptionWithObject: self - requestedLength: length]; + requestedLength: length + errNo: EIO]; #else if (length > SSIZE_MAX) @throw [OFOutOfRangeException exception]; if (write(_handle, buffer, length) != (ssize_t)length) @@ -429,11 +457,12 @@ } if (ret == -1) @throw [OFSeekFailedException exceptionWithStream: self offset: offset - whence: whence]; + whence: whence + errNo: EINVAL]; #endif _atEndOfStream = false; return ret;