blob: 772fb71e590287f6129e9b232ad37ff01a05439e [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "topaz/runtime/dart/utils/files.h"
#include <fcntl.h>
#include <stdint.h>
#include "topaz/runtime/dart/utils/inlines.h"
#include "topaz/runtime/dart/utils/logging.h"
namespace dart_utils {
namespace {
bool ReadFileDescriptor(int fd, std::string* result) {
DEBUG_CHECK(result, LOG_TAG, "");
result->clear();
if (fd < 0) {
return false;
}
constexpr size_t kBufferSize = 1 << 16;
size_t offset = 0;
ssize_t bytes_read = 0;
do {
offset += bytes_read;
result->resize(offset + kBufferSize);
bytes_read = read(fd, &(*result)[offset], kBufferSize);
} while (bytes_read > 0);
if (bytes_read < 0) {
result->clear();
return false;
}
result->resize(offset + bytes_read);
return true;
}
bool WriteFileDescriptor(int fd, const char* data, ssize_t size) {
ssize_t total = 0;
for (ssize_t partial = 0; total < size; total += partial) {
partial = write(fd, data + total, size - total);
if (partial < 0)
return false;
}
return true;
}
} // namespace
bool ReadFileToString(const std::string& path, std::string* result) {
return ReadFileToStringAt(AT_FDCWD, path, result);
}
bool ReadFileToStringAt(int dirfd, const std::string& path,
std::string* result) {
int fd = openat(dirfd, path.c_str(), O_RDONLY);
bool status = ReadFileDescriptor(fd, result);
close(fd);
return status;
}
bool WriteFile(const std::string& path, const char* data, ssize_t size) {
int fd = openat(
AT_FDCWD, path.c_str(), O_CREAT | O_TRUNC | O_WRONLY, 0666);
if (fd < 0) {
return false;
}
bool status = WriteFileDescriptor(fd, data, size);
close(fd);
return status;
}
} // namespace dart_utils