| Index: runtime/bin/file_openbsd.cc
|
| diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_openbsd.cc
|
| similarity index 89%
|
| copy from runtime/bin/file_android.cc
|
| copy to runtime/bin/file_openbsd.cc
|
| index cc29740f094e524cddef3672a836566e37de425c..45df5b1ecd69b4426dfa89e36bdfdd26eb4f91a2 100644
|
| --- a/runtime/bin/file_android.cc
|
| +++ b/runtime/bin/file_openbsd.cc
|
| @@ -3,7 +3,7 @@
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| #include "platform/globals.h"
|
| -#if defined(TARGET_OS_ANDROID)
|
| +#if defined(TARGET_OS_OPENBSD)
|
|
|
| #include "bin/file.h"
|
|
|
| @@ -11,7 +11,6 @@
|
| #include <fcntl.h> // NOLINT
|
| #include <sys/stat.h> // NOLINT
|
| #include <sys/types.h> // NOLINT
|
| -#include <sys/sendfile.h> // NOLINT
|
| #include <unistd.h> // NOLINT
|
| #include <libgen.h> // NOLINT
|
|
|
| @@ -19,7 +18,6 @@
|
| #include "bin/log.h"
|
|
|
| #include "platform/signal_blocker.h"
|
| -#include "platform/utils.h"
|
|
|
|
|
| namespace dart {
|
| @@ -58,7 +56,7 @@ void File::Close() {
|
| if (err != 0) {
|
| const int kBufferSize = 1024;
|
| char error_message[kBufferSize];
|
| - Utils::StrError(errno, error_message, kBufferSize);
|
| + strerror_r(errno, error_message, kBufferSize);
|
| Log::PrintErr("%s\n", error_message);
|
| }
|
| }
|
| @@ -90,13 +88,13 @@ int64_t File::Write(const void* buffer, int64_t num_bytes) {
|
|
|
| int64_t File::Position() {
|
| ASSERT(handle_->fd() >= 0);
|
| - return NO_RETRY_EXPECTED(lseek64(handle_->fd(), 0, SEEK_CUR));
|
| + return NO_RETRY_EXPECTED(lseek(handle_->fd(), 0, SEEK_CUR));
|
| }
|
|
|
|
|
| bool File::SetPosition(int64_t position) {
|
| ASSERT(handle_->fd() >= 0);
|
| - return NO_RETRY_EXPECTED(lseek64(handle_->fd(), position, SEEK_SET)) >= 0;
|
| + return NO_RETRY_EXPECTED(lseek(handle_->fd(), position, SEEK_SET)) >= 0;
|
| }
|
|
|
|
|
| @@ -176,7 +174,7 @@ File* File::Open(const char* name, FileOpenMode mode) {
|
| }
|
| if ((((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) ||
|
| (((mode & kWriteOnly) != 0) && ((mode & kTruncate) == 0))) {
|
| - int64_t position = lseek64(fd, 0, SEEK_END);
|
| + int64_t position = lseek(fd, 0, SEEK_END);
|
| if (position < 0) {
|
| return NULL;
|
| }
|
| @@ -282,28 +280,22 @@ bool File::Copy(const char* old_path, const char* new_path) {
|
| VOID_TEMP_FAILURE_RETRY(close(old_fd));
|
| return false;
|
| }
|
| - off_t offset = 0;
|
| +
|
| int result = 1;
|
| - while (result > 0) {
|
| - // Loop to ensure we copy everything, and not only up to 2GB.
|
| - result = NO_RETRY_EXPECTED(
|
| - sendfile(new_fd, old_fd, &offset, kMaxUint32));
|
| - }
|
| - // From sendfile man pages:
|
| - // Applications may wish to fall back to read(2)/write(2) in the case
|
| - // where sendfile() fails with EINVAL or ENOSYS.
|
| - if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
|
| - const intptr_t kBufferSize = 8 * KB;
|
| - uint8_t buffer[kBufferSize];
|
| - while ((result = TEMP_FAILURE_RETRY(
|
| - read(old_fd, buffer, kBufferSize))) > 0) {
|
| - int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
|
| - if (wrote != result) {
|
| - result = -1;
|
| - break;
|
| - }
|
| + // OpenBSD has no sendfile so use read(2)/write(2) to copy the file
|
| + const intptr_t kBufferSize = 8 * KB;
|
| + uint8_t buffer[kBufferSize];
|
| + while ((result = TEMP_FAILURE_RETRY(read(old_fd,
|
| + buffer,
|
| + kBufferSize))) > 0) {
|
| + int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
|
| + // TODO(mulander): deal with short writes: http://dartbug.com/25399
|
| + if (wrote != result) {
|
| + result = -1;
|
| + break;
|
| }
|
| }
|
| +
|
| int e = errno;
|
| VOID_TEMP_FAILURE_RETRY(close(old_fd));
|
| VOID_TEMP_FAILURE_RETRY(close(new_fd));
|
| @@ -423,7 +415,7 @@ File::StdioHandleType File::GetStdioHandleType(int fd) {
|
| if (result == -1) {
|
| const int kBufferSize = 1024;
|
| char error_message[kBufferSize];
|
| - Utils::StrError(errno, error_message, kBufferSize);
|
| + strerror_r(errno, error_message, kBufferSize);
|
| FATAL2("Failed stat on file descriptor %d: %s", fd, error_message);
|
| }
|
| if (S_ISCHR(buf.st_mode)) return kTerminal;
|
| @@ -466,4 +458,4 @@ File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
|
| } // namespace bin
|
| } // namespace dart
|
|
|
| -#endif // defined(TARGET_OS_ANDROID)
|
| +#endif // defined(TARGET_OS_OPENBSD)
|
|
|