| Index: runtime/bin/file.cc
|
| diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
|
| index 093ff4d4655fa7d49f9f64d5a08a1ac85e838c2c..ea50e4f86ed5059a3b06e666f542417a71c7502d 100644
|
| --- a/runtime/bin/file.cc
|
| +++ b/runtime/bin/file.cc
|
| @@ -72,8 +72,14 @@ void FUNCTION_NAME(File_Open)(Dart_NativeArguments args) {
|
| // files. Directories can be opened for reading using the posix
|
| // 'open' call.
|
| File* file = NULL;
|
| - if (((file_mode & File::kWrite) != 0) || File::Exists(filename)) {
|
| - file = File::Open(filename, file_mode);
|
| + OSError os_error;
|
| + file = File::Open(filename, file_mode, &os_error);
|
| + if (file == NULL) {
|
| + Dart_Handle os_error_handle = Dart_GetNativeArgument(args, 2);
|
| + DartUtils::SetIntegerInstanceField(
|
| + os_error_handle, "errorCode", os_error.errno_);
|
| + DartUtils::SetStringInstanceField(
|
| + os_error_handle, "message", os_error.strerror_);
|
| }
|
| Dart_SetReturnValue(args, Dart_NewInteger(reinterpret_cast<intptr_t>(file)));
|
| Dart_ExitScope();
|
| @@ -413,9 +419,18 @@ static CObject* FileCreateRequest(const CObjectArray& request) {
|
| return CObject::False();
|
| }
|
|
|
| +static CObject* MakeOsError(OSError os_error) {
|
| + CObject* error_message =
|
| + new CObjectString(CObject::NewString(os_error.strerror_));
|
| + CObjectArray* result = new CObjectArray(CObject::NewArray(2));
|
| + result->SetAt(0, new CObjectInt32(CObject::NewInt32(os_error.errno_)));
|
| + result->SetAt(1, error_message);
|
| + return result;
|
| +}
|
|
|
| static CObject* FileOpenRequest(const CObjectArray& request) {
|
| File* file = NULL;
|
| + OSError os_error;
|
| if (request.Length() == 3 &&
|
| request[1]->IsString() &&
|
| request[2]->IsInt32()) {
|
| @@ -424,12 +439,14 @@ static CObject* FileOpenRequest(const CObjectArray& request) {
|
| File::DartFileOpenMode dart_file_mode =
|
| static_cast<File::DartFileOpenMode>(mode.Value());
|
| File::FileOpenMode file_mode = File::DartModeToFileMode(dart_file_mode);
|
| - if (((file_mode & File::kWrite) != 0) || File::Exists(filename.CString())) {
|
| - file = File::Open(filename.CString(), file_mode);
|
| - }
|
| + file = File::Open(filename.CString(), file_mode, &os_error);
|
| + }
|
| + if (file != NULL) {
|
| + return new CObjectIntptr(
|
| + CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
|
| + } else {
|
| + return MakeOsError(os_error);
|
| }
|
| - return new CObjectIntptr(
|
| - CObject::NewIntptr(reinterpret_cast<intptr_t>(file)));
|
| }
|
|
|
|
|
|
|