1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LIBRARIES_NACL_IO_KERNEL_WRAP_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LIBRARIES_NACL_IO_KERNEL_WRAP_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <assert.h> 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <signal.h> 10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <stdint.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <sys/fcntl.h> 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <sys/ioctl.h> 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <sys/types.h> 15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ossocket.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "nacl_io/ostypes.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "nacl_io/osutime.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/macros.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GLIBC__) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/cdefs.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NOTHROW __THROW 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NOTHROW 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Most kernel intercept functions (ki_*) return -1 and set the global errno. 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// However, the IRT wrappers are expected to return errno on failure. These 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// macros are used in the wrappers to check that the ki_ function actually 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// set errno and to its value. 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define RTN_ERRNO_IF(cond) \ 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (cond) { \ 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) assert(errno != 0); \ 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return errno; \ 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define ERRNO_RTN(cond) \ 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RTN_ERRNO_IF(cond < 0); \ 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int chmod_mode_t; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int getcwd_size_t; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int read_ssize_t; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int write_ssize_t; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NAME(x) _##x 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef mode_t chmod_mode_t; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef size_t getcwd_size_t; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ssize_t read_ssize_t; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ssize_t write_ssize_t; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NAME(x) x 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EXTERN_C_BEGIN 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void kernel_wrap_init(void); 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void kernel_wrap_uninit(void); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(access)(const char* path, int amode) NOTHROW; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(chdir)(const char* path) NOTHROW; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(chmod)(const char* path, chmod_mode_t mode) NOTHROW; 64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint chown(const char* path, uid_t owner, gid_t group) NOTHROW; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(close)(int fd); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(dup)(int oldfd) NOTHROW; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int NAME(dup2)(int oldfd, int newfd) NOTHROW; 68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint fchown(int fd, uid_t owner, gid_t group) NOTHROW; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat32(int fd, struct _stat32* buf); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat64(int fd, struct _stat64* buf); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat32i64(int fd, struct _stat32i64* buf); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat64i32(int fd, struct _stat64i32* buf); 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif !defined(__linux__) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct stat; 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern int fstat(int fd, struct stat* buf) NOTHROW; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int fsync(int fd); 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int ftruncate(int fd, off_t length) NOTHROW; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* NAME(getcwd)(char* buf, getcwd_size_t size) NOTHROW; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* getwd(char* buf) NOTHROW; 82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(__BIONIC__) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int getdents(int fd, void* buf, unsigned int count) NOTHROW; 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct dirent; 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint getdents(unsigned int fd, struct dirent* buf, unsigned int count) NOTHROW; 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(isatty)(int fd) NOTHROW; 89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint lchown(const char* path, uid_t owner, gid_t group) NOTHROW; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int link(const char* oldpath, const char* newpath) NOTHROW; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)off_t NAME(lseek)(int fd, off_t offset, int whence) NOTHROW; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _mkdir(const char* path); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int mkdir(const char* path, mode_t mode) NOTHROW; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void* mmap(void* addr, size_t length, int prot, int flags, int fd, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) off_t offset) NOTHROW; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int mount(const char* source, const char* target, const char* filesystemtype, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long mountflags, const void* data) NOTHROW; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int munmap(void* addr, size_t length) NOTHROW; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(open)(const char* path, int oflag, ...); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)read_ssize_t NAME(read)(int fd, void* buf, size_t nbyte); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int remove(const char* path) NOTHROW; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(rmdir)(const char* path) NOTHROW; 1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)sighandler_t sigset(int sig, sighandler_t disp); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) 108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint setenv(const char* name, const char* value, int overwrite); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat32(const char* path, struct _stat32* buf); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat64(const char* path, struct _stat64* buf); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat32i64(const char* path, struct _stat32i64* buf); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat64i32(const char* path, struct _stat64i32* buf); 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif !defined(__linux__) 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern int stat(const char* path, struct stat* buf) NOTHROW; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int symlink(const char* oldpath, const char* newpath) NOTHROW; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int umount(const char* path) NOTHROW; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(unlink)(const char* path) NOTHROW; 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint utime(const char* filename, const struct utimbuf* times) NOTHROW; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)read_ssize_t NAME(write)(int fd, const void* buf, size_t nbyte); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifdef PROVIDES_SOCKET_API 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Socket Functions 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int accept(int fd, struct sockaddr* addr, socklen_t* len); 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int bind(int fd, const struct sockaddr* addr, socklen_t len); 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int connect(int fd, const struct sockaddr* addr, socklen_t len); 127bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochstruct hostent* gethostbyname(const char* name); 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int getpeername(int fd, struct sockaddr* addr, socklen_t* len); 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int getsockname(int fd, struct sockaddr* addr, socklen_t* len); 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len); 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int listen(int fd, int backlog); 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t recv(int fd, void* buf, size_t len, int flags); 13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t recvfrom(int fd, 13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void* buf, 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t len, 13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int flags, 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) struct sockaddr* addr, 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) socklen_t* addrlen); 139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t recvmsg(int fd, struct msghdr* msg, int flags); 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t send(int fd, const void* buf, size_t len, int flags); 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t sendto(int fd, 14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const void* buf, 14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) size_t len, 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int flags, 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const struct sockaddr* addr, 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) socklen_t addrlen); 147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t sendmsg(int fd, const struct msghdr* msg, int flags); 14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int setsockopt(int fd, int lvl, int optname, const void* optval, socklen_t len); 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int shutdown(int fd, int how); 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int socket(int domain, int type, int protocol); 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int socketpair(int domain, int type, int protocl, int* sv); 152bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif // PROVIDES_SOCKET_API 153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EXTERN_C_END 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // LIBRARIES_NACL_IO_KERNEL_WRAP_H_ 157