blob: 97d0023c4d955ef6f10918f5af7ae4874d3b257d [file] [log] [blame]
// 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