Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(578)

Unified Diff: runtime/bin/file_openbsd.cc

Issue 1559053002: Refs #10260 OpenBSD support #25327 Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Address code review issues Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/fdutils_openbsd.cc ('k') | runtime/bin/file_system_watcher_openbsd.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « runtime/bin/fdutils_openbsd.cc ('k') | runtime/bin/file_system_watcher_openbsd.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698