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