| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <sys/types.h> // Include something that will define __GLIBC__. | 5 #include <sys/types.h> // Include something that will define __GLIBC__. |
| 6 | 6 |
| 7 // The entire file is wrapped in this #if. We do this so this .cc file can be | 7 // The entire file is wrapped in this #if. We do this so this .cc file can be |
| 8 // compiled, even on a non-newlib build. | 8 // compiled, even on a non-newlib build. |
| 9 #if defined(__native_client__) && !defined(__GLIBC__) && !defined(__BIONIC__) | 9 #if defined(__native_client__) && !defined(__GLIBC__) && !defined(__BIONIC__) |
| 10 | 10 |
| 11 #include "nacl_io/kernel_wrap.h" | 11 #include "nacl_io/kernel_wrap.h" |
| 12 | 12 |
| 13 #include <dirent.h> | 13 #include <dirent.h> |
| 14 #include <errno.h> | 14 #include <errno.h> |
| 15 #include <irt.h> | 15 #include <irt.h> |
| 16 #include <irt_dev.h> | 16 #include <irt_dev.h> |
| 17 #include <sys/mman.h> | 17 #include <sys/mman.h> |
| 18 #include <sys/stat.h> | 18 #include <sys/stat.h> |
| 19 #include <sys/time.h> | 19 #include <sys/time.h> |
| 20 | 20 |
| 21 #include "nacl_io/kernel_intercept.h" | 21 #include "nacl_io/kernel_intercept.h" |
| 22 #include "nacl_io/kernel_wrap_real.h" | 22 #include "nacl_io/kernel_wrap_real.h" |
| 23 #include "nacl_io/log.h" |
| 23 | 24 |
| 24 EXTERN_C_BEGIN | 25 EXTERN_C_BEGIN |
| 25 | 26 |
| 26 // Macro to get the REAL function pointer | 27 // Macro to get the REAL function pointer |
| 27 #define REAL(name) __nacl_irt_##name##_real | 28 #define REAL(name) __nacl_irt_##name##_real |
| 28 | 29 |
| 29 // Macro to get the WRAP function | 30 // Macro to get the WRAP function |
| 30 #define WRAP(name) __nacl_irt_##name##_wrap | 31 #define WRAP(name) __nacl_irt_##name##_wrap |
| 31 | 32 |
| 32 // Declare REAL function pointer. | 33 // Declare REAL function pointer. |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 OP(dev_filename, link); \ | 83 OP(dev_filename, link); \ |
| 83 OP(dev_filename, rename); \ | 84 OP(dev_filename, rename); \ |
| 84 OP(dev_filename, symlink); \ | 85 OP(dev_filename, symlink); \ |
| 85 OP(dev_filename, chmod); \ | 86 OP(dev_filename, chmod); \ |
| 86 OP(dev_filename, access); \ | 87 OP(dev_filename, access); \ |
| 87 OP(dev_filename, readlink); \ | 88 OP(dev_filename, readlink); \ |
| 88 OP(dev_filename, utimes); \ | 89 OP(dev_filename, utimes); \ |
| 89 OP(memory, mmap); \ | 90 OP(memory, mmap); \ |
| 90 OP(memory, munmap); | 91 OP(memory, munmap); |
| 91 | 92 |
| 92 | |
| 93 EXPAND_SYMBOL_LIST_OPERATION(DECLARE_REAL_PTR); | 93 EXPAND_SYMBOL_LIST_OPERATION(DECLARE_REAL_PTR); |
| 94 | 94 |
| 95 int WRAP(close)(int fd) { | 95 int WRAP(close)(int fd) { |
| 96 return (ki_close(fd) < 0) ? errno : 0; | 96 ERRNO_RTN(ki_close(fd)); |
| 97 } | 97 } |
| 98 | 98 |
| 99 int WRAP(dup)(int fd, int* newfd) { | 99 int WRAP(dup)(int fd, int* newfd) { |
| 100 *newfd = ki_dup(fd); | 100 *newfd = ki_dup(fd); |
| 101 return (*newfd < 0) ? errno : 0; | 101 ERRNO_RTN(*newfd); |
| 102 } | 102 } |
| 103 | 103 |
| 104 int WRAP(dup2)(int fd, int newfd) { | 104 int WRAP(dup2)(int fd, int newfd) { |
| 105 newfd = ki_dup2(fd, newfd); | 105 newfd = ki_dup2(fd, newfd); |
| 106 return (newfd < 0) ? errno : 0; | 106 ERRNO_RTN(newfd); |
| 107 } | 107 } |
| 108 | 108 |
| 109 void WRAP(exit)(int status) { | 109 void WRAP(exit)(int status) { |
| 110 ki_exit(status); | 110 ki_exit(status); |
| 111 } | 111 } |
| 112 | 112 |
| 113 int WRAP(read)(int fd, void* buf, size_t count, size_t* nread) { | 113 int WRAP(read)(int fd, void* buf, size_t count, size_t* nread) { |
| 114 ssize_t signed_nread = ki_read(fd, buf, count); | 114 ssize_t signed_nread = ki_read(fd, buf, count); |
| 115 *nread = static_cast<size_t>(signed_nread); | 115 *nread = static_cast<size_t>(signed_nread); |
| 116 return (signed_nread < 0) ? errno : 0; | 116 ERRNO_RTN(signed_nread); |
| 117 } | 117 } |
| 118 | 118 |
| 119 int WRAP(write)(int fd, const void* buf, size_t count, size_t* nwrote) { | 119 int WRAP(write)(int fd, const void* buf, size_t count, size_t* nwrote) { |
| 120 ssize_t signed_nwrote = ki_write(fd, buf, count); | 120 ssize_t signed_nwrote = ki_write(fd, buf, count); |
| 121 *nwrote = static_cast<size_t>(signed_nwrote); | 121 *nwrote = static_cast<size_t>(signed_nwrote); |
| 122 return (signed_nwrote < 0) ? errno : 0; | 122 ERRNO_RTN(signed_nwrote); |
| 123 } | 123 } |
| 124 | 124 |
| 125 int WRAP(seek)(int fd, off_t offset, int whence, off_t* new_offset) { | 125 int WRAP(seek)(int fd, off_t offset, int whence, off_t* new_offset) { |
| 126 *new_offset = ki_lseek(fd, offset, whence); | 126 *new_offset = ki_lseek(fd, offset, whence); |
| 127 return (*new_offset < 0) ? errno : 0; | 127 ERRNO_RTN(*new_offset); |
| 128 } | 128 } |
| 129 | 129 |
| 130 int WRAP(fstat)(int fd, struct stat* buf) { | 130 int WRAP(fstat)(int fd, struct stat* buf) { |
| 131 return (ki_fstat(fd, buf) < 0) ? errno : 0; | 131 ERRNO_RTN(ki_fstat(fd, buf)); |
| 132 } | 132 } |
| 133 | 133 |
| 134 int WRAP(getdents)(int fd, dirent* buf, size_t count, size_t* nread) { | 134 int WRAP(getdents)(int fd, dirent* buf, size_t count, size_t* nread) { |
| 135 int rtn = ki_getdents(fd, buf, count); | 135 int rtn = ki_getdents(fd, buf, count); |
| 136 if (rtn < 0) | 136 RTN_ERRNO_IF(rtn < 0); |
| 137 return errno; | |
| 138 *nread = rtn; | 137 *nread = rtn; |
| 139 return 0; | 138 return 0; |
| 140 } | 139 } |
| 141 | 140 |
| 142 int WRAP(fchdir)(int fd) { | 141 int WRAP(fchdir)(int fd) { |
| 143 return (ki_fchdir(fd) < 0) ? errno : 0; | 142 ERRNO_RTN(ki_fchdir(fd)); |
| 144 } | 143 } |
| 145 | 144 |
| 146 int WRAP(fchmod)(int fd, mode_t mode) { | 145 int WRAP(fchmod)(int fd, mode_t mode) { |
| 147 return (ki_fchmod(fd, mode) < 0) ? errno : 0; | 146 ERRNO_RTN(ki_fchmod(fd, mode)); |
| 148 } | 147 } |
| 149 | 148 |
| 150 int WRAP(fsync)(int fd) { | 149 int WRAP(fsync)(int fd) { |
| 151 return (ki_fsync(fd) < 0) ? errno : 0; | 150 ERRNO_RTN(ki_fsync(fd)); |
| 152 } | 151 } |
| 153 | 152 |
| 154 int WRAP(fdatasync)(int fd) { | 153 int WRAP(fdatasync)(int fd) { |
| 155 return (ki_fdatasync(fd) < 0) ? errno : 0; | 154 ERRNO_RTN(ki_fdatasync(fd)); |
| 156 } | 155 } |
| 157 | 156 |
| 158 int WRAP(ftruncate)(int fd, off_t length) { | 157 int WRAP(ftruncate)(int fd, off_t length) { |
| 159 return (ki_ftruncate(fd, length) < 0) ? errno : 0; | 158 ERRNO_RTN(ki_ftruncate(fd, length)); |
| 160 } | 159 } |
| 161 | 160 |
| 162 int WRAP(isatty)(int fd, int* result) { | 161 int WRAP(isatty)(int fd, int* result) { |
| 163 *result = ki_isatty(fd); | 162 *result = ki_isatty(fd); |
| 164 if (*result == 0) | 163 RTN_ERRNO_IF(*result == 0); |
| 165 return errno; | |
| 166 return 0; | 164 return 0; |
| 167 } | 165 } |
| 168 | 166 |
| 169 int WRAP(mmap)(void** addr, size_t length, int prot, int flags, int fd, | 167 int WRAP(mmap)(void** addr, size_t length, int prot, int flags, int fd, |
| 170 off_t offset) { | 168 off_t offset) { |
| 171 if (flags & MAP_ANONYMOUS) | 169 if (flags & MAP_ANONYMOUS) |
| 172 return REAL(mmap)(addr, length, prot, flags, fd, offset); | 170 return REAL(mmap)(addr, length, prot, flags, fd, offset); |
| 173 | 171 |
| 174 *addr = ki_mmap(*addr, length, prot, flags, fd, offset); | 172 *addr = ki_mmap(*addr, length, prot, flags, fd, offset); |
| 175 return *addr == (void*)-1 ? errno : 0; | 173 RTN_ERRNO_IF(*addr == (void*)-1); |
| 174 return 0; |
| 176 } | 175 } |
| 177 | 176 |
| 178 int WRAP(munmap)(void* addr, size_t length) { | 177 int WRAP(munmap)(void* addr, size_t length) { |
| 179 // Always let the real munmap run on the address range. It is not an error if | 178 // Always let the real munmap run on the address range. It is not an error if |
| 180 // there are no mapped pages in that range. | 179 // there are no mapped pages in that range. |
| 181 ki_munmap(addr, length); | 180 ki_munmap(addr, length); |
| 182 return REAL(munmap)(addr, length); | 181 return REAL(munmap)(addr, length); |
| 183 } | 182 } |
| 184 | 183 |
| 185 int WRAP(open)(const char* pathname, int oflag, mode_t cmode, int* newfd) { | 184 int WRAP(open)(const char* pathname, int oflag, mode_t cmode, int* newfd) { |
| 186 *newfd = ki_open(pathname, oflag); | 185 *newfd = ki_open(pathname, oflag); |
| 187 return (*newfd < 0) ? errno : 0; | 186 ERRNO_RTN(*newfd); |
| 188 } | 187 } |
| 189 | 188 |
| 190 int WRAP(stat)(const char* pathname, struct stat* buf) { | 189 int WRAP(stat)(const char* pathname, struct stat* buf) { |
| 191 return (ki_stat(pathname, buf) < 0) ? errno : 0; | 190 ERRNO_RTN(ki_stat(pathname, buf)); |
| 192 } | 191 } |
| 193 | 192 |
| 194 int WRAP(mkdir)(const char* pathname, mode_t mode) { | 193 int WRAP(mkdir)(const char* pathname, mode_t mode) { |
| 195 return (ki_mkdir(pathname, mode) < 0) ? errno : 0; | 194 ERRNO_RTN(ki_mkdir(pathname, mode)); |
| 196 } | 195 } |
| 197 | 196 |
| 198 int WRAP(rmdir)(const char* pathname) { | 197 int WRAP(rmdir)(const char* pathname) { |
| 199 return (ki_rmdir(pathname) < 0) ? errno : 0; | 198 ERRNO_RTN(ki_rmdir(pathname)); |
| 200 } | 199 } |
| 201 | 200 |
| 202 int WRAP(chdir)(const char* pathname) { | 201 int WRAP(chdir)(const char* pathname) { |
| 203 return (ki_chdir(pathname) < 0) ? errno : 0; | 202 ERRNO_RTN(ki_chdir(pathname)); |
| 204 } | 203 } |
| 205 | 204 |
| 206 int WRAP(getcwd)(char* pathname, size_t len) { | 205 int WRAP(getcwd)(char* pathname, size_t len) { |
| 207 char* rtn = ki_getcwd(pathname, len); | 206 char* rtn = ki_getcwd(pathname, len); |
| 208 if (NULL == rtn) | 207 RTN_ERRNO_IF(NULL == rtn); |
| 209 return errno; | |
| 210 return 0; | 208 return 0; |
| 211 } | 209 } |
| 212 | 210 |
| 213 int WRAP(unlink)(const char* pathname) { | 211 int WRAP(unlink)(const char* pathname) { |
| 214 return (ki_unlink(pathname) < 0) ? errno : 0; | 212 ERRNO_RTN(ki_unlink(pathname)); |
| 215 } | 213 } |
| 216 | 214 |
| 217 int WRAP(truncate)(const char* pathname, off_t length) { | 215 int WRAP(truncate)(const char* pathname, off_t length) { |
| 218 return (ki_truncate(pathname, length) < 0) ? errno : 0; | 216 ERRNO_RTN(ki_truncate(pathname, length)); |
| 219 } | 217 } |
| 220 | 218 |
| 221 int WRAP(lstat)(const char* pathname, struct stat* buf) { | 219 int WRAP(lstat)(const char* pathname, struct stat* buf) { |
| 222 return (ki_lstat(pathname, buf) < 0) ? errno : 0; | 220 ERRNO_RTN(ki_lstat(pathname, buf)); |
| 223 } | 221 } |
| 224 | 222 |
| 225 int WRAP(link)(const char* pathname, const char* newpath) { | 223 int WRAP(link)(const char* pathname, const char* newpath) { |
| 226 return (ki_link(pathname, newpath) < 0) ? errno : 0; | 224 ERRNO_RTN(ki_link(pathname, newpath)); |
| 227 } | 225 } |
| 228 | 226 |
| 229 int WRAP(rename)(const char* pathname, const char* newpath) { | 227 int WRAP(rename)(const char* pathname, const char* newpath) { |
| 230 return (ki_rename(pathname, newpath) < 0) ? errno : 0; | 228 ERRNO_RTN(ki_rename(pathname, newpath)); |
| 231 } | 229 } |
| 232 | 230 |
| 233 int WRAP(symlink)(const char* pathname, const char* newpath) { | 231 int WRAP(symlink)(const char* pathname, const char* newpath) { |
| 234 return (ki_symlink(pathname, newpath) < 0) ? errno : 0; | 232 ERRNO_RTN(ki_symlink(pathname, newpath)); |
| 235 } | 233 } |
| 236 | 234 |
| 237 int WRAP(chmod)(const char* pathname, mode_t mode) { | 235 int WRAP(chmod)(const char* pathname, mode_t mode) { |
| 238 return (ki_chmod(pathname, mode) < 0) ? errno : 0; | 236 ERRNO_RTN(ki_chmod(pathname, mode)); |
| 239 } | 237 } |
| 240 | 238 |
| 241 int WRAP(access)(const char* pathname, int amode) { | 239 int WRAP(access)(const char* pathname, int amode) { |
| 242 return (ki_access(pathname, amode) < 0) ? errno : 0; | 240 ERRNO_RTN(ki_access(pathname, amode)); |
| 243 } | 241 } |
| 244 | 242 |
| 245 int WRAP(readlink)(const char* pathname, char *buf, | 243 int WRAP(readlink)(const char* pathname, char *buf, |
| 246 size_t count, size_t *nread) { | 244 size_t count, size_t *nread) { |
| 247 int rtn = ki_readlink(pathname, buf, count); | 245 int rtn = ki_readlink(pathname, buf, count); |
| 248 if (rtn < 0) | 246 RTN_ERRNO_IF(rtn < 0); |
| 249 return errno; | |
| 250 *nread = rtn; | 247 *nread = rtn; |
| 251 return 0; | 248 return 0; |
| 252 } | 249 } |
| 253 | 250 |
| 254 int WRAP(utimes)(const char* pathname, const struct timeval times[2]) { | 251 int WRAP(utimes)(const char* pathname, const struct timeval times[2]) { |
| 255 return (ki_utimes(pathname, times) < 0) ? errno : 0; | 252 ERRNO_RTN(ki_utimes(pathname, times)); |
| 256 } | 253 } |
| 257 | 254 |
| 258 static void assign_real_pointers() { | 255 static void assign_real_pointers() { |
| 259 static bool assigned = false; | 256 static bool assigned = false; |
| 260 if (!assigned) { | 257 if (!assigned) { |
| 261 __libnacl_irt_dev_filename_init(); | 258 __libnacl_irt_dev_filename_init(); |
| 262 EXPAND_SYMBOL_LIST_OPERATION(ASSIGN_REAL_PTR) | 259 EXPAND_SYMBOL_LIST_OPERATION(ASSIGN_REAL_PTR) |
| 263 assigned = true; | 260 assigned = true; |
| 264 } | 261 } |
| 265 } | 262 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 | 332 |
| 336 int _real_write(int fd, const void* buf, size_t count, size_t* nwrote) { | 333 int _real_write(int fd, const void* buf, size_t count, size_t* nwrote) { |
| 337 CHECK_REAL(write); | 334 CHECK_REAL(write); |
| 338 return REAL(write)(fd, buf, count, nwrote); | 335 return REAL(write)(fd, buf, count, nwrote); |
| 339 } | 336 } |
| 340 | 337 |
| 341 static bool s_wrapped = false; | 338 static bool s_wrapped = false; |
| 342 | 339 |
| 343 void kernel_wrap_init() { | 340 void kernel_wrap_init() { |
| 344 if (!s_wrapped) { | 341 if (!s_wrapped) { |
| 342 LOG_TRACE("kernel_wrap_init"); |
| 345 assign_real_pointers(); | 343 assign_real_pointers(); |
| 346 EXPAND_SYMBOL_LIST_OPERATION(USE_WRAP) | 344 EXPAND_SYMBOL_LIST_OPERATION(USE_WRAP) |
| 347 s_wrapped = true; | 345 s_wrapped = true; |
| 348 } | 346 } |
| 349 } | 347 } |
| 350 | 348 |
| 351 void kernel_wrap_uninit() { | 349 void kernel_wrap_uninit() { |
| 352 if (s_wrapped) { | 350 if (s_wrapped) { |
| 351 LOG_TRACE("kernel_wrap_uninit"); |
| 353 EXPAND_SYMBOL_LIST_OPERATION(USE_REAL) | 352 EXPAND_SYMBOL_LIST_OPERATION(USE_REAL) |
| 354 s_wrapped = false; | 353 s_wrapped = false; |
| 355 } | 354 } |
| 356 } | 355 } |
| 357 | 356 |
| 358 EXTERN_C_END | 357 EXTERN_C_END |
| 359 | 358 |
| 360 #endif // defined(__native_client__) && !defined(__GLIBC__) ... | 359 #endif // defined(__native_client__) && !defined(__GLIBC__) ... |
| OLD | NEW |