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_WRAP_H_
      6 #define LIBRARIES_NACL_IO_KERNEL_WRAP_H_
      7 
      8 #include <assert.h>
      9 #include <signal.h>
     10 #include <stdint.h>
     11 #include <stdlib.h>
     12 #include <sys/fcntl.h>
     13 #include <sys/ioctl.h>
     14 #include <sys/types.h>
     15 
     16 #include "nacl_io/ossocket.h"
     17 #include "nacl_io/ostypes.h"
     18 #include "nacl_io/osutime.h"
     19 #include "sdk_util/macros.h"
     20 
     21 #if defined(__GLIBC__)
     22 #include <sys/cdefs.h>
     23 #define NOTHROW __THROW
     24 #else
     25 #define NOTHROW
     26 #endif
     27 
     28 // Most kernel intercept functions (ki_*) return -1 and set the global errno.
     29 // However, the IRT wrappers are expected to return errno on failure. These
     30 // macros are used in the wrappers to check that the ki_ function actually
     31 // set errno and to its value.
     32 #define RTN_ERRNO_IF(cond) \
     33   if (cond) {              \
     34     assert(errno != 0);    \
     35     return errno;          \
     36   }
     37 
     38 #define ERRNO_RTN(cond)   \
     39   RTN_ERRNO_IF(cond < 0); \
     40   return 0;
     41 
     42 #if defined(WIN32)
     43 typedef int chmod_mode_t;
     44 typedef int getcwd_size_t;
     45 typedef int read_ssize_t;
     46 typedef int write_ssize_t;
     47 #define NAME(x) _##x
     48 #else
     49 typedef mode_t chmod_mode_t;
     50 typedef size_t getcwd_size_t;
     51 typedef ssize_t read_ssize_t;
     52 typedef ssize_t write_ssize_t;
     53 #define NAME(x) x
     54 #endif
     55 
     56 EXTERN_C_BEGIN
     57 
     58 void kernel_wrap_init(void);
     59 void kernel_wrap_uninit(void);
     60 
     61 int NAME(access)(const char* path, int amode) NOTHROW;
     62 int NAME(chdir)(const char* path) NOTHROW;
     63 int NAME(chmod)(const char* path, chmod_mode_t mode) NOTHROW;
     64 int chown(const char* path, uid_t owner, gid_t group) NOTHROW;
     65 int NAME(close)(int fd);
     66 int NAME(dup)(int oldfd) NOTHROW;
     67 int NAME(dup2)(int oldfd, int newfd) NOTHROW;
     68 int fchown(int fd, uid_t owner, gid_t group) NOTHROW;
     69 #if defined(WIN32)
     70 int _fstat32(int fd, struct _stat32* buf);
     71 int _fstat64(int fd, struct _stat64* buf);
     72 int _fstat32i64(int fd, struct _stat32i64* buf);
     73 int _fstat64i32(int fd, struct _stat64i32* buf);
     74 #elif !defined(__linux__)
     75 struct stat;
     76 extern int fstat(int fd, struct stat* buf) NOTHROW;
     77 #endif
     78 int fsync(int fd);
     79 int ftruncate(int fd, off_t length) NOTHROW;
     80 char* NAME(getcwd)(char* buf, getcwd_size_t size) NOTHROW;
     81 char* getwd(char* buf) NOTHROW;
     82 #if !defined(__BIONIC__)
     83 int getdents(int fd, void* buf, unsigned int count) NOTHROW;
     84 #else
     85 struct dirent;
     86 int getdents(unsigned int fd, struct dirent* buf, unsigned int count) NOTHROW;
     87 #endif
     88 int NAME(isatty)(int fd) NOTHROW;
     89 int lchown(const char* path, uid_t owner, gid_t group) NOTHROW;
     90 int link(const char* oldpath, const char* newpath) NOTHROW;
     91 off_t NAME(lseek)(int fd, off_t offset, int whence) NOTHROW;
     92 #if defined(WIN32)
     93 int _mkdir(const char* path);
     94 #else
     95 int mkdir(const char* path, mode_t mode) NOTHROW;
     96 #endif
     97 void* mmap(void* addr, size_t length, int prot, int flags, int fd,
     98            off_t offset) NOTHROW;
     99 int mount(const char* source, const char* target, const char* filesystemtype,
    100           unsigned long mountflags, const void* data) NOTHROW;
    101 int munmap(void* addr, size_t length) NOTHROW;
    102 int NAME(open)(const char* path, int oflag, ...);
    103 read_ssize_t NAME(read)(int fd, void* buf, size_t nbyte);
    104 int remove(const char* path) NOTHROW;
    105 int NAME(rmdir)(const char* path) NOTHROW;
    106 sighandler_t sigset(int sig, sighandler_t disp);
    107 #if defined(WIN32)
    108 int setenv(const char* name, const char* value, int overwrite);
    109 int _stat32(const char* path, struct _stat32* buf);
    110 int _stat64(const char* path, struct _stat64* buf);
    111 int _stat32i64(const char* path, struct _stat32i64* buf);
    112 int _stat64i32(const char* path, struct _stat64i32* buf);
    113 #elif !defined(__linux__)
    114 extern int stat(const char* path, struct stat* buf) NOTHROW;
    115 #endif
    116 int symlink(const char* oldpath, const char* newpath) NOTHROW;
    117 int umount(const char* path) NOTHROW;
    118 int NAME(unlink)(const char* path) NOTHROW;
    119 int utime(const char* filename, const struct utimbuf* times);
    120 read_ssize_t NAME(write)(int fd, const void* buf, size_t nbyte);
    121 
    122 #ifdef PROVIDES_SOCKET_API
    123 // Socket Functions
    124 int accept(int fd, struct sockaddr* addr, socklen_t* len);
    125 int bind(int fd, const struct sockaddr* addr, socklen_t len);
    126 int connect(int fd, const struct sockaddr* addr, socklen_t len);
    127 struct hostent* gethostbyname(const char* name);
    128 int getpeername(int fd, struct sockaddr* addr, socklen_t* len);
    129 int getsockname(int fd, struct sockaddr* addr, socklen_t* len);
    130 int getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len);
    131 int listen(int fd, int backlog);
    132 ssize_t recv(int fd, void* buf, size_t len, int flags);
    133 ssize_t recvfrom(int fd,
    134                  void* buf,
    135                  size_t len,
    136                  int flags,
    137                  struct sockaddr* addr,
    138                  socklen_t* addrlen);
    139 ssize_t recvmsg(int fd, struct msghdr* msg, int flags);
    140 ssize_t send(int fd, const void* buf, size_t len, int flags);
    141 ssize_t sendto(int fd,
    142                const void* buf,
    143                size_t len,
    144                int flags,
    145                const struct sockaddr* addr,
    146                socklen_t addrlen);
    147 ssize_t sendmsg(int fd, const struct msghdr* msg, int flags);
    148 int setsockopt(int fd, int lvl, int optname, const void* optval, socklen_t len);
    149 int shutdown(int fd, int how);
    150 int socket(int domain, int type, int protocol);
    151 int socketpair(int domain, int type, int protocl, int* sv);
    152 #endif  // PROVIDES_SOCKET_API
    153 
    154 EXTERN_C_END
    155 
    156 #endif  // LIBRARIES_NACL_IO_KERNEL_WRAP_H_
    157