Index: ports/glibc-compat/src/readv.c |
diff --git a/ports/glibc-compat/src/readv.c b/ports/glibc-compat/src/readv.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c9433e87b6cd9dd19b7a37ebe464f4cd770c9690 |
--- /dev/null |
+++ b/ports/glibc-compat/src/readv.c |
@@ -0,0 +1,30 @@ |
+/* Copyright 2015 The Native Client Authors. All rights reserved. |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. */ |
+ |
+#include <sys/uio.h> |
+#include <unistd.h> // unix(nacl) standards |
+#include <errno.h> |
+ |
+ssize_t readv(int fd, const struct iovec *iov, int iovcnt){ |
+ if(iovcnt < 0){ |
+ // #TODO(dt) add check for IOV_MAX |
+ errno = EINVAL; |
+ return -1; |
+ } |
+ ssize_t bytes_read = 0 ; |
+ ssize_t bytes_supposed_to_be_read = 0 ; |
+ int i; |
+ for (i = 0; i < (iovcnt); i++) { |
+ bytes_read += read(fd, iov[i].iov_base, iov[i].iov_len); |
+ bytes_supposed_to_be_read += iov[i].iov_len ; |
+ // #TODO(dt) add check for (max) ssize_t allowed |
+ if (bytes_read != bytes_supposed_to_be_read){ |
+ // deliberately not setting errno here as it might override |
+ // errno set by read(...) |
+ return -1; |
+ } |
+ } |
+ // #TODO(dt) (mark for)update st_atime if required. |
+ return bytes_read; |
+} |