| Index: runtime/bin/file_win.cc
|
| diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
|
| index 54cd64d37d5e77f466dd9c8b9bf7acf1e96df90f..7c1268f1694ff468e91492a3c96ea3fd47a42aa2 100644
|
| --- a/runtime/bin/file_win.cc
|
| +++ b/runtime/bin/file_win.cc
|
| @@ -46,7 +46,8 @@ File::~File() {
|
|
|
| void File::Close() {
|
| ASSERT(handle_->fd() >= 0);
|
| - if (handle_->fd() == _fileno(stdout) || handle_->fd() == _fileno(stderr)) {
|
| + if ((handle_->fd() == _fileno(stdout)) ||
|
| + (handle_->fd() == _fileno(stderr))) {
|
| int fd = _open("NUL", _O_WRONLY);
|
| ASSERT(fd >= 0);
|
| _dup2(fd, handle_->fd());
|
| @@ -118,7 +119,9 @@ bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
|
| overlapped.OffsetHigh = Utils::High32Bits(start);
|
|
|
| int64_t length = end == -1 ? 0 : end - start;
|
| - if (length == 0) length = kMaxInt64;
|
| + if (length == 0) {
|
| + length = kMaxInt64;
|
| + }
|
| int32_t length_low = Utils::Low32Bits(length);
|
| int32_t length_high = Utils::High32Bits(length);
|
|
|
| @@ -155,7 +158,7 @@ int64_t File::Length() {
|
| }
|
|
|
|
|
| -File* File::Open(const char* name, FileOpenMode mode) {
|
| +File* File::FileOpenW(const wchar_t* system_name, FileOpenMode mode) {
|
| int flags = O_RDONLY | O_BINARY | O_NOINHERIT;
|
| if ((mode & kWrite) != 0) {
|
| ASSERT((mode & kWriteOnly) == 0);
|
| @@ -168,9 +171,7 @@ File* File::Open(const char* name, FileOpenMode mode) {
|
| if ((mode & kTruncate) != 0) {
|
| flags = flags | O_TRUNC;
|
| }
|
| - const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| int fd = _wopen(system_name, flags, 0666);
|
| - free(const_cast<wchar_t*>(system_name));
|
| if (fd < 0) {
|
| return NULL;
|
| }
|
| @@ -185,6 +186,25 @@ File* File::Open(const char* name, FileOpenMode mode) {
|
| }
|
|
|
|
|
| +File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
| + const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| + return FileOpenW(system_name, mode);
|
| +}
|
| +
|
| +
|
| +File* File::Open(const char* path, FileOpenMode mode) {
|
| + int path_len = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0);
|
| + wchar_t* system_name = new wchar_t[path_len];
|
| + if (system_name == NULL) {
|
| + return NULL;
|
| + }
|
| + MultiByteToWideChar(CP_UTF8, 0, path, -1, system_name, path_len);
|
| + File* file = FileOpenW(system_name, mode);
|
| + delete[] system_name;
|
| + return file;
|
| +}
|
| +
|
| +
|
| File* File::OpenStdio(int fd) {
|
| switch (fd) {
|
| case 1:
|
| @@ -205,7 +225,6 @@ bool File::Exists(const char* name) {
|
| struct __stat64 st;
|
| const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| bool stat_status = _wstat64(system_name, &st);
|
| - free(const_cast<wchar_t*>(system_name));
|
| if (stat_status == 0) {
|
| return ((st.st_mode & S_IFMT) == S_IFREG);
|
| } else {
|
| @@ -217,7 +236,6 @@ bool File::Exists(const char* name) {
|
| bool File::Create(const char* name) {
|
| const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| int fd = _wopen(system_name, O_RDONLY | O_CREAT, 0666);
|
| - free(const_cast<wchar_t*>(system_name));
|
| if (fd < 0) {
|
| return false;
|
| }
|
| @@ -264,10 +282,9 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
| const wchar_t* name = StringUtilsWin::Utf8ToWide(utf8_name);
|
| int create_status = CreateDirectoryW(name, NULL);
|
| // If the directory already existed, treat it as a success.
|
| - if (create_status == 0 &&
|
| - (GetLastError() != ERROR_ALREADY_EXISTS ||
|
| - (GetFileAttributesW(name) & FILE_ATTRIBUTE_DIRECTORY) != 0)) {
|
| - free(const_cast<wchar_t*>(name));
|
| + if ((create_status == 0) &&
|
| + ((GetLastError() != ERROR_ALREADY_EXISTS) ||
|
| + ((GetFileAttributesW(name) & FILE_ATTRIBUTE_DIRECTORY) != 0))) {
|
| return false;
|
| }
|
|
|
| @@ -279,7 +296,6 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
| OPEN_EXISTING,
|
| FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
|
| NULL);
|
| - free(const_cast<wchar_t*>(name));
|
| if (dir_handle == INVALID_HANDLE_VALUE) {
|
| return false;
|
| }
|
| @@ -287,7 +303,6 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
| const wchar_t* target = StringUtilsWin::Utf8ToWide(utf8_target);
|
| int target_len = wcslen(target);
|
| if (target_len > MAX_PATH - 1) {
|
| - free(const_cast<wchar_t*>(target));
|
| CloseHandle(dir_handle);
|
| return false;
|
| }
|
| @@ -295,7 +310,8 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
| int reparse_data_buffer_size =
|
| sizeof REPARSE_DATA_BUFFER + 2 * MAX_PATH * sizeof WCHAR;
|
| REPARSE_DATA_BUFFER* reparse_data_buffer =
|
| - static_cast<REPARSE_DATA_BUFFER*>(calloc(reparse_data_buffer_size, 1));
|
| + reinterpret_cast<REPARSE_DATA_BUFFER*>(Dart_ScopeAllocate(
|
| + reparse_data_buffer_size));
|
| reparse_data_buffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
|
| wcscpy(reparse_data_buffer->MountPointReparseBuffer.PathBuffer, target);
|
| wcscpy(
|
| @@ -320,9 +336,9 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
| 0,
|
| &dummy_received_bytes,
|
| NULL);
|
| - if (CloseHandle(dir_handle) == 0) return false;
|
| - free(const_cast<wchar_t*>(target));
|
| - free(reparse_data_buffer);
|
| + if (CloseHandle(dir_handle) == 0) {
|
| + return false;
|
| + }
|
| return (result != 0);
|
| }
|
|
|
| @@ -330,7 +346,6 @@ bool File::CreateLink(const char* utf8_name, const char* utf8_target) {
|
| bool File::Delete(const char* name) {
|
| const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| int status = _wremove(system_name);
|
| - free(const_cast<wchar_t*>(system_name));
|
| return status != -1;
|
| }
|
|
|
| @@ -346,7 +361,6 @@ bool File::DeleteLink(const char* name) {
|
| } else {
|
| SetLastError(ERROR_NOT_A_REPARSE_POINT);
|
| }
|
| - free(const_cast<wchar_t*>(system_name));
|
| return result;
|
| }
|
|
|
| @@ -359,8 +373,6 @@ bool File::Rename(const char* old_path, const char* new_path) {
|
| DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
|
| int move_status =
|
| MoveFileExW(system_old_path, system_new_path, flags);
|
| - free(const_cast<wchar_t*>(system_old_path));
|
| - free(const_cast<wchar_t*>(system_new_path));
|
| return (move_status != 0);
|
| } else {
|
| SetLastError(ERROR_FILE_NOT_FOUND);
|
| @@ -377,8 +389,6 @@ bool File::RenameLink(const char* old_path, const char* new_path) {
|
| DWORD flags = MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING;
|
| int move_status =
|
| MoveFileExW(system_old_path, system_new_path, flags);
|
| - free(const_cast<wchar_t*>(system_old_path));
|
| - free(const_cast<wchar_t*>(system_new_path));
|
| return (move_status != 0);
|
| } else {
|
| SetLastError(ERROR_FILE_NOT_FOUND);
|
| @@ -398,8 +408,6 @@ bool File::Copy(const char* old_path, const char* new_path) {
|
| NULL,
|
| NULL,
|
| 0) != 0;
|
| - free(const_cast<wchar_t*>(system_old_path));
|
| - free(const_cast<wchar_t*>(system_new_path));
|
| return success;
|
| } else {
|
| SetLastError(ERROR_FILE_NOT_FOUND);
|
| @@ -412,7 +420,6 @@ int64_t File::LengthFromPath(const char* name) {
|
| struct __stat64 st;
|
| const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| int stat_status = _wstat64(system_name, &st);
|
| - free(const_cast<wchar_t*>(system_name));
|
| if (stat_status == 0) {
|
| return st.st_size;
|
| }
|
| @@ -420,7 +427,7 @@ int64_t File::LengthFromPath(const char* name) {
|
| }
|
|
|
|
|
| -char* File::LinkTarget(const char* pathname) {
|
| +const char* File::LinkTarget(const char* pathname) {
|
| const wchar_t* name = StringUtilsWin::Utf8ToWide(pathname);
|
| HANDLE dir_handle = CreateFileW(
|
| name,
|
| @@ -430,15 +437,14 @@ char* File::LinkTarget(const char* pathname) {
|
| OPEN_EXISTING,
|
| FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
|
| NULL);
|
| - free(const_cast<wchar_t*>(name));
|
| if (dir_handle == INVALID_HANDLE_VALUE) {
|
| return NULL;
|
| }
|
|
|
| int buffer_size =
|
| sizeof REPARSE_DATA_BUFFER + 2 * (MAX_PATH + 1) * sizeof WCHAR;
|
| - REPARSE_DATA_BUFFER* buffer =
|
| - static_cast<REPARSE_DATA_BUFFER*>(calloc(buffer_size, 1));
|
| + REPARSE_DATA_BUFFER* buffer = reinterpret_cast<REPARSE_DATA_BUFFER*>(
|
| + Dart_ScopeAllocate(buffer_size));
|
| DWORD received_bytes; // Value is not used.
|
| int result = DeviceIoControl(
|
| dir_handle,
|
| @@ -453,11 +459,9 @@ char* File::LinkTarget(const char* pathname) {
|
| DWORD error = GetLastError();
|
| CloseHandle(dir_handle);
|
| SetLastError(error);
|
| - free(buffer);
|
| return NULL;
|
| }
|
| if (CloseHandle(dir_handle) == 0) {
|
| - free(buffer);
|
| return NULL;
|
| }
|
|
|
| @@ -473,7 +477,6 @@ char* File::LinkTarget(const char* pathname) {
|
| target_offset = buffer->SymbolicLinkReparseBuffer.SubstituteNameOffset;
|
| target_length = buffer->SymbolicLinkReparseBuffer.SubstituteNameLength;
|
| } else { // Not a junction or a symbolic link.
|
| - free(buffer);
|
| SetLastError(ERROR_NOT_A_REPARSE_POINT);
|
| return NULL;
|
| }
|
| @@ -482,7 +485,7 @@ char* File::LinkTarget(const char* pathname) {
|
| target_length /= sizeof(wchar_t);
|
| target += target_offset;
|
| // Remove "\??\" from beginning of target.
|
| - if (target_length > 4 && wcsncmp(L"\\??\\", target, 4) == 0) {
|
| + if ((target_length > 4) && (wcsncmp(L"\\??\\", target, 4) == 0)) {
|
| target += 4;
|
| target_length -= 4;
|
| }
|
| @@ -494,7 +497,7 @@ char* File::LinkTarget(const char* pathname) {
|
| 0,
|
| NULL,
|
| NULL);
|
| - char* utf8_target = reinterpret_cast<char*>(malloc(utf8_length + 1));
|
| + char* utf8_target = DartUtils::ScopedCString(utf8_length + 1);
|
| if (0 == WideCharToMultiByte(CP_UTF8,
|
| 0,
|
| target,
|
| @@ -503,12 +506,9 @@ char* File::LinkTarget(const char* pathname) {
|
| utf8_length,
|
| NULL,
|
| NULL)) {
|
| - free(buffer);
|
| - free(utf8_target);
|
| return NULL;
|
| }
|
| utf8_target[utf8_length] = '\0';
|
| - free(buffer);
|
| return utf8_target;
|
| }
|
|
|
| @@ -520,7 +520,6 @@ void File::Stat(const char* name, int64_t* data) {
|
| struct _stat64 st;
|
| const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| int stat_status = _wstat64(system_name, &st);
|
| - free(const_cast<wchar_t*>(system_name));
|
| if (stat_status == 0) {
|
| data[kCreatedTime] = st.st_ctime * 1000;
|
| data[kModifiedTime] = st.st_mtime * 1000;
|
| @@ -538,7 +537,6 @@ time_t File::LastModified(const char* name) {
|
| struct __stat64 st;
|
| const wchar_t* system_name = StringUtilsWin::Utf8ToWide(name);
|
| int stat_status = _wstat64(system_name, &st);
|
| - free(const_cast<wchar_t*>(system_name));
|
| if (stat_status == 0) {
|
| return st.st_mtime;
|
| }
|
| @@ -548,14 +546,16 @@ time_t File::LastModified(const char* name) {
|
|
|
| bool File::IsAbsolutePath(const char* pathname) {
|
| // Should we consider network paths?
|
| - if (pathname == NULL) return false;
|
| + if (pathname == NULL) {
|
| + return false;
|
| + }
|
| return (strlen(pathname) > 2) &&
|
| (pathname[1] == ':') &&
|
| (pathname[2] == '\\' || pathname[2] == '/');
|
| }
|
|
|
|
|
| -char* File::GetCanonicalPath(const char* pathname) {
|
| +const char* File::GetCanonicalPath(const char* pathname) {
|
| const wchar_t* system_name = StringUtilsWin::Utf8ToWide(pathname);
|
| HANDLE file_handle = CreateFileW(
|
| system_name,
|
| @@ -566,7 +566,6 @@ char* File::GetCanonicalPath(const char* pathname) {
|
| FILE_FLAG_BACKUP_SEMANTICS,
|
| NULL);
|
| if (file_handle == INVALID_HANDLE_VALUE) {
|
| - free(const_cast<wchar_t*>(system_name));
|
| return NULL;
|
| }
|
| wchar_t dummy_buffer[1];
|
| @@ -575,14 +574,14 @@ char* File::GetCanonicalPath(const char* pathname) {
|
| 0,
|
| VOLUME_NAME_DOS);
|
| if (required_size == 0) {
|
| - free(const_cast<wchar_t*>(system_name));
|
| DWORD error = GetLastError();
|
| CloseHandle(file_handle);
|
| SetLastError(error);
|
| return NULL;
|
| }
|
| - wchar_t* path =
|
| - static_cast<wchar_t*>(malloc(required_size * sizeof(wchar_t)));
|
| + wchar_t* path;
|
| + path = reinterpret_cast<wchar_t*>(
|
| + Dart_ScopeAllocate(required_size * sizeof(*path)));
|
| int result_size = GetFinalPathNameByHandle(file_handle,
|
| path,
|
| required_size,
|
| @@ -590,16 +589,14 @@ char* File::GetCanonicalPath(const char* pathname) {
|
| ASSERT(result_size <= required_size - 1);
|
| // Remove leading \\?\ if possible, unless input used it.
|
| char* result;
|
| - if (result_size < MAX_PATH - 1 + 4 &&
|
| - result_size > 4 &&
|
| - wcsncmp(path, L"\\\\?\\", 4) == 0 &&
|
| - wcsncmp(system_name, L"\\\\?\\", 4) != 0) {
|
| + if ((result_size < MAX_PATH - 1 + 4) &&
|
| + (result_size > 4) &&
|
| + (wcsncmp(path, L"\\\\?\\", 4) == 0) &&
|
| + (wcsncmp(system_name, L"\\\\?\\", 4) != 0)) {
|
| result = StringUtilsWin::WideToUtf8(path + 4);
|
| } else {
|
| result = StringUtilsWin::WideToUtf8(path);
|
| }
|
| - free(const_cast<wchar_t*>(system_name));
|
| - free(path);
|
| CloseHandle(file_handle);
|
| return result;
|
| }
|
| @@ -652,7 +649,6 @@ File::Type File::GetType(const char* pathname, bool follow_links) {
|
| } else if ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0) {
|
| result = kIsDirectory;
|
| }
|
| - free(const_cast<wchar_t*>(name));
|
| return result;
|
| }
|
|
|
| @@ -671,10 +667,8 @@ File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
|
| FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
|
| NULL);
|
| if (file_handle == INVALID_HANDLE_VALUE) {
|
| - free(const_cast<wchar_t*>(wide_name));
|
| return File::kError;
|
| }
|
| - free(const_cast<wchar_t*>(wide_name));
|
| int result = GetFileInformationByHandle(file_handle, &file_info[i]);
|
| if (result == 0) {
|
| DWORD error = GetLastError();
|
| @@ -686,9 +680,10 @@ File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
|
| return File::kError;
|
| }
|
| }
|
| - if (file_info[0].dwVolumeSerialNumber == file_info[1].dwVolumeSerialNumber &&
|
| - file_info[0].nFileIndexHigh == file_info[1].nFileIndexHigh &&
|
| - file_info[0].nFileIndexLow == file_info[1].nFileIndexLow) {
|
| + if ((file_info[0].dwVolumeSerialNumber ==
|
| + file_info[1].dwVolumeSerialNumber) &&
|
| + (file_info[0].nFileIndexHigh == file_info[1].nFileIndexHigh) &&
|
| + (file_info[0].nFileIndexLow == file_info[1].nFileIndexLow)) {
|
| return kIdentical;
|
| } else {
|
| return kDifferent;
|
|
|