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 rest(length);
- // Just keep writing until all is written
- while (rest) {
- ssize_t written(write(fd, buffer, rest));
- if (rest == -1) {
- if (errno == EINTR) { // Just keep going
- continue;
- } else {
+
+ const unsigned char* buffer(static_cast<const unsigned char*>(buffer_v));
+ size_t remaining = length; // Amount remaining to be written
+
+ while (remaining > 0) {
+ ssize_t amount = write(fd, buffer, remaining);
+ if (amount == -1) {
+ // Some error. Ignore interrupted system calls otherwise return
+ // an error indication.
+ if (errno != EINTR) {
return false;
}
- } else { // Wrote something
- rest -= written;
- buffer += written;
+
+ } else if (amount > 0) {
+ // Wrote "amount" bytes from the buffer
+ remaining -= amount;
+ buffer += amount;
+
+ } 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;
+ 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 rest(length), already(0);
- while (rest) { // Stil something to read
- ssize_t amount(read(fd, buffer, rest));
- if (rest == -1) {
- if (errno == EINTR) { // Continue on interrupted call
- continue;
- } else {
+
+ unsigned char* buffer(static_cast<unsigned char*>(buffer_v));
+ size_t remaining = length; // Amount remaining to be read
+
+ while (remaining > 0) {
+ ssize_t amount = read(fd, buffer, remaining);
+ if (amount == -1) {
+ // Some error. Ignore interrupted system calls otherwise return
+ // an error indication.
+ if (errno != EINTR) {
return -1;
}
- } else if (amount) {
- already += amount;
- rest -= amount;
+
+ } else if (amount > 0) {
+ // Read "amount" bytes into the buffer
+ remaining -= amount;
buffer += amount;
- } else { // EOF
- return already;
+
+ } else {
+ // EOF - end the read
+ break;
}
}
- return already;
+
+ // Return total number of bytes read
+ return (static_cast<ssize_t>(length - remaining));
}
}