First pass of ImageWriter
Change-Id: I4f189587a2e3cc1c265200b8fa64321b299947eb
diff --git a/src/file_linux.cc b/src/file_linux.cc
new file mode 100644
index 0000000..367dbe8
--- /dev/null
+++ b/src/file_linux.cc
@@ -0,0 +1,64 @@
+// Copyright 2010 Google Inc. All Rights Reserved.
+
+#include "file_linux.h"
+
+#include <errno.h>
+#include <unistd.h>
+
+#include "logging.h"
+
+namespace art {
+
+LinuxFile::~LinuxFile() {
+ // Close the file if necessary (unless it's a standard stream).
+ if (auto_close_ && fd_ > STDERR_FILENO) {
+ Close();
+ }
+}
+
+void LinuxFile::Close() {
+ DCHECK_GT(fd_, 0);
+ int err = close(fd_);
+ if (err != 0) {
+ PLOG(WARNING) << "Problem closing " << name();
+ }
+ fd_ = kClosedFd;
+}
+
+
+bool LinuxFile::IsClosed() {
+ return fd_ == kClosedFd;
+}
+
+
+int64_t LinuxFile::Read(void* buffer, int64_t num_bytes) {
+ DCHECK_GE(fd_, 0);
+ return read(fd_, buffer, num_bytes);
+}
+
+
+int64_t LinuxFile::Write(const void* buffer, int64_t num_bytes) {
+ DCHECK_GE(fd_, 0);
+ return write(fd_, buffer, num_bytes);
+}
+
+
+off_t LinuxFile::Position() {
+ DCHECK_GE(fd_, 0);
+ return lseek(fd_, 0, SEEK_CUR);
+}
+
+
+off_t LinuxFile::Length() {
+ DCHECK_GE(fd_, 0);
+ off_t position = lseek(fd_, 0, SEEK_CUR);
+ if (position < 0) {
+ // The file is not capable of seeking. Return an error.
+ return -1;
+ }
+ off_t result = lseek(fd_, 0, SEEK_END);
+ lseek(fd_, position, SEEK_SET);
+ return result;
+}
+
+} // namespace art