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))); |
} |