Home | History | Annotate | Download | only in nonsfi
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <errno.h>
      6 #include <unistd.h>
      7 #include <sys/types.h>
      8 #include <sys/stat.h>
      9 
     10 #include "base/logging.h"
     11 #include "components/nacl/loader/nonsfi/abi_conversion.h"
     12 #include "components/nacl/loader/nonsfi/irt_interfaces.h"
     13 #include "components/nacl/loader/nonsfi/irt_util.h"
     14 #include "native_client/src/trusted/service_runtime/include/sys/dirent.h"
     15 #include "native_client/src/trusted/service_runtime/include/sys/stat.h"
     16 #include "native_client/src/trusted/service_runtime/include/sys/unistd.h"
     17 
     18 namespace nacl {
     19 namespace nonsfi {
     20 namespace {
     21 
     22 int IrtClose(int fd) {
     23   return CheckError(close(fd));
     24 }
     25 
     26 int IrtDup(int fd, int* newfd) {
     27   return CheckErrorWithResult(dup(fd), newfd);
     28 }
     29 
     30 int IrtDup2(int fd, int newfd) {
     31   return CheckError(dup2(fd, newfd));
     32 }
     33 
     34 int IrtRead(int fd, void* buf, size_t count, size_t* nread) {
     35   return CheckErrorWithResult(read(fd, buf, count), nread);
     36 }
     37 
     38 int IrtWrite(int fd, const void* buf, size_t count, size_t* nwrote) {
     39   return CheckErrorWithResult(write(fd, buf, count), nwrote);
     40 }
     41 
     42 int IrtSeek(int fd, nacl_abi_off_t offset, int whence,
     43             nacl_abi_off_t* new_offset) {
     44   return CheckErrorWithResult(lseek(fd, offset, whence), new_offset);
     45 }
     46 
     47 int IrtFstat(int fd, struct nacl_abi_stat* st) {
     48   struct stat host_st;
     49   if (fstat(fd, &host_st))
     50     return errno;
     51 
     52   StatToNaClAbiStat(host_st, st);
     53   return 0;
     54 }
     55 
     56 int IrtGetDents(int fd, struct nacl_abi_dirent* buf, size_t count,
     57                 size_t* nread) {
     58   // Note: getdents() can return several directory entries in packed format.
     59   // So, here, because we need to convert the abi from host's to nacl's,
     60   // there is no straightforward way to ensure reading only entries which can
     61   // be fit to the buf after abi conversion actually.
     62   // TODO(https://code.google.com/p/nativeclient/issues/detail?id=3734):
     63   // Implement this method.
     64   return ENOSYS;
     65 }
     66 
     67 }  // namespace
     68 
     69 // For seek, fstat and getdents, their argument types should be nacl_abi_X,
     70 // rather than host type, such as off_t, struct stat or struct dirent.
     71 // However, the definition of nacl_irt_fdio uses host types, so here we need
     72 // to cast them.
     73 const nacl_irt_fdio kIrtFdIO = {
     74   IrtClose,
     75   IrtDup,
     76   IrtDup2,
     77   IrtRead,
     78   IrtWrite,
     79   reinterpret_cast<int(*)(int, off_t, int, off_t*)>(IrtSeek),
     80   reinterpret_cast<int(*)(int, struct stat*)>(IrtFstat),
     81   reinterpret_cast<int(*)(int, struct dirent*, size_t, size_t*)>(IrtGetDents),
     82 };
     83 
     84 }  // namespace nonsfi
     85 }  // namespace nacl
     86