| // Copyright 2016 The Bazel Authors. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include <windows.h> |
| |
| #include <memory> |
| |
| #include "src/main/native/windows_file_operations.h" |
| #include "src/main/native/windows_util.h" |
| |
| namespace windows_util { |
| |
| using std::unique_ptr; |
| |
| int IsJunctionOrDirectorySymlink(const WCHAR* path) { |
| DWORD attrs = ::GetFileAttributesW(path); |
| if (attrs == INVALID_FILE_ATTRIBUTES) { |
| return IS_JUNCTION_ERROR; |
| } else { |
| if ((attrs & FILE_ATTRIBUTE_DIRECTORY) && |
| (attrs & FILE_ATTRIBUTE_REPARSE_POINT)) { |
| return IS_JUNCTION_YES; |
| } else { |
| return IS_JUNCTION_NO; |
| } |
| } |
| } |
| |
| bool GetLongPath(const WCHAR* path, unique_ptr<WCHAR[]>* result) { |
| DWORD size = ::GetLongPathNameW(path, NULL, 0); |
| if (size == 0) { |
| return false; |
| } |
| result->reset(new WCHAR[size]); |
| ::GetLongPathNameW(path, result->get(), size); |
| return true; |
| } |
| |
| HANDLE OpenDirectory(const WCHAR* path, bool read_write) { |
| return ::CreateFileW( |
| /* lpFileName */ path, |
| /* dwDesiredAccess */ |
| read_write ? (GENERIC_READ | GENERIC_WRITE) : GENERIC_READ, |
| /* dwShareMode */ 0, |
| /* lpSecurityAttributes */ NULL, |
| /* dwCreationDisposition */ OPEN_EXISTING, |
| /* dwFlagsAndAttributes */ FILE_FLAG_OPEN_REPARSE_POINT | |
| FILE_FLAG_BACKUP_SEMANTICS, |
| /* hTemplateFile */ NULL); |
| } |
| |
| } // namespace windows_util |