Index: components/nacl/loader/nonsfi/irt_fdio.cc |
diff --git a/components/nacl/loader/nonsfi/irt_fdio.cc b/components/nacl/loader/nonsfi/irt_fdio.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7fba03f97d4c776a7a01a73d8886a3e3272c8c37 |
--- /dev/null |
+++ b/components/nacl/loader/nonsfi/irt_fdio.cc |
@@ -0,0 +1,110 @@ |
+// Copyright 2014 The Chromium 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 <errno.h> |
+#include <unistd.h> |
+#include <sys/types.h> |
+#include <sys/stat.h> |
+ |
+#include "base/logging.h" |
+#include "components/nacl/loader/nonsfi/abi_conversion.h" |
+#include "components/nacl/loader/nonsfi/irt_interfaces.h" |
+#include "native_client/src/trusted/service_runtime/include/sys/dirent.h" |
+#include "native_client/src/trusted/service_runtime/include/sys/stat.h" |
+#include "native_client/src/trusted/service_runtime/include/sys/unistd.h" |
+ |
+namespace nacl { |
+namespace nonsfi { |
+namespace { |
+ |
+int IrtClose(int fd) { |
+ if (close(fd)) |
+ return errno; |
+ |
+ return 0; |
+} |
+ |
+int IrtDup(int fd, int* newfd) { |
+ int result = dup(fd); |
+ if (result < 0) |
+ return errno; |
+ |
+ *newfd = result; |
+ return 0; |
+} |
+ |
+int IrtDup2(int fd, int newfd) { |
+ if (dup2(fd, newfd) < 0) |
+ return errno; |
+ |
+ return 0; |
+} |
+ |
+int IrtRead(int fd, void* buf, size_t count, size_t* nread) { |
+ ssize_t result = read(fd, buf, count); |
+ if (result < 0) |
+ return errno; |
+ |
+ *nread = result; |
+ return 0; |
+} |
+ |
+int IrtWrite(int fd, const void* buf, size_t count, size_t* nwrote) { |
+ ssize_t result = write(fd, buf, count); |
+ if (result < 0) |
+ return errno; |
+ |
+ *nwrote = result; |
+ return 0; |
+} |
+ |
+int IrtSeek(int fd, nacl_abi_off_t offset, int whence, |
+ nacl_abi_off_t* new_offset) { |
+ off_t result = lseek(fd, offset, whence); |
+ if (result < 0) |
+ return errno; |
+ |
+ *new_offset = result; |
+ return 0; |
+} |
+ |
+int IrtFstat(int fd, struct nacl_abi_stat* st) { |
+ struct stat host_st; |
+ if (fstat(fd, &host_st)) |
+ return errno; |
+ |
+ StatToNaClAbiStat(host_st, st); |
+ return 0; |
+} |
+ |
+int IrtGetDents(int fd, struct nacl_abi_dirent* buf, size_t count, |
+ size_t* nread) { |
+ // Note: getdents() can return several directory entries in packed format. |
+ // So, here, because we need to convert the abi from host's to nacl's, |
+ // there is no straightforward way to ensure reading only entries which can |
+ // be fit to the buf after abi conversion actually. |
+ // TODO(https://code.google.com/p/nativeclient/issues/detail?id=3734): |
+ // Implement this method. |
+ return ENOSYS; |
+} |
+ |
+} // namespace |
+ |
+// For seek, fstat and getdents, their argument types should be nacl_abi_X, |
+// rather than host type, such as off_t, struct stat or struct dirent. |
+// However, the definition of nacl_irt_fdio uses host types, so here we need |
+// to cast them. |
+const nacl_irt_fdio kIrtFdIO = { |
+ IrtClose, |
+ IrtDup, |
+ IrtDup2, |
+ IrtRead, |
+ IrtWrite, |
+ reinterpret_cast<int(*)(int, off_t, int, off_t*)>(IrtSeek), |
+ reinterpret_cast<int(*)(int, struct stat*)>(IrtFstat), |
+ reinterpret_cast<int(*)(int, struct dirent*, size_t, size_t*)>(IrtGetDents), |
+}; |
+ |
+} // namespace nonsfi |
+} // namespace nacl |