Home | History | Annotate | Download | only in nacl_io
      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