1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <sys/types.h> // Include something that will define __BIONIC__. 6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The entire file is wrapped in this #if. We do this so this .cc file can be 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// compiled, even on a non-bionic build. 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(__native_client__) && defined(__BIONIC__) 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <alloca.h> 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <assert.h> 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <dirent.h> 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <errno.h> 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <irt_syscalls.h> 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <string.h> 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <sys/stat.h> 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <sys/time.h> 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "nacl_io/kernel_intercept.h" 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "nacl_io/kernel_wrap.h" 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "nacl_io/kernel_wrap_real.h" 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "nacl_io/osmman.h" 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace { 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid stat_to_nacl_stat(const struct stat* buf, nacl_abi_stat* nacl_buf) { 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch memset(nacl_buf, 0, sizeof(struct nacl_abi_stat)); 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_dev = buf->st_dev; 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_ino = buf->st_ino; 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_mode = buf->st_mode; 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_nlink = buf->st_nlink; 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_uid = buf->st_uid; 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_gid = buf->st_gid; 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_rdev = buf->st_rdev; 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_size = buf->st_size; 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_blksize = buf->st_blksize; 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_blocks = buf->st_blocks; 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_atime = buf->st_atime; 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_mtime = buf->st_mtime; 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_buf->nacl_abi_st_ctime = buf->st_ctime; 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid nacl_stat_to_stat(const nacl_abi_stat* nacl_buf, struct stat* buf) { 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch memset(buf, 0, sizeof(struct stat)); 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_dev = nacl_buf->nacl_abi_st_dev; 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_ino = nacl_buf->nacl_abi_st_ino; 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_mode = nacl_buf->nacl_abi_st_mode; 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_nlink = nacl_buf->nacl_abi_st_nlink; 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_uid = nacl_buf->nacl_abi_st_uid; 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_gid = nacl_buf->nacl_abi_st_gid; 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_rdev = nacl_buf->nacl_abi_st_rdev; 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) buf->st_size = nacl_buf->nacl_abi_st_size; 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_blksize = nacl_buf->nacl_abi_st_blksize; 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_blocks = nacl_buf->nacl_abi_st_blocks; 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_atime = nacl_buf->nacl_abi_st_atime; 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_mtime = nacl_buf->nacl_abi_st_mtime; 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch buf->st_ctime = nacl_buf->nacl_abi_st_ctime; 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // namespace 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// From native_client/src/trusted/service_runtime/include/sys/dirent.h 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef nacl_abi___ino_t_defined 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define nacl_abi___ino_t_defined 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtypedef int64_t nacl_abi___ino_t; 68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtypedef nacl_abi___ino_t nacl_abi_ino_t; 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef nacl_abi___off_t_defined 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define nacl_abi___off_t_defined 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtypedef int64_t nacl_abi__off_t; 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochtypedef nacl_abi__off_t nacl_abi_off_t; 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch/* We need a way to define the maximum size of a name. */ 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef MAXNAMLEN 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch# ifdef NAME_MAX 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch# define MAXNAMLEN NAME_MAX 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch# else 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch# define MAXNAMLEN 255 83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch# endif 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct nacl_abi_dirent { 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_abi_ino_t nacl_abi_d_ino; 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_abi_off_t nacl_abi_d_off; 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint16_t nacl_abi_d_reclen; 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch char nacl_abi_d_name[MAXNAMLEN + 1]; 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic const int d_name_shift = offsetof (dirent, d_name) - 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch offsetof (struct nacl_abi_dirent, nacl_abi_d_name); 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochEXTERN_C_BEGIN 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Macro to get the REAL function pointer 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define REAL(name) __nacl_irt_##name##_real 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Macro to get the WRAP function 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define WRAP(name) __nacl_irt_##name##_wrap 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Declare REAL function pointer. 10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define DECLARE_REAL_PTR(name) typeof(__nacl_irt_##name) REAL(name); 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Assign the REAL function pointer. 10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define ASSIGN_REAL_PTR(name) REAL(name) = __nacl_irt_##name; 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Switch IRT's pointer to the REAL pointer 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define USE_REAL(name) __nacl_irt_##name = (typeof(__nacl_irt_##name))REAL(name) 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Switch IRT's pointer to the WRAP function 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define USE_WRAP(name) __nacl_irt_##name = (typeof(__nacl_irt_##name))WRAP(name) 115c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define EXPAND_SYMBOL_LIST_OPERATION(OP) \ 11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(chdir); \ 11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(close); \ 11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(dup); \ 12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(dup2); \ 12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(exit); \ 12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(fchdir); \ 12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(fchmod); \ 12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(fdatasync); \ 12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(fstat); \ 12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(fsync); \ 12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(getcwd); \ 12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(getdents); \ 12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(isatty); \ 13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(lstat); \ 13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(mkdir); \ 13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(mmap); \ 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(munmap); \ 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(open); \ 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(open_resource); \ 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(poll); \ 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(read); \ 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(readlink); \ 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(rmdir); \ 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(seek); \ 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(stat); \ 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(truncate); \ 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) OP(write); 144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochEXPAND_SYMBOL_LIST_OPERATION(DECLARE_REAL_PTR); 146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(chdir)(const char* pathname) { 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_chdir(pathname)); 149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(close)(int fd) { 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_close(fd)); 153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(dup)(int fd, int* newfd) NOTHROW { 156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *newfd = ki_dup(fd); 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(*newfd); 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(dup2)(int fd, int newfd) NOTHROW { 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_dup2(fd, newfd)); 162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid WRAP(exit)(int status) { 165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ki_exit(status); 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(fchdir)(int fd) NOTHROW { 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_fchdir(fd)); 170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(fchmod)(int fd, mode_t mode) NOTHROW { 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_fchmod(fd, mode)); 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(fdatasync)(int fd) NOTHROW { 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_fdatasync(fd)); 178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(fstat)(int fd, struct nacl_abi_stat* nacl_buf) { 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct stat buf; 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch memset(&buf, 0, sizeof(struct stat)); 183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int res = ki_fstat(fd, &buf); 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(res < 0); 185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch stat_to_nacl_stat(&buf, nacl_buf); 186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(fsync)(int fd) NOTHROW { 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_fsync(fd)); 191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochint WRAP(getcwd)(char* buf, size_t size) { 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(ki_getcwd(buf, size) == NULL); 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(getdents)(int fd, dirent* nacl_buf, size_t nacl_count, size_t* nread) { 199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int nacl_offset = 0; 200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // "buf" contains dirent(s); "nacl_buf" contains nacl_abi_dirent(s). 201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // nacl_abi_dirent(s) are smaller than dirent(s), so nacl_count bytes buffer 202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // is enough 203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch char* buf = (char*)alloca(nacl_count); 204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int offset = 0; 205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int count; 206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch count = ki_getdents(fd, buf, nacl_count); 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(count < 0); 209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch while (offset < count) { 211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dirent* d = (dirent*)(buf + offset); 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_abi_dirent* nacl_d = (nacl_abi_dirent*)((char*)nacl_buf + nacl_offset); 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_d->nacl_abi_d_ino = d->d_ino; 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_d->nacl_abi_d_off = d->d_off; 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_d->nacl_abi_d_reclen = d->d_reclen - d_name_shift; 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch size_t d_name_len = d->d_reclen - offsetof(dirent, d_name); 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch memcpy(nacl_d->nacl_abi_d_name, d->d_name, d_name_len); 218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch offset += d->d_reclen; 220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_offset += nacl_d->nacl_abi_d_reclen; 221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *nread = nacl_offset; 224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(isatty)(int fd, int* result) { 228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *result = ki_isatty(fd); 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(*result == 0); 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(lstat)(const char* path, struct nacl_abi_stat* nacl_buf) { 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct stat buf; 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch memset(&buf, 0, sizeof(struct stat)); 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int res = ki_lstat(path, &buf); 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(res < 0); 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch stat_to_nacl_stat(&buf, nacl_buf); 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(mkdir)(const char* pathname, mode_t mode) { 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_mkdir(pathname, mode)); 244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(mmap)(void** addr, 24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t length, 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int prot, 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int flags, 25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int fd, 251c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int64_t offset) { 252c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (flags & MAP_ANONYMOUS) 253c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(mmap)(addr, length, prot, flags, fd, offset); 254c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *addr = ki_mmap(*addr, length, prot, flags, fd, offset); 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(*addr == (void*)-1) 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 259c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(munmap)(void* addr, size_t length) { 261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Always let the real munmap run on the address range. It is not an error if 262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // there are no mapped pages in that range. 263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ki_munmap(addr, length); 264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(munmap)(addr, length); 265c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint WRAP(open)(const char* pathname, int oflag, mode_t mode, int* newfd) { 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci *newfd = ki_open(pathname, oflag, mode); 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(*newfd); 270c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 271c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 272c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(open_resource)(const char* file, int* fd) { 273c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *fd = ki_open_resource(file); 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(*fd); 275c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 276c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(poll)(struct pollfd* fds, nfds_t nfds, int timeout, int* count) { 278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *count = ki_poll(fds, nfds, timeout); 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(*count); 280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 281c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(read)(int fd, void* buf, size_t count, size_t* nread) { 283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ssize_t signed_nread = ki_read(fd, buf, count); 284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *nread = static_cast<size_t>(signed_nread); 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(signed_nread); 286c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 287c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(readlink)(const char* path, char* buf, size_t count, size_t* nread) { 289c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ssize_t signed_nread = ki_readlink(path, buf, count); 290c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *nread = static_cast<size_t>(signed_nread); 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(signed_nread); 292c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 293c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 294c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(rmdir)(const char* pathname) { 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_rmdir(pathname)); 296c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 297c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 298c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(seek)(int fd, off64_t offset, int whence, int64_t* new_offset) { 299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *new_offset = ki_lseek(fd, offset, whence); 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(*new_offset); 301c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 302c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 30346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(select)(int nfds, 30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fd_set* readfds, 30546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fd_set* writefds, 30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) fd_set* exceptfds, 30746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) struct timeval* timeout, 30846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int* count) { 309c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *count = ki_select(nfds, readfds, writefds, exceptfds, timeout); 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(*count); 311c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 31346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(stat)(const char* pathname, struct nacl_abi_stat* nacl_buf) { 314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct stat buf; 315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch memset(&buf, 0, sizeof(struct stat)); 316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int res = ki_stat(pathname, &buf); 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(res < 0); 318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch stat_to_nacl_stat(&buf, nacl_buf); 319c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 320c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 321c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 32246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int WRAP(truncate)(const char* name, int64_t len) { 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(ki_truncate(name, len)); 324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 325c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 326c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint WRAP(write)(int fd, const void* buf, size_t count, size_t* nwrote) { 327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ssize_t signed_nwrote = ki_write(fd, buf, count); 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *nwrote = static_cast<size_t>(signed_nwrote); 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ERRNO_RTN(signed_nwrote); 330c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 331c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 332c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic void assign_real_pointers() { 333c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static bool assigned = false; 334c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!assigned) { 335c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPAND_SYMBOL_LIST_OPERATION(ASSIGN_REAL_PTR) 336c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch assigned = true; 337c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 339c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define CHECK_REAL(func) \ 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!REAL(func)) { \ 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci assign_real_pointers(); \ 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!REAL(func)) \ 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ENOSYS; \ 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// "real" functions, i.e. the unwrapped original functions. 348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_close(int fd) { 350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(close); 351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(close)(fd); 352c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 354c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid _real_exit(int status) { 355c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch REAL(exit)(status); 356c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 357c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 358c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_fchdir(int fd) { 359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(fchdir); 360c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(fchdir)(fd); 361c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 362c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_fchmod(int fd, mode_t mode) { 364c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(fchmod); 365c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(fchmod)(fd, mode); 366c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 367c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 368c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_fdatasync(int fd) { 369c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(fdatasync); 370c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(fdatasync)(fd); 371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_fstat(int fd, struct stat* buf) { 374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct nacl_abi_stat st; 375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(fstat); 376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int err = REAL(fstat)(fd, (struct stat*)&st); 378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (err) { 379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch errno = err; 380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return -1; 381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_stat_to_stat(&st, buf); 384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_fsync(int fd) { 388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(fsync); 389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(fsync)(fd); 390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_getdents(int fd, void* buf, size_t count, size_t* nread) { 393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // "buf" contains dirent(s); "nacl_buf" contains nacl_abi_dirent(s). 394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // See WRAP(getdents) above. 395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch char* nacl_buf = (char*)alloca(count); 396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch size_t offset = 0; 397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch size_t nacl_offset = 0; 398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch size_t nacl_nread; 399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(getdents); 400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int err = REAL(getdents)(fd, (dirent*)nacl_buf, count, &nacl_nread); 401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (err) 402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return err; 403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch while (nacl_offset < nacl_nread) { 405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch dirent* d = (dirent*)((char*)buf + offset); 406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_abi_dirent* nacl_d = (nacl_abi_dirent*)(nacl_buf + nacl_offset); 407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch d->d_ino = nacl_d->nacl_abi_d_ino; 408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch d->d_off = nacl_d->nacl_abi_d_off; 409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch d->d_reclen = nacl_d->nacl_abi_d_reclen + d_name_shift; 41046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t d_name_len = 41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) nacl_d->nacl_abi_d_reclen - offsetof(nacl_abi_dirent, nacl_abi_d_name); 412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch memcpy(d->d_name, nacl_d->nacl_abi_d_name, d_name_len); 413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch offset += d->d_reclen; 415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch offset += nacl_d->nacl_abi_d_reclen; 416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *nread = offset; 419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 421c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 422c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_isatty(int fd, int* result) { 423c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *result = isatty(fd); 424c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return *result ? 0 : -1; 425c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 426c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_lseek(int fd, int64_t offset, int whence, int64_t* new_offset) { 428c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(seek); 429c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_abi_off_t nacl_new_offs; 430c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int ret = REAL(seek)(fd, offset, whence, &nacl_new_offs); 431c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *new_offset = static_cast<off_t>(nacl_new_offs); 432c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return ret; 433c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 434c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 435c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_lstat(const char* path, struct stat* buf) { 436c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct nacl_abi_stat st; 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK_REAL(lstat); 438c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 43946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int err = REAL(lstat)(path, (struct stat*)&st); 440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (err) { 441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch errno = err; 442c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return -1; 443c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 444c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 445c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch nacl_stat_to_stat(&st, buf); 446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return 0; 447c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 448c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 449c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_mkdir(const char* pathname, mode_t mode) { 450c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(mkdir); 451c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(mkdir)(pathname, mode); 452c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int _real_mmap(void** addr, 45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t length, 45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int prot, 45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int flags, 45846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int fd, 459c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int64_t offset) { 460c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(mmap); 461c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(mmap)(addr, length, prot, flags, fd, offset); 462c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 463c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 464c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_munmap(void* addr, size_t length) { 465c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(munmap); 466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(munmap)(addr, length); 467c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 468c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint _real_open(const char* pathname, int oflag, mode_t mode, int* newfd) { 470c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(open); 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return REAL(open)(pathname, oflag, mode, newfd); 472c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 473c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 474c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_open_resource(const char* file, int* fd) { 475c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(open_resource); 476c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(open_resource)(file, fd); 477c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 47946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int _real_read(int fd, void* buf, size_t count, size_t* nread) { 480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(read); 481c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(read)(fd, buf, count, nread); 482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 483c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int _real_readlink(const char* path, char* buf, size_t count, size_t* nread) { 485c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(readlink); 486c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(readlink)(path, buf, count, nread); 487c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 488c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 489c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_rmdir(const char* pathname) { 490c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(rmdir); 491c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(rmdir)(pathname); 492c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 493c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 494c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint _real_truncate(const char* pathname, int64_t len) { 495c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(truncate); 496c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(truncate)(pathname, len); 497c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 498c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int _real_write(int fd, const void* buf, size_t count, size_t* nwrote) { 500c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch CHECK_REAL(write); 501c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return REAL(write)(fd, buf, count, nwrote); 502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 503c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 50403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)int _real_getcwd(char* pathname, size_t len) { 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK_REAL(getcwd); 50603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return REAL(getcwd)(pathname, len); 50703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 50803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 509c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstatic bool s_wrapped = false; 51003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 511c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid kernel_wrap_init() { 512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (!s_wrapped) { 513c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch assign_real_pointers(); 514c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPAND_SYMBOL_LIST_OPERATION(USE_WRAP) 515c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch s_wrapped = true; 516c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 517c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid kernel_wrap_uninit() { 520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (s_wrapped) { 521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPAND_SYMBOL_LIST_OPERATION(USE_REAL) 522c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch s_wrapped = false; 523c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 524c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 525c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochEXTERN_C_END 527c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 52803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif // defined(__native_client__) && defined(__BIONIC__) 529