| // 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 "third_party/ijar/platform_utils.h" | |
| #include <limits.h> | |
| #include <stdio.h> | |
| #if defined(_WIN32) || defined(__CYGWIN__) | |
| #include <windows.h> | |
| #else // !(defined(_WIN32) || defined(__CYGWIN__)) | |
| #include <sys/stat.h> | |
| #include <sys/types.h> | |
| #include <unistd.h> | |
| #endif // defined(_WIN32) || defined(__CYGWIN__) | |
| #include <string> | |
| #include "src/main/cpp/util/errors.h" | |
| #include "src/main/cpp/util/file.h" | |
| #include "src/main/cpp/util/file_platform.h" | |
| #include "src/main/cpp/util/logging.h" | |
| #include "src/main/cpp/util/path.h" | |
| #include "src/main/cpp/util/path_platform.h" | |
| namespace devtools_ijar { | |
| using std::string; | |
| bool stat_file(const char* path, Stat* result) { | |
| #if defined(_WIN32) || defined(__CYGWIN__) | |
| std::wstring wpath; | |
| std::string error; | |
| if (!blaze_util::AsAbsoluteWindowsPath(path, &wpath, &error)) { | |
| BAZEL_DIE(255) << "stat_file: AsAbsoluteWindowsPath(" << path | |
| << ") failed: " << error; | |
| } | |
| bool success = false; | |
| BY_HANDLE_FILE_INFORMATION info; | |
| HANDLE handle = ::CreateFileW( | |
| /* lpFileName */ wpath.c_str(), | |
| /* dwDesiredAccess */ GENERIC_READ, | |
| /* dwShareMode */ FILE_SHARE_READ, | |
| /* lpSecurityAttributes */ NULL, | |
| /* dwCreationDisposition */ OPEN_EXISTING, | |
| /* dwFlagsAndAttributes */ FILE_ATTRIBUTE_NORMAL, | |
| /* hTemplateFile */ NULL); | |
| if (handle == INVALID_HANDLE_VALUE) { | |
| // Opening it as a file failed, try opening it as a directory. | |
| handle = ::CreateFileW( | |
| /* lpFileName */ wpath.c_str(), | |
| /* dwDesiredAccess */ GENERIC_READ, | |
| /* dwShareMode */ FILE_SHARE_READ, | |
| /* lpSecurityAttributes */ NULL, | |
| /* dwCreationDisposition */ OPEN_EXISTING, | |
| /* dwFlagsAndAttributes */ FILE_FLAG_BACKUP_SEMANTICS, | |
| /* hTemplateFile */ NULL); | |
| } | |
| if (handle != INVALID_HANDLE_VALUE && | |
| ::GetFileInformationByHandle(handle, &info)) { | |
| success = true; | |
| bool is_dir = (info.dwFileAttributes != INVALID_FILE_ATTRIBUTES) && | |
| (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); | |
| // TODO(laszlocsomor): use info.nFileSizeHigh after we updated total_size to | |
| // be u8 type. | |
| result->total_size = is_dir ? 0 : info.nFileSizeLow; | |
| // TODO(laszlocsomor): query the actual permissions and write in file_mode. | |
| result->file_mode = 0777; | |
| result->is_directory = is_dir; | |
| } | |
| ::CloseHandle(handle); | |
| return success; | |
| #else // !(defined(_WIN32) || defined(__CYGWIN__)) | |
| struct stat statst; | |
| if (stat(path, &statst) < 0) { | |
| return false; | |
| } | |
| result->total_size = statst.st_size; | |
| result->file_mode = statst.st_mode; | |
| result->is_directory = (statst.st_mode & S_IFDIR) != 0; | |
| return true; | |
| #endif // defined(_WIN32) || defined(__CYGWIN__) | |
| } | |
| bool write_file(const char* path, unsigned int perm, const void* data, | |
| size_t size) { | |
| return blaze_util::WriteFile(data, size, path, perm); | |
| } | |
| bool read_file(const char* path, void* buffer, size_t size) { | |
| return blaze_util::ReadFile(path, buffer, size); | |
| } | |
| string get_cwd() { return blaze_util::GetCwd(); } | |
| bool make_dirs(const char* path, unsigned int mode) { | |
| #ifndef _WIN32 | |
| // TODO(laszlocsomor): respect `mode` on Windows/MSVC. | |
| mode |= S_IWUSR | S_IXUSR; | |
| #endif // not _WIN32 | |
| string spath(path); | |
| if (spath.empty()) { | |
| return true; | |
| } | |
| if (spath.back() != '/' && spath.back() != '\\') { | |
| spath = blaze_util::Dirname(spath); | |
| } | |
| return blaze_util::MakeDirectories(spath, mode); | |
| } | |
| } // namespace devtools_ijar |