| // 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 |