Index: util/file/fd_io.cc |
diff --git a/util/file/fd_io.cc b/util/file/fd_io.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..942588002020cd1e7b43af45a015d9c4e8fd065e |
--- /dev/null |
+++ b/util/file/fd_io.cc |
@@ -0,0 +1,75 @@ |
+// Copyright 2014 The Crashpad 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 "util/file/fd_io.h" |
+ |
+#include <unistd.h> |
+ |
+#include "base/posix/eintr_wrapper.h" |
+ |
+namespace { |
+ |
+struct ReadTraits { |
+ typedef void* VoidBufferType; |
+ typedef char* CharBufferType; |
+ static ssize_t Operate(int fd, CharBufferType buffer, size_t size) { |
+ return read(fd, buffer, size); |
+ } |
+}; |
+ |
+struct WriteTraits { |
+ typedef const void* VoidBufferType; |
+ typedef const char* CharBufferType; |
+ static ssize_t Operate(int fd, CharBufferType buffer, size_t size) { |
+ return write(fd, buffer, size); |
+ } |
+}; |
+ |
+template <typename Traits> |
+ssize_t ReadOrWrite(int fd, |
+ typename Traits::VoidBufferType buffer, |
+ size_t size) { |
+ typename Traits::CharBufferType buffer_c = |
+ reinterpret_cast<typename Traits::CharBufferType>(buffer); |
+ |
+ ssize_t total_bytes = 0; |
+ while (size > 0) { |
+ ssize_t bytes = HANDLE_EINTR(Traits::Operate(fd, buffer_c, size)); |
+ if (bytes < 0) { |
+ return bytes; |
+ } else if (bytes == 0) { |
+ break; |
+ } |
+ |
+ buffer_c += bytes; |
+ size -= bytes; |
+ total_bytes += bytes; |
+ } |
+ |
+ return total_bytes; |
+} |
+ |
+} // namespace |
+ |
+namespace crashpad { |
+ |
+ssize_t ReadFD(int fd, void* buffer, size_t size) { |
+ return ReadOrWrite<ReadTraits>(fd, buffer, size); |
+} |
+ |
+ssize_t WriteFD(int fd, const void* buffer, size_t size) { |
+ return ReadOrWrite<WriteTraits>(fd, buffer, size); |
+} |
+ |
+} // namespace crashpad |