summaryrefslogtreecommitdiffstats
path: root/src/lib/util/io/fd.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/io/fd.cc')
-rw-r--r--src/lib/util/io/fd.cc78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/lib/util/io/fd.cc b/src/lib/util/io/fd.cc
new file mode 100644
index 0000000..9d89485
--- /dev/null
+++ b/src/lib/util/io/fd.cc
@@ -0,0 +1,78 @@
+// Copyright (C) 2011-2015 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <util/io/fd.h>
+
+#include <unistd.h>
+#include <cerrno>
+
+namespace isc {
+namespace util {
+namespace io {
+
+bool
+write_data(const int fd, const void *buffer_v, const size_t length) {
+ const unsigned char* buffer(static_cast<const unsigned char*>(buffer_v));
+ size_t remaining = length; // Amount remaining to be written
+
+ // Just keep writing until all is written
+ while (remaining > 0) {
+ const int written = write(fd, buffer, remaining);
+ if (written == -1) {
+ if (errno == EINTR) { // Just keep going
+ continue;
+ } else {
+ return (false);
+ }
+
+ } else if (written > 0) {
+ // Wrote "written" bytes from the buffer
+ remaining -= written;
+ buffer += written;
+
+ } else {
+ // Wrote zero bytes from the buffer. We should not get here as any
+ // error that causes zero bytes to be written should have returned
+ // -1. However, write(2) can return 0, and in this case we
+ // interpret it as an error.
+ return (false);
+ }
+ }
+ return (true);
+}
+
+ssize_t
+read_data(const int fd, void *buffer_v, const size_t length) {
+ unsigned char* buffer(static_cast<unsigned char*>(buffer_v));
+ size_t remaining = length; // Amount remaining to be read
+
+ while (remaining > 0) {
+ const int amount = read(fd, buffer, remaining);
+ if (amount == -1) {
+ if (errno == EINTR) { // Continue on interrupted call
+ continue;
+ } else {
+ return (-1);
+ }
+ } else if (amount > 0) {
+ // Read "amount" bytes into the buffer
+ remaining -= amount;
+ buffer += amount;
+ } else {
+ // EOF - end the read
+ break;
+ }
+ }
+
+ // Return total number of bytes read
+ return (static_cast<ssize_t>(length - remaining));
+}
+
+}
+}
+}