Home | History | Annotate | Download | only in nacl_io
      1 // Copyright (c) 2012 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 // The entire file is wrapped in this #if. We do this so this .cc file can be
      6 // compiled, even on a non-Windows build.
      7 #if defined(WIN32)
      8 
      9 #include "nacl_io/kernel_wrap.h"
     10 #include <errno.h>
     11 #include <fcntl.h>
     12 #include <stdarg.h>
     13 #include <stdlib.h>
     14 #include <string.h>
     15 #include <sys/types.h>  // This must be included before <sys/stat.h>.
     16 #include <sys/stat.h>
     17 #include "nacl_io/kernel_intercept.h"
     18 
     19 #include <windows.h>
     20 
     21 namespace {
     22 
     23 template <typename SrcStat, typename DstStat>
     24 void CopyStat(const SrcStat* src, DstStat* dst) {
     25   memset(dst, 0, sizeof(DstStat));
     26   dst->st_dev = src->st_dev;
     27   dst->st_ino = src->st_ino;
     28   dst->st_mode = src->st_mode;
     29   dst->st_nlink = src->st_nlink;
     30   dst->st_uid = src->st_uid;
     31   dst->st_gid = src->st_gid;
     32   dst->st_rdev = src->st_rdev;
     33   dst->st_size = src->st_size;
     34   dst->st_atime = src->st_atime;
     35   dst->st_mtime = src->st_mtime;
     36   dst->st_ctime = src->st_ctime;
     37 }
     38 
     39 }  // namespace
     40 
     41 EXTERN_C_BEGIN
     42 
     43 // This needs to be included because it is defined in read.c, which we wish to
     44 // override. Define with dummy values for now... though this seems like it will
     45 // break ftelli64/fgetpos/fstream.
     46 char _lookuptrailbytes[256] = {0};
     47 
     48 int _access(const char* path, int amode) {
     49   return ki_access(path, amode);
     50 }
     51 
     52 int _chdir(const char* path) {
     53   return ki_chdir(path);
     54 }
     55 
     56 int _chmod(const char* path, mode_t mode) {
     57   return ki_chmod(path, mode);
     58 }
     59 
     60 int _close(int fd) {
     61   return ki_close(fd);
     62 }
     63 
     64 int _close_nolock(int fd) {
     65   return ki_close(fd);
     66 }
     67 
     68 int _dup(int oldfd) {
     69   return ki_dup(oldfd);
     70 }
     71 
     72 int _dup2(int oldfd, int newfd) {
     73   return ki_dup2(oldfd, newfd);
     74 }
     75 
     76 int _fstat32(int fd, struct _stat32* buf) {
     77   struct stat ki_buf;
     78   int res = ki_fstat(fd, &ki_buf);
     79   CopyStat(&ki_buf, buf);
     80   return res;
     81 }
     82 
     83 int _fstat64(int fd, struct _stat64* buf) {
     84   struct stat ki_buf;
     85   int res = ki_fstat(fd, &ki_buf);
     86   CopyStat(&ki_buf, buf);
     87   return res;
     88 }
     89 
     90 int _fstat32i64(int fd, struct _stat32i64* buf) {
     91   struct stat ki_buf;
     92   int res = ki_fstat(fd, &ki_buf);
     93   CopyStat(&ki_buf, buf);
     94   return res;
     95 }
     96 
     97 int _fstat64i32(int fd, struct _stat64i32* buf) {
     98   struct stat ki_buf;
     99   int res = ki_fstat(fd, &ki_buf);
    100   CopyStat(&ki_buf, buf);
    101   return res;
    102 }
    103 
    104 char* _getcwd(char* buf, int size) {
    105   // If size is 0, allocate as much as we need.
    106   if (size == 0) {
    107     char stack_buf[MAX_PATH + 1];
    108     if (!ki_getcwd(stack_buf, MAX_PATH))
    109       return NULL;
    110     size = strlen(stack_buf) + 1;
    111   }
    112   // Allocate the buffer if needed
    113   if (buf == NULL) {
    114     buf = static_cast<char*>(malloc(size));
    115   }
    116   return ki_getcwd(buf, size);
    117 }
    118 
    119 int _isatty(int fd) {
    120   return ki_isatty(fd);
    121 }
    122 
    123 off_t _lseek(int fd, off_t offset, int whence) {
    124   return ki_lseek(fd, offset, whence);
    125 }
    126 
    127 int _mkdir(const char* path) {
    128   return ki_mkdir(path, 0777);
    129 }
    130 
    131 int _open(const char* path, int oflag, ...) {
    132   va_list list;
    133   int pmode = 0;
    134   if (oflag & _O_CREAT) {
    135     va_start(list, oflag);
    136     pmode = va_arg(list, int);
    137     va_end(list);
    138   }
    139   return ki_open(path, oflag, (mode_t) pmode);
    140 }
    141 
    142 int _sopen(const char* path, int oflag, int shflag) {
    143   return ki_open(path, oflag);
    144 }
    145 
    146 errno_t _sopen_s(int* pfh, const char* path, int oflag, int shflag, int pmode) {
    147   *pfh = ki_open(path, oflag);
    148   return (*pfh < 0) ? errno : 0;
    149 }
    150 
    151 int _read(int fd, void* buf, size_t nbyte) {
    152   if (!ki_is_initialized())
    153     return 0;
    154 
    155   return ki_read(fd, buf, nbyte);
    156 }
    157 
    158 int _read_nolock(int fd, void* buf, size_t nbyte) {
    159   if (!ki_is_initialized())
    160     return 0;
    161 
    162   return ki_read(fd, buf, nbyte);
    163 }
    164 
    165 int _rmdir(const char* path) {
    166   return ki_rmdir(path);
    167 }
    168 
    169 int setenv(const char* name, const char* value, int overwrite) {
    170   if (0 == overwrite && NULL != getenv(name)) {
    171     return 0;
    172   }
    173   errno_t result = _putenv_s(name, value);
    174   if (result != 0) {
    175     errno = result;
    176     return -1;
    177   } else {
    178     return 0;
    179   }
    180 }
    181 
    182 int _stat32(const char* path, struct _stat32* buf) {
    183   struct stat ki_buf;
    184   int res = ki_stat(path, &ki_buf);
    185   CopyStat(&ki_buf, buf);
    186   return res;
    187 }
    188 
    189 int _stat64(const char* path, struct _stat64* buf) {
    190   struct stat ki_buf;
    191   int res = ki_stat(path, &ki_buf);
    192   CopyStat(&ki_buf, buf);
    193   return res;
    194 }
    195 
    196 int _stat64i32(const char* path, struct _stat64i32* buf) {
    197   struct stat ki_buf;
    198   int res = ki_stat(path, &ki_buf);
    199   CopyStat(&ki_buf, buf);
    200   return res;
    201 }
    202 
    203 int _stat32i64(const char* path, struct _stat32i64* buf) {
    204   struct stat ki_buf;
    205   int res = ki_stat(path, &ki_buf);
    206   CopyStat(&ki_buf, buf);
    207   return res;
    208 }
    209 
    210 int _unlink(const char* path) {
    211   return ki_unlink(path);
    212 }
    213 
    214 int _utime(const char* filename, const struct utimbuf* times) {
    215   return ki_utime(filename, times);
    216 }
    217 
    218 int _write(int fd, const void* buf, size_t nbyte) {
    219   if (!ki_is_initialized())
    220     return 0;
    221 
    222   return ki_write(fd, buf, nbyte);
    223 }
    224 
    225 // Do nothing for Windows, we replace the library at link time.
    226 void kernel_wrap_init() {
    227 }
    228 
    229 void kernel_wrap_uninit() {
    230 }
    231 
    232 EXTERN_C_END
    233 
    234 #endif   // defined(WIN32)
    235