| 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-glibc build. | 8 // compiled, even on a non-glibc build. |
| 9 #if defined(__native_client__) && defined(__GLIBC__) | 9 #if defined(__native_client__) && defined(__GLIBC__) |
| 10 | 10 |
| 11 #include "nacl_io/kernel_wrap.h" | 11 #include "nacl_io/kernel_wrap.h" |
| 12 | 12 |
| 13 #include <alloca.h> | 13 #include <alloca.h> |
| 14 #include <assert.h> | 14 #include <assert.h> |
| 15 #include <dirent.h> | 15 #include <dirent.h> |
| 16 #include <errno.h> | 16 #include <errno.h> |
| 17 #include <irt.h> | 17 #include <irt.h> |
| 18 #include <irt_syscalls.h> | 18 #include <irt_syscalls.h> |
| 19 #include <nacl_stat.h> | 19 #include <nacl_stat.h> |
| 20 #include <string.h> | 20 #include <string.h> |
| 21 #include <sys/stat.h> | 21 #include <sys/stat.h> |
| 22 #include <sys/time.h> | 22 #include <sys/time.h> |
| 23 | 23 |
| 24 #include "nacl_io/kernel_intercept.h" | 24 #include "nacl_io/kernel_intercept.h" |
| 25 #include "nacl_io/kernel_wrap_real.h" | 25 #include "nacl_io/kernel_wrap_real.h" |
| 26 #include "nacl_io/log.h" | 26 #include "nacl_io/log.h" |
| 27 #include "nacl_io/osmman.h" | 27 #include "nacl_io/osmman.h" |
| 28 | 28 |
| 29 | |
| 30 namespace { | 29 namespace { |
| 31 | 30 |
| 32 void stat_to_nacl_stat(const struct stat* buf, nacl_abi_stat* nacl_buf) { | 31 void stat_to_nacl_stat(const struct stat* buf, nacl_abi_stat* nacl_buf) { |
| 33 memset(nacl_buf, 0, sizeof(struct nacl_abi_stat)); | 32 memset(nacl_buf, 0, sizeof(struct nacl_abi_stat)); |
| 34 nacl_buf->nacl_abi_st_dev = buf->st_dev; | 33 nacl_buf->nacl_abi_st_dev = buf->st_dev; |
| 35 nacl_buf->nacl_abi_st_ino = buf->st_ino; | 34 nacl_buf->nacl_abi_st_ino = buf->st_ino; |
| 36 nacl_buf->nacl_abi_st_mode = buf->st_mode; | 35 nacl_buf->nacl_abi_st_mode = buf->st_mode; |
| 37 nacl_buf->nacl_abi_st_nlink = buf->st_nlink; | 36 nacl_buf->nacl_abi_st_nlink = buf->st_nlink; |
| 38 nacl_buf->nacl_abi_st_uid = buf->st_uid; | 37 nacl_buf->nacl_abi_st_uid = buf->st_uid; |
| 39 nacl_buf->nacl_abi_st_gid = buf->st_gid; | 38 nacl_buf->nacl_abi_st_gid = buf->st_gid; |
| 40 nacl_buf->nacl_abi_st_rdev = buf->st_rdev; | 39 nacl_buf->nacl_abi_st_rdev = buf->st_rdev; |
| 41 nacl_buf->nacl_abi_st_size = buf->st_size; | 40 nacl_buf->nacl_abi_st_size = buf->st_size; |
| 42 nacl_buf->nacl_abi_st_blksize = buf->st_blksize; | 41 nacl_buf->nacl_abi_st_blksize = buf->st_blksize; |
| 43 nacl_buf->nacl_abi_st_blocks = buf->st_blocks; | 42 nacl_buf->nacl_abi_st_blocks = buf->st_blocks; |
| 44 nacl_buf->nacl_abi_st_atime = buf->st_atime; | 43 nacl_buf->nacl_abi_st_atime = buf->st_atime; |
| 45 nacl_buf->nacl_abi_st_mtime = buf->st_mtime; | 44 nacl_buf->nacl_abi_st_mtime = buf->st_mtime; |
| 46 nacl_buf->nacl_abi_st_ctime = buf->st_ctime; | 45 nacl_buf->nacl_abi_st_ctime = buf->st_ctime; |
| 47 } | 46 } |
| 48 | 47 |
| 49 void nacl_stat_to_stat(const nacl_abi_stat* nacl_buf, struct stat* buf) { | 48 void nacl_stat_to_stat(const nacl_abi_stat* nacl_buf, struct stat* buf) { |
| 50 memset(buf, 0, sizeof(struct stat)); | 49 memset(buf, 0, sizeof(struct stat)); |
| 51 buf->st_dev = nacl_buf->nacl_abi_st_dev; | 50 buf->st_dev = nacl_buf->nacl_abi_st_dev; |
| 52 buf->st_ino = nacl_buf->nacl_abi_st_ino; | 51 buf->st_ino = nacl_buf->nacl_abi_st_ino; |
| 53 buf->st_mode = nacl_buf->nacl_abi_st_mode; | 52 buf->st_mode = nacl_buf->nacl_abi_st_mode; |
| 54 buf->st_nlink = nacl_buf->nacl_abi_st_nlink; | 53 buf->st_nlink = nacl_buf->nacl_abi_st_nlink; |
| 55 buf->st_uid = nacl_buf->nacl_abi_st_uid; | 54 buf->st_uid = nacl_buf->nacl_abi_st_uid; |
| 56 buf->st_gid = nacl_buf->nacl_abi_st_gid; | 55 buf->st_gid = nacl_buf->nacl_abi_st_gid; |
| 57 buf->st_rdev = nacl_buf->nacl_abi_st_rdev; | 56 buf->st_rdev = nacl_buf->nacl_abi_st_rdev; |
| 58 buf->st_size = nacl_buf->nacl_abi_st_size ; | 57 buf->st_size = nacl_buf->nacl_abi_st_size; |
| 59 buf->st_blksize = nacl_buf->nacl_abi_st_blksize; | 58 buf->st_blksize = nacl_buf->nacl_abi_st_blksize; |
| 60 buf->st_blocks = nacl_buf->nacl_abi_st_blocks; | 59 buf->st_blocks = nacl_buf->nacl_abi_st_blocks; |
| 61 buf->st_atime = nacl_buf->nacl_abi_st_atime; | 60 buf->st_atime = nacl_buf->nacl_abi_st_atime; |
| 62 buf->st_mtime = nacl_buf->nacl_abi_st_mtime; | 61 buf->st_mtime = nacl_buf->nacl_abi_st_mtime; |
| 63 buf->st_ctime = nacl_buf->nacl_abi_st_ctime; | 62 buf->st_ctime = nacl_buf->nacl_abi_st_ctime; |
| 64 } | 63 } |
| 65 | 64 |
| 66 } // namespace | 65 } // namespace |
| 67 | 66 |
| 68 // From native_client/src/trusted/service_runtime/include/sys/dirent.h | 67 // From native_client/src/trusted/service_runtime/include/sys/dirent.h |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 | 99 |
| 101 EXTERN_C_BEGIN | 100 EXTERN_C_BEGIN |
| 102 | 101 |
| 103 // Macro to get the REAL function pointer | 102 // Macro to get the REAL function pointer |
| 104 #define REAL(name) __nacl_irt_##name##_real | 103 #define REAL(name) __nacl_irt_##name##_real |
| 105 | 104 |
| 106 // Macro to get the WRAP function | 105 // Macro to get the WRAP function |
| 107 #define WRAP(name) __nacl_irt_##name##_wrap | 106 #define WRAP(name) __nacl_irt_##name##_wrap |
| 108 | 107 |
| 109 // Declare REAL function pointer. | 108 // Declare REAL function pointer. |
| 110 #define DECLARE_REAL_PTR(name) \ | 109 #define DECLARE_REAL_PTR(name) typeof(__nacl_irt_##name) REAL(name); |
| 111 typeof(__nacl_irt_##name) REAL(name); | |
| 112 | 110 |
| 113 // Assign the REAL function pointer. | 111 // Assign the REAL function pointer. |
| 114 #define ASSIGN_REAL_PTR(name) \ | 112 #define ASSIGN_REAL_PTR(name) \ |
| 115 assert(__nacl_irt_##name != NULL); \ | 113 assert(__nacl_irt_##name != NULL); \ |
| 116 REAL(name) = __nacl_irt_##name; | 114 REAL(name) = __nacl_irt_##name; |
| 117 | 115 |
| 118 // Switch IRT's pointer to the REAL pointer | 116 // Switch IRT's pointer to the REAL pointer |
| 119 #define USE_REAL(name) \ | 117 #define USE_REAL(name) __nacl_irt_##name = (typeof(__nacl_irt_##name))REAL(name) |
| 120 __nacl_irt_##name = (typeof(__nacl_irt_##name)) REAL(name) | |
| 121 | 118 |
| 122 // Switch IRT's pointer to the WRAP function | 119 // Switch IRT's pointer to the WRAP function |
| 123 #define USE_WRAP(name) \ | 120 #define USE_WRAP(name) __nacl_irt_##name = (typeof(__nacl_irt_##name))WRAP(name) |
| 124 __nacl_irt_##name = (typeof(__nacl_irt_##name)) WRAP(name) | |
| 125 | 121 |
| 126 #define EXPAND_SYMBOL_LIST_OPERATION(OP) \ | 122 #define EXPAND_SYMBOL_LIST_OPERATION(OP) \ |
| 127 OP(chdir); \ | 123 OP(chdir); \ |
| 128 OP(close); \ | 124 OP(close); \ |
| 129 OP(dup); \ | 125 OP(dup); \ |
| 130 OP(dup2); \ | 126 OP(dup2); \ |
| 131 OP(exit); \ | 127 OP(exit); \ |
| 132 OP(fstat); \ | 128 OP(fstat); \ |
| 133 OP(getcwd); \ | 129 OP(getcwd); \ |
| 134 OP(getdents); \ | 130 OP(getdents); \ |
| 135 OP(mkdir); \ | 131 OP(mkdir); \ |
| 136 OP(open); \ | 132 OP(open); \ |
| 137 OP(poll);\ | 133 OP(poll); \ |
| 138 OP(read); \ | 134 OP(read); \ |
| 139 OP(rmdir); \ | 135 OP(rmdir); \ |
| 140 OP(seek); \ | 136 OP(seek); \ |
| 141 OP(stat); \ | 137 OP(stat); \ |
| 142 OP(select); \ | 138 OP(select); \ |
| 143 OP(write); \ | 139 OP(write); \ |
| 144 OP(mmap); \ | 140 OP(mmap); \ |
| 145 OP(munmap); \ | 141 OP(munmap); \ |
| 146 OP(open_resource); \ | 142 OP(open_resource); \ |
| 147 \ | 143 \ |
| 148 OP(socket); \ | 144 OP(socket); \ |
| 149 OP(accept); \ | 145 OP(accept); \ |
| 150 OP(bind); \ | 146 OP(bind); \ |
| 151 OP(listen); \ | 147 OP(listen); \ |
| 152 OP(connect); \ | 148 OP(connect); \ |
| 153 OP(send); \ | 149 OP(send); \ |
| 154 OP(sendmsg); \ | 150 OP(sendmsg); \ |
| 155 OP(sendto); \ | 151 OP(sendto); \ |
| 156 OP(recv); \ | 152 OP(recv); \ |
| 157 OP(recvmsg); \ | 153 OP(recvmsg); \ |
| 158 OP(recvfrom); \ | 154 OP(recvfrom); \ |
| 159 OP(getpeername); \ | 155 OP(getpeername); \ |
| 160 OP(getsockname); \ | 156 OP(getsockname); \ |
| 161 OP(getsockopt); \ | 157 OP(getsockopt); \ |
| 162 OP(setsockopt); \ | 158 OP(setsockopt); \ |
| 163 OP(socketpair); \ | 159 OP(socketpair); \ |
| 164 OP(shutdown); | 160 OP(shutdown); |
| 165 | 161 |
| 166 // TODO(bradnelson): Add these as well. | 162 // TODO(bradnelson): Add these as well. |
| 167 // OP(epoll_create); | 163 // OP(epoll_create); |
| 168 // OP(epoll_create1); | 164 // OP(epoll_create1); |
| 169 // OP(epoll_ctl); | 165 // OP(epoll_ctl); |
| 170 // OP(epoll_pwait); | 166 // OP(epoll_pwait); |
| 171 // OP(ppoll); | 167 // OP(ppoll); |
| 172 // OP(pselect); | 168 // OP(pselect); |
| 173 // | 169 // |
| (...skipping 18 matching lines...) Expand all Loading... |
| 192 | 188 |
| 193 int WRAP(dup2)(int fd, int newfd) NOTHROW { | 189 int WRAP(dup2)(int fd, int newfd) NOTHROW { |
| 194 RTN_ERRNO_IF(ki_dup2(fd, newfd) < 0); | 190 RTN_ERRNO_IF(ki_dup2(fd, newfd) < 0); |
| 195 return 0; | 191 return 0; |
| 196 } | 192 } |
| 197 | 193 |
| 198 void WRAP(exit)(int status) { | 194 void WRAP(exit)(int status) { |
| 199 ki_exit(status); | 195 ki_exit(status); |
| 200 } | 196 } |
| 201 | 197 |
| 202 int WRAP(fstat)(int fd, struct nacl_abi_stat *nacl_buf) { | 198 int WRAP(fstat)(int fd, struct nacl_abi_stat* nacl_buf) { |
| 203 struct stat buf; | 199 struct stat buf; |
| 204 memset(&buf, 0, sizeof(struct stat)); | 200 memset(&buf, 0, sizeof(struct stat)); |
| 205 int res = ki_fstat(fd, &buf); | 201 int res = ki_fstat(fd, &buf); |
| 206 RTN_ERRNO_IF(res < 0); | 202 RTN_ERRNO_IF(res < 0); |
| 207 stat_to_nacl_stat(&buf, nacl_buf); | 203 stat_to_nacl_stat(&buf, nacl_buf); |
| 208 return 0; | 204 return 0; |
| 209 } | 205 } |
| 210 | 206 |
| 211 int WRAP(getcwd)(char* buf, size_t size) { | 207 int WRAP(getcwd)(char* buf, size_t size) { |
| 212 RTN_ERRNO_IF(ki_getcwd(buf, size) == NULL); | 208 RTN_ERRNO_IF(ki_getcwd(buf, size) == NULL); |
| 213 return 0; | 209 return 0; |
| 214 } | 210 } |
| 215 | 211 |
| 216 int WRAP(getdents)(int fd, dirent* nacl_buf, size_t nacl_count, size_t *nread) { | 212 int WRAP(getdents)(int fd, dirent* nacl_buf, size_t nacl_count, size_t* nread) { |
| 217 int nacl_offset = 0; | 213 int nacl_offset = 0; |
| 218 // "buf" contains dirent(s); "nacl_buf" contains nacl_abi_dirent(s). | 214 // "buf" contains dirent(s); "nacl_buf" contains nacl_abi_dirent(s). |
| 219 // nacl_abi_dirent(s) are smaller than dirent(s), so nacl_count bytes buffer | 215 // nacl_abi_dirent(s) are smaller than dirent(s), so nacl_count bytes buffer |
| 220 // is enough | 216 // is enough |
| 221 char* buf = (char*)alloca(nacl_count); | 217 char* buf = (char*)alloca(nacl_count); |
| 222 int offset = 0; | 218 int offset = 0; |
| 223 int count; | 219 int count; |
| 224 | 220 |
| 225 count = ki_getdents(fd, buf, nacl_count); | 221 count = ki_getdents(fd, buf, nacl_count); |
| 226 RTN_ERRNO_IF(count < 0); | 222 RTN_ERRNO_IF(count < 0); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 240 | 236 |
| 241 *nread = nacl_offset; | 237 *nread = nacl_offset; |
| 242 return 0; | 238 return 0; |
| 243 } | 239 } |
| 244 | 240 |
| 245 int WRAP(mkdir)(const char* pathname, mode_t mode) { | 241 int WRAP(mkdir)(const char* pathname, mode_t mode) { |
| 246 RTN_ERRNO_IF(ki_mkdir(pathname, mode) < 0); | 242 RTN_ERRNO_IF(ki_mkdir(pathname, mode) < 0); |
| 247 return 0; | 243 return 0; |
| 248 } | 244 } |
| 249 | 245 |
| 250 int WRAP(mmap)(void** addr, size_t length, int prot, int flags, int fd, | 246 int WRAP(mmap)(void** addr, |
| 247 size_t length, |
| 248 int prot, |
| 249 int flags, |
| 250 int fd, |
| 251 off_t offset) { | 251 off_t offset) { |
| 252 if (flags & MAP_ANONYMOUS) | 252 if (flags & MAP_ANONYMOUS) |
| 253 return REAL(mmap)(addr, length, prot, flags, fd, offset); | 253 return REAL(mmap)(addr, length, prot, flags, fd, offset); |
| 254 | 254 |
| 255 *addr = ki_mmap(*addr, length, prot, flags, fd, offset); | 255 *addr = ki_mmap(*addr, length, prot, flags, fd, offset); |
| 256 RTN_ERRNO_IF(*addr == (void*)-1); | 256 RTN_ERRNO_IF(*addr == (void*)-1); |
| 257 return 0; | 257 return 0; |
| 258 } | 258 } |
| 259 | 259 |
| 260 int WRAP(munmap)(void* addr, size_t length) { | 260 int WRAP(munmap)(void* addr, size_t length) { |
| 261 // Always let the real munmap run on the address range. It is not an error if | 261 // Always let the real munmap run on the address range. It is not an error if |
| 262 // there are no mapped pages in that range. | 262 // there are no mapped pages in that range. |
| 263 ki_munmap(addr, length); | 263 ki_munmap(addr, length); |
| 264 return REAL(munmap)(addr, length); | 264 return REAL(munmap)(addr, length); |
| 265 } | 265 } |
| 266 | 266 |
| 267 int WRAP(open)(const char* pathname, int oflag, mode_t cmode, int* newfd) { | 267 int WRAP(open)(const char* pathname, int oflag, mode_t cmode, int* newfd) { |
| 268 *newfd = ki_open(pathname, oflag); | 268 *newfd = ki_open(pathname, oflag); |
| 269 RTN_ERRNO_IF(*newfd < 0); | 269 RTN_ERRNO_IF(*newfd < 0); |
| 270 return 0; | 270 return 0; |
| 271 } | 271 } |
| 272 | 272 |
| 273 int WRAP(open_resource)(const char* file, int* fd) { | 273 int WRAP(open_resource)(const char* file, int* fd) { |
| 274 *fd = ki_open_resource(file); | 274 *fd = ki_open_resource(file); |
| 275 RTN_ERRNO_IF(*fd < 0); | 275 RTN_ERRNO_IF(*fd < 0); |
| 276 return 0; | 276 return 0; |
| 277 } | 277 } |
| 278 | 278 |
| 279 int WRAP(poll)(struct pollfd *fds, nfds_t nfds, int timeout, int* count) { | 279 int WRAP(poll)(struct pollfd* fds, nfds_t nfds, int timeout, int* count) { |
| 280 *count = ki_poll(fds, nfds, timeout); | 280 *count = ki_poll(fds, nfds, timeout); |
| 281 RTN_ERRNO_IF(*count < 0); | 281 RTN_ERRNO_IF(*count < 0); |
| 282 return 0; | 282 return 0; |
| 283 } | 283 } |
| 284 | 284 |
| 285 int WRAP(read)(int fd, void *buf, size_t count, size_t *nread) { | 285 int WRAP(read)(int fd, void* buf, size_t count, size_t* nread) { |
| 286 ssize_t signed_nread = ki_read(fd, buf, count); | 286 ssize_t signed_nread = ki_read(fd, buf, count); |
| 287 *nread = static_cast<size_t>(signed_nread); | 287 *nread = static_cast<size_t>(signed_nread); |
| 288 RTN_ERRNO_IF(signed_nread < 0); | 288 RTN_ERRNO_IF(signed_nread < 0); |
| 289 return 0; | 289 return 0; |
| 290 } | 290 } |
| 291 | 291 |
| 292 int WRAP(rmdir)(const char* pathname) { | 292 int WRAP(rmdir)(const char* pathname) { |
| 293 RTN_ERRNO_IF(ki_rmdir(pathname) < 0); | 293 RTN_ERRNO_IF(ki_rmdir(pathname) < 0); |
| 294 return 0; | 294 return 0; |
| 295 } | 295 } |
| 296 | 296 |
| 297 int WRAP(seek)(int fd, off_t offset, int whence, off_t* new_offset) { | 297 int WRAP(seek)(int fd, off_t offset, int whence, off_t* new_offset) { |
| 298 *new_offset = ki_lseek(fd, offset, whence); | 298 *new_offset = ki_lseek(fd, offset, whence); |
| 299 RTN_ERRNO_IF(*new_offset < 0); | 299 RTN_ERRNO_IF(*new_offset < 0); |
| 300 return 0; | 300 return 0; |
| 301 } | 301 } |
| 302 | 302 |
| 303 int WRAP(select)(int nfds, fd_set* readfds, fd_set* writefds, | 303 int WRAP(select)(int nfds, |
| 304 fd_set* exceptfds, struct timeval* timeout, int* count) { | 304 fd_set* readfds, |
| 305 fd_set* writefds, |
| 306 fd_set* exceptfds, |
| 307 struct timeval* timeout, |
| 308 int* count) { |
| 305 *count = ki_select(nfds, readfds, writefds, exceptfds, timeout); | 309 *count = ki_select(nfds, readfds, writefds, exceptfds, timeout); |
| 306 RTN_ERRNO_IF(*count < 0); | 310 RTN_ERRNO_IF(*count < 0); |
| 307 return 0; | 311 return 0; |
| 308 } | 312 } |
| 309 | 313 |
| 310 int WRAP(stat)(const char *pathname, struct nacl_abi_stat *nacl_buf) { | 314 int WRAP(stat)(const char* pathname, struct nacl_abi_stat* nacl_buf) { |
| 311 struct stat buf; | 315 struct stat buf; |
| 312 memset(&buf, 0, sizeof(struct stat)); | 316 memset(&buf, 0, sizeof(struct stat)); |
| 313 int res = ki_stat(pathname, &buf); | 317 int res = ki_stat(pathname, &buf); |
| 314 RTN_ERRNO_IF(res < 0); | 318 RTN_ERRNO_IF(res < 0); |
| 315 stat_to_nacl_stat(&buf, nacl_buf); | 319 stat_to_nacl_stat(&buf, nacl_buf); |
| 316 return 0; | 320 return 0; |
| 317 } | 321 } |
| 318 | 322 |
| 319 int WRAP(write)(int fd, const void* buf, size_t count, size_t* nwrote) { | 323 int WRAP(write)(int fd, const void* buf, size_t count, size_t* nwrote) { |
| 320 ssize_t signed_nwrote = ki_write(fd, buf, count); | 324 ssize_t signed_nwrote = ki_write(fd, buf, count); |
| 321 *nwrote = static_cast<size_t>(signed_nwrote); | 325 *nwrote = static_cast<size_t>(signed_nwrote); |
| 322 RTN_ERRNO_IF(signed_nwrote < 0); | 326 RTN_ERRNO_IF(signed_nwrote < 0); |
| 323 return 0; | 327 return 0; |
| 324 } | 328 } |
| 325 | 329 |
| 326 int WRAP(accept)(int sockfd, struct sockaddr* addr, | 330 int WRAP(accept)(int sockfd, |
| 327 socklen_t* addrlen, int *sd) { | 331 struct sockaddr* addr, |
| 332 socklen_t* addrlen, |
| 333 int* sd) { |
| 328 *sd = ki_accept(sockfd, addr, addrlen); | 334 *sd = ki_accept(sockfd, addr, addrlen); |
| 329 RTN_ERRNO_IF(*sd < 0); | 335 RTN_ERRNO_IF(*sd < 0); |
| 330 return 0; | 336 return 0; |
| 331 } | 337 } |
| 332 | 338 |
| 333 int WRAP(bind)(int sockfd, const struct sockaddr* addr, socklen_t addrlen) { | 339 int WRAP(bind)(int sockfd, const struct sockaddr* addr, socklen_t addrlen) { |
| 334 RTN_ERRNO_IF(ki_bind(sockfd, addr, addrlen) < 0); | 340 RTN_ERRNO_IF(ki_bind(sockfd, addr, addrlen) < 0); |
| 335 return 0; | 341 return 0; |
| 336 } | 342 } |
| 337 | 343 |
| 338 int WRAP(connect)(int sockfd, const struct sockaddr* addr, socklen_t addrlen) { | 344 int WRAP(connect)(int sockfd, const struct sockaddr* addr, socklen_t addrlen) { |
| 339 RTN_ERRNO_IF(ki_connect(sockfd, addr, addrlen) < 0); | 345 RTN_ERRNO_IF(ki_connect(sockfd, addr, addrlen) < 0); |
| 340 return 0; | 346 return 0; |
| 341 } | 347 } |
| 342 | 348 |
| 343 int WRAP(getpeername)(int sockfd, struct sockaddr* addr, socklen_t* addrlen) { | 349 int WRAP(getpeername)(int sockfd, struct sockaddr* addr, socklen_t* addrlen) { |
| 344 RTN_ERRNO_IF(ki_getpeername(sockfd, addr, addrlen) < 0); | 350 RTN_ERRNO_IF(ki_getpeername(sockfd, addr, addrlen) < 0); |
| 345 return 0; | 351 return 0; |
| 346 } | 352 } |
| 347 | 353 |
| 348 int WRAP(getsockname)(int sockfd, struct sockaddr* addr, socklen_t* addrlen) { | 354 int WRAP(getsockname)(int sockfd, struct sockaddr* addr, socklen_t* addrlen) { |
| 349 RTN_ERRNO_IF(ki_getsockname(sockfd, addr, addrlen) < 0); | 355 RTN_ERRNO_IF(ki_getsockname(sockfd, addr, addrlen) < 0); |
| 350 return 0; | 356 return 0; |
| 351 } | 357 } |
| 352 | 358 |
| 353 int WRAP(getsockopt)(int sockfd, int level, int optname, void* optval, | 359 int WRAP(getsockopt)(int sockfd, |
| 360 int level, |
| 361 int optname, |
| 362 void* optval, |
| 354 socklen_t* optlen) { | 363 socklen_t* optlen) { |
| 355 RTN_ERRNO_IF(ki_getsockopt(sockfd, level, optname, optval, optlen) < 0); | 364 RTN_ERRNO_IF(ki_getsockopt(sockfd, level, optname, optval, optlen) < 0); |
| 356 return 0; | 365 return 0; |
| 357 } | 366 } |
| 358 | 367 |
| 359 int WRAP(setsockopt)(int sockfd, int level, int optname, const void* optval, | 368 int WRAP(setsockopt)(int sockfd, |
| 369 int level, |
| 370 int optname, |
| 371 const void* optval, |
| 360 socklen_t optlen) { | 372 socklen_t optlen) { |
| 361 RTN_ERRNO_IF(ki_setsockopt(sockfd, level, optname, optval, optlen) < 0); | 373 RTN_ERRNO_IF(ki_setsockopt(sockfd, level, optname, optval, optlen) < 0); |
| 362 return 0; | 374 return 0; |
| 363 } | 375 } |
| 364 | 376 |
| 365 int WRAP(listen)(int sockfd, int backlog) { | 377 int WRAP(listen)(int sockfd, int backlog) { |
| 366 RTN_ERRNO_IF(ki_listen(sockfd, backlog) < 0); | 378 RTN_ERRNO_IF(ki_listen(sockfd, backlog) < 0); |
| 367 return 0; | 379 return 0; |
| 368 } | 380 } |
| 369 | 381 |
| 370 int WRAP(recv)(int sockfd, void* buf, size_t len, int flags, int* count) { | 382 int WRAP(recv)(int sockfd, void* buf, size_t len, int flags, int* count) { |
| 371 ssize_t signed_nread = ki_recv(sockfd, buf, len, flags); | 383 ssize_t signed_nread = ki_recv(sockfd, buf, len, flags); |
| 372 *count = static_cast<int>(signed_nread); | 384 *count = static_cast<int>(signed_nread); |
| 373 RTN_ERRNO_IF(signed_nread < 0); | 385 RTN_ERRNO_IF(signed_nread < 0); |
| 374 return 0; | 386 return 0; |
| 375 } | 387 } |
| 376 | 388 |
| 377 int WRAP(recvfrom)(int sockfd, void* buf, size_t len, int flags, | 389 int WRAP(recvfrom)(int sockfd, |
| 378 struct sockaddr* addr, socklen_t* addrlen, int* count) { | 390 void* buf, |
| 391 size_t len, |
| 392 int flags, |
| 393 struct sockaddr* addr, |
| 394 socklen_t* addrlen, |
| 395 int* count) { |
| 379 ssize_t signed_nread = ki_recvfrom(sockfd, buf, len, flags, addr, addrlen); | 396 ssize_t signed_nread = ki_recvfrom(sockfd, buf, len, flags, addr, addrlen); |
| 380 *count = static_cast<int>(signed_nread); | 397 *count = static_cast<int>(signed_nread); |
| 381 RTN_ERRNO_IF(signed_nread < 0); | 398 RTN_ERRNO_IF(signed_nread < 0); |
| 382 return 0; | 399 return 0; |
| 383 } | 400 } |
| 384 | 401 |
| 385 int WRAP(recvmsg)(int sockfd, struct msghdr* msg, int flags, int *count) { | 402 int WRAP(recvmsg)(int sockfd, struct msghdr* msg, int flags, int* count) { |
| 386 ssize_t signed_nread = ki_recvmsg(sockfd, msg, flags); | 403 ssize_t signed_nread = ki_recvmsg(sockfd, msg, flags); |
| 387 *count = static_cast<int>(signed_nread); | 404 *count = static_cast<int>(signed_nread); |
| 388 RTN_ERRNO_IF(signed_nread < 0); | 405 RTN_ERRNO_IF(signed_nread < 0); |
| 389 return 0; | 406 return 0; |
| 390 } | 407 } |
| 391 | 408 |
| 392 ssize_t WRAP(send)(int sockfd, const void* buf, size_t len, int flags, | 409 ssize_t WRAP(send)(int sockfd, const void* buf, size_t len, int flags, |
| 393 int* count) { | 410 int* count) { |
| 394 ssize_t signed_nread = ki_send(sockfd, buf, len, flags); | 411 ssize_t signed_nread = ki_send(sockfd, buf, len, flags); |
| 395 *count = static_cast<int>(signed_nread); | 412 *count = static_cast<int>(signed_nread); |
| 396 RTN_ERRNO_IF(signed_nread < 0); | 413 RTN_ERRNO_IF(signed_nread < 0); |
| 397 return 0; | 414 return 0; |
| 398 } | 415 } |
| 399 | 416 |
| 400 ssize_t WRAP(sendto)(int sockfd, const void* buf, size_t len, int flags, | 417 ssize_t WRAP(sendto)(int sockfd, |
| 401 const struct sockaddr* addr, socklen_t addrlen, | 418 const void* buf, |
| 419 size_t len, |
| 420 int flags, |
| 421 const struct sockaddr* addr, |
| 422 socklen_t addrlen, |
| 402 int* count) { | 423 int* count) { |
| 403 ssize_t signed_nread = ki_sendto(sockfd, buf, len, flags, addr, addrlen); | 424 ssize_t signed_nread = ki_sendto(sockfd, buf, len, flags, addr, addrlen); |
| 404 *count = static_cast<int>(signed_nread); | 425 *count = static_cast<int>(signed_nread); |
| 405 RTN_ERRNO_IF(signed_nread < 0); | 426 RTN_ERRNO_IF(signed_nread < 0); |
| 406 return 0; | 427 return 0; |
| 407 } | 428 } |
| 408 | 429 |
| 409 ssize_t WRAP(sendmsg)(int sockfd, const struct msghdr* msg, int flags, | 430 ssize_t WRAP(sendmsg)(int sockfd, |
| 431 const struct msghdr* msg, |
| 432 int flags, |
| 410 int* count) { | 433 int* count) { |
| 411 ssize_t signed_nread = ki_sendmsg(sockfd, msg, flags); | 434 ssize_t signed_nread = ki_sendmsg(sockfd, msg, flags); |
| 412 *count = static_cast<int>(signed_nread); | 435 *count = static_cast<int>(signed_nread); |
| 413 RTN_ERRNO_IF(signed_nread < 0); | 436 RTN_ERRNO_IF(signed_nread < 0); |
| 414 return 0; | 437 return 0; |
| 415 } | 438 } |
| 416 | 439 |
| 417 int WRAP(shutdown)(int sockfd, int how) { | 440 int WRAP(shutdown)(int sockfd, int how) { |
| 418 RTN_ERRNO_IF(ki_shutdown(sockfd, how) < 0); | 441 RTN_ERRNO_IF(ki_shutdown(sockfd, how) < 0); |
| 419 return 0; | 442 return 0; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 432 | 455 |
| 433 static void assign_real_pointers() { | 456 static void assign_real_pointers() { |
| 434 static bool assigned = false; | 457 static bool assigned = false; |
| 435 if (!assigned) { | 458 if (!assigned) { |
| 436 EXPAND_SYMBOL_LIST_OPERATION(ASSIGN_REAL_PTR) | 459 EXPAND_SYMBOL_LIST_OPERATION(ASSIGN_REAL_PTR) |
| 437 assigned = true; | 460 assigned = true; |
| 438 } | 461 } |
| 439 } | 462 } |
| 440 | 463 |
| 441 #define CHECK_REAL(func) \ | 464 #define CHECK_REAL(func) \ |
| 442 if (!REAL(func)) \ | 465 if (!REAL(func)) \ |
| 443 assign_real_pointers(); | 466 assign_real_pointers(); |
| 444 | 467 |
| 445 // "real" functions, i.e. the unwrapped original functions. | 468 // "real" functions, i.e. the unwrapped original functions. |
| 446 | 469 |
| 447 int _real_close(int fd) { | 470 int _real_close(int fd) { |
| 448 CHECK_REAL(close); | 471 CHECK_REAL(close); |
| 449 return REAL(close)(fd); | 472 return REAL(close)(fd); |
| 450 } | 473 } |
| 451 | 474 |
| 452 void _real_exit(int status) { | 475 void _real_exit(int status) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 478 int err = REAL(getdents)(fd, (dirent*)nacl_buf, count, &nacl_nread); | 501 int err = REAL(getdents)(fd, (dirent*)nacl_buf, count, &nacl_nread); |
| 479 if (err) | 502 if (err) |
| 480 return err; | 503 return err; |
| 481 | 504 |
| 482 while (nacl_offset < nacl_nread) { | 505 while (nacl_offset < nacl_nread) { |
| 483 dirent* d = (dirent*)((char*)buf + offset); | 506 dirent* d = (dirent*)((char*)buf + offset); |
| 484 nacl_abi_dirent* nacl_d = (nacl_abi_dirent*)(nacl_buf + nacl_offset); | 507 nacl_abi_dirent* nacl_d = (nacl_abi_dirent*)(nacl_buf + nacl_offset); |
| 485 d->d_ino = nacl_d->nacl_abi_d_ino; | 508 d->d_ino = nacl_d->nacl_abi_d_ino; |
| 486 d->d_off = nacl_d->nacl_abi_d_off; | 509 d->d_off = nacl_d->nacl_abi_d_off; |
| 487 d->d_reclen = nacl_d->nacl_abi_d_reclen + d_name_shift; | 510 d->d_reclen = nacl_d->nacl_abi_d_reclen + d_name_shift; |
| 488 size_t d_name_len = nacl_d->nacl_abi_d_reclen - | 511 size_t d_name_len = |
| 489 offsetof(nacl_abi_dirent, nacl_abi_d_name); | 512 nacl_d->nacl_abi_d_reclen - offsetof(nacl_abi_dirent, nacl_abi_d_name); |
| 490 memcpy(d->d_name, nacl_d->nacl_abi_d_name, d_name_len); | 513 memcpy(d->d_name, nacl_d->nacl_abi_d_name, d_name_len); |
| 491 | 514 |
| 492 offset += d->d_reclen; | 515 offset += d->d_reclen; |
| 493 offset += nacl_d->nacl_abi_d_reclen; | 516 offset += nacl_d->nacl_abi_d_reclen; |
| 494 } | 517 } |
| 495 | 518 |
| 496 *nread = offset; | 519 *nread = offset; |
| 497 return 0; | 520 return 0; |
| 498 } | 521 } |
| 499 | 522 |
| 500 int _real_lseek(int fd, off_t offset, int whence, off_t* new_offset) { | 523 int _real_lseek(int fd, off_t offset, int whence, off_t* new_offset) { |
| 501 CHECK_REAL(seek); | 524 CHECK_REAL(seek); |
| 502 return REAL(seek)(fd, offset, whence, new_offset); | 525 return REAL(seek)(fd, offset, whence, new_offset); |
| 503 } | 526 } |
| 504 | 527 |
| 505 int _real_mkdir(const char* pathname, mode_t mode) { | 528 int _real_mkdir(const char* pathname, mode_t mode) { |
| 506 CHECK_REAL(mkdir); | 529 CHECK_REAL(mkdir); |
| 507 return REAL(mkdir)(pathname, mode); | 530 return REAL(mkdir)(pathname, mode); |
| 508 } | 531 } |
| 509 | 532 |
| 510 int _real_mmap(void** addr, size_t length, int prot, int flags, int fd, | 533 int _real_mmap(void** addr, |
| 534 size_t length, |
| 535 int prot, |
| 536 int flags, |
| 537 int fd, |
| 511 off_t offset) { | 538 off_t offset) { |
| 512 CHECK_REAL(mmap); | 539 CHECK_REAL(mmap); |
| 513 return REAL(mmap)(addr, length, prot, flags, fd, offset); | 540 return REAL(mmap)(addr, length, prot, flags, fd, offset); |
| 514 } | 541 } |
| 515 | 542 |
| 516 int _real_munmap(void* addr, size_t length) { | 543 int _real_munmap(void* addr, size_t length) { |
| 517 CHECK_REAL(munmap); | 544 CHECK_REAL(munmap); |
| 518 return REAL(munmap)(addr, length); | 545 return REAL(munmap)(addr, length); |
| 519 } | 546 } |
| 520 | 547 |
| 521 int _real_open(const char* pathname, int oflag, mode_t cmode, int* newfd) { | 548 int _real_open(const char* pathname, int oflag, mode_t cmode, int* newfd) { |
| 522 CHECK_REAL(open); | 549 CHECK_REAL(open); |
| 523 return REAL(open)(pathname, oflag, cmode, newfd); | 550 return REAL(open)(pathname, oflag, cmode, newfd); |
| 524 } | 551 } |
| 525 | 552 |
| 526 int _real_open_resource(const char* file, int* fd) { | 553 int _real_open_resource(const char* file, int* fd) { |
| 527 CHECK_REAL(open_resource); | 554 CHECK_REAL(open_resource); |
| 528 return REAL(open_resource)(file, fd); | 555 return REAL(open_resource)(file, fd); |
| 529 } | 556 } |
| 530 | 557 |
| 531 int _real_read(int fd, void *buf, size_t count, size_t *nread) { | 558 int _real_read(int fd, void* buf, size_t count, size_t* nread) { |
| 532 CHECK_REAL(read); | 559 CHECK_REAL(read); |
| 533 return REAL(read)(fd, buf, count, nread); | 560 return REAL(read)(fd, buf, count, nread); |
| 534 } | 561 } |
| 535 | 562 |
| 536 int _real_rmdir(const char* pathname) { | 563 int _real_rmdir(const char* pathname) { |
| 537 CHECK_REAL(rmdir); | 564 CHECK_REAL(rmdir); |
| 538 return REAL(rmdir)(pathname); | 565 return REAL(rmdir)(pathname); |
| 539 } | 566 } |
| 540 | 567 |
| 541 int _real_write(int fd, const void *buf, size_t count, size_t *nwrote) { | 568 int _real_write(int fd, const void* buf, size_t count, size_t* nwrote) { |
| 542 CHECK_REAL(write); | 569 CHECK_REAL(write); |
| 543 return REAL(write)(fd, buf, count, nwrote); | 570 return REAL(write)(fd, buf, count, nwrote); |
| 544 } | 571 } |
| 545 | 572 |
| 546 static bool s_wrapped = false; | 573 static bool s_wrapped = false; |
| 547 void kernel_wrap_init() { | 574 void kernel_wrap_init() { |
| 548 if (!s_wrapped) { | 575 if (!s_wrapped) { |
| 549 LOG_TRACE("kernel_wrap_init"); | 576 LOG_TRACE("kernel_wrap_init"); |
| 550 assign_real_pointers(); | 577 assign_real_pointers(); |
| 551 EXPAND_SYMBOL_LIST_OPERATION(USE_WRAP) | 578 EXPAND_SYMBOL_LIST_OPERATION(USE_WRAP) |
| 552 s_wrapped = true; | 579 s_wrapped = true; |
| 553 } | 580 } |
| 554 } | 581 } |
| 555 | 582 |
| 556 void kernel_wrap_uninit() { | 583 void kernel_wrap_uninit() { |
| 557 if (s_wrapped) { | 584 if (s_wrapped) { |
| 558 LOG_TRACE("kernel_wrap_uninit"); | 585 LOG_TRACE("kernel_wrap_uninit"); |
| 559 EXPAND_SYMBOL_LIST_OPERATION(USE_REAL) | 586 EXPAND_SYMBOL_LIST_OPERATION(USE_REAL) |
| 560 s_wrapped = false; | 587 s_wrapped = false; |
| 561 } | 588 } |
| 562 } | 589 } |
| 563 | 590 |
| 564 EXTERN_C_END | 591 EXTERN_C_END |
| 565 | 592 |
| 566 #endif // defined(__native_client__) && defined(__GLIBC__) | 593 #endif // defined(__native_client__) && defined(__GLIBC__) |
| OLD | NEW |