1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. */ 4 5 #ifndef LIBRARIES_NACL_IO_KERNEL_INTERCEPT_H_ 6 #define LIBRARIES_NACL_IO_KERNEL_INTERCEPT_H_ 7 8 #include <stdarg.h> 9 #include <sys/time.h> 10 11 #include <ppapi/c/ppb.h> 12 #include <ppapi/c/pp_instance.h> 13 14 #include "nacl_io/ossignal.h" 15 #include "nacl_io/ossocket.h" 16 #include "nacl_io/osstat.h" 17 #include "nacl_io/ostermios.h" 18 #include "nacl_io/ostypes.h" 19 #include "nacl_io/osutime.h" 20 #include "sdk_util/macros.h" 21 22 EXTERN_C_BEGIN 23 24 #ifdef __cplusplus 25 namespace nacl_io { 26 class KernelProxy; 27 } 28 #endif 29 30 struct fuse_operations; 31 32 /* 33 * The kernel intercept module provides a C->C++ thunk between the libc 34 * kernel calls and the KernelProxy singleton. 35 */ 36 37 /* 38 * ki_init must be called with an uninitialized KernelProxy object. Calling 39 * with NULL will instantiate a default kernel proxy object. ki_init must 40 * be called before any other ki_XXX function can be used. 41 */ 42 int ki_init(void* kernel_proxy); 43 44 /* 45 * Saves the current internal state. This is used by test code which can 46 * use this to save the current state before calling ki_init(). The 47 * pushed state is restored in the next call to ki_uninit(). 48 */ 49 int ki_push_state_for_testing(void); 50 51 int ki_init_ppapi(void* kernel_proxy, 52 PP_Instance instance, 53 PPB_GetInterface get_browser_interface); 54 55 /* 56 * ki_init_interface() is a variant of ki_init() that can be called with 57 * a PepperInterface object. 58 */ 59 int ki_init_interface(void* kernel_proxy, void* pepper_interface); 60 61 #ifdef __cplusplus 62 nacl_io::KernelProxy* ki_get_proxy(); 63 #endif 64 65 int ki_is_initialized(void); 66 void ki_uninit(void); 67 68 int ki_chdir(const char* path); 69 void ki_exit(int status); 70 char* ki_getcwd(char* buf, size_t size); 71 char* ki_getwd(char* buf); 72 int ki_dup(int oldfd); 73 int ki_dup2(int oldfd, int newfd); 74 int ki_chmod(const char* path, mode_t mode); 75 int ki_fchdir(int fd); 76 int ki_fchmod(int fd, mode_t mode); 77 int ki_stat(const char* path, struct stat* buf); 78 int ki_mkdir(const char* path, mode_t mode); 79 int ki_rmdir(const char* path); 80 int ki_mount(const char* source, 81 const char* target, 82 const char* filesystemtype, 83 unsigned long mountflags, 84 const void* data); 85 int ki_umount(const char* path); 86 int ki_open(const char* path, int oflag); 87 int ki_pipe(int pipefds[2]); 88 ssize_t ki_read(int fd, void* buf, size_t nbyte); 89 ssize_t ki_write(int fd, const void* buf, size_t nbyte); 90 int ki_fstat(int fd, struct stat* buf); 91 int ki_getdents(int fd, void* buf, unsigned int count); 92 int ki_fsync(int fd); 93 int ki_fdatasync(int fd); 94 int ki_ftruncate(int fd, off_t length); 95 int ki_isatty(int fd); 96 int ki_close(int fd); 97 off_t ki_lseek(int fd, off_t offset, int whence); 98 int ki_remove(const char* path); 99 int ki_unlink(const char* path); 100 int ki_truncate(const char* path, off_t length); 101 int ki_lstat(const char* path, struct stat* buf); 102 int ki_link(const char* oldpath, const char* newpath); 103 int ki_rename(const char* oldpath, const char* newpath); 104 int ki_symlink(const char* oldpath, const char* newpath); 105 int ki_access(const char* path, int amode); 106 int ki_readlink(const char* path, char* buf, size_t count); 107 int ki_utimes(const char* path, const struct timeval times[2]); 108 void* ki_mmap(void* addr, 109 size_t length, 110 int prot, 111 int flags, 112 int fd, 113 off_t offset); 114 int ki_munmap(void* addr, size_t length); 115 int ki_open_resource(const char* file); 116 int ki_fcntl(int d, int request, va_list args); 117 int ki_ioctl(int d, int request, va_list args); 118 int ki_chown(const char* path, uid_t owner, gid_t group); 119 int ki_fchown(int fd, uid_t owner, gid_t group); 120 int ki_lchown(const char* path, uid_t owner, gid_t group); 121 int ki_utime(const char* filename, const struct utimbuf* times); 122 123 int ki_poll(struct pollfd* fds, nfds_t nfds, int timeout); 124 int ki_select(int nfds, 125 fd_set* readfds, 126 fd_set* writefds, 127 fd_set* exceptfds, 128 struct timeval* timeout); 129 130 int ki_tcflush(int fd, int queue_selector); 131 int ki_tcgetattr(int fd, struct termios* termios_p); 132 int ki_tcsetattr(int fd, int optional_actions, const struct termios* termios_p); 133 int ki_kill(pid_t pid, int sig); 134 int ki_killpg(pid_t pid, int sig); 135 int ki_sigaction(int signum, 136 const struct sigaction* action, 137 struct sigaction* oaction); 138 int ki_sigpause(int sigmask); 139 int ki_sigpending(sigset_t* set); 140 int ki_sigsuspend(const sigset_t* set); 141 sighandler_t ki_signal(int signum, sighandler_t handler); 142 sighandler_t ki_sigset(int signum, sighandler_t handler); 143 144 #ifdef PROVIDES_SOCKET_API 145 /* Socket Functions */ 146 int ki_accept(int fd, struct sockaddr* addr, socklen_t* len); 147 int ki_bind(int fd, const struct sockaddr* addr, socklen_t len); 148 int ki_connect(int fd, const struct sockaddr* addr, socklen_t len); 149 void ki_freeaddrinfo(struct addrinfo* res); 150 int ki_getaddrinfo(const char* node, 151 const char* service, 152 const struct addrinfo* hints, 153 struct addrinfo** res); 154 struct hostent* ki_gethostbyname(const char* name); 155 int ki_getpeername(int fd, struct sockaddr* addr, socklen_t* len); 156 int ki_getsockname(int fd, struct sockaddr* addr, socklen_t* len); 157 int ki_getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len); 158 int ki_listen(int fd, int backlog); 159 ssize_t ki_recv(int fd, void* buf, size_t len, int flags); 160 ssize_t ki_recvfrom(int fd, 161 void* buf, 162 size_t len, 163 int flags, 164 struct sockaddr* addr, 165 socklen_t* addrlen); 166 ssize_t ki_recvmsg(int fd, struct msghdr* msg, int flags); 167 ssize_t ki_send(int fd, const void* buf, size_t len, int flags); 168 ssize_t ki_sendto(int fd, 169 const void* buf, 170 size_t len, 171 int flags, 172 const struct sockaddr* addr, 173 socklen_t addrlen); 174 ssize_t ki_sendmsg(int fd, const struct msghdr* msg, int flags); 175 int ki_setsockopt(int fd, 176 int lvl, 177 int optname, 178 const void* optval, 179 socklen_t len); 180 int ki_shutdown(int fd, int how); 181 int ki_socket(int domain, int type, int protocol); 182 int ki_socketpair(int domain, int type, int protocl, int* sv); 183 #endif /* PROVIDES_SOCKET_API */ 184 185 EXTERN_C_END 186 187 #endif /* LIBRARIES_NACL_IO_KERNEL_INTERCEPT_H_ */ 188