|  | // 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 && | 
|  | ::GetFileInformationByHandle(handle, &info)) { | 
|  | success = true; | 
|  | // TODO(laszlocsomor): use info.nFileSizeHigh after we updated total_size to | 
|  | // be u8 type. | 
|  | result->total_size = info.nFileSizeLow; | 
|  | // TODO(laszlocsomor): query the actual permissions and write in file_mode. | 
|  | result->file_mode = 0777; | 
|  | result->is_directory = (info.dwFileAttributes != INVALID_FILE_ATTRIBUTES) && | 
|  | (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); | 
|  | } | 
|  | ::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 |