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)
43typedef int chmod_mode_t;
44typedef int getcwd_size_t;
45typedef int read_ssize_t;
46typedef int write_ssize_t;
47#define NAME(x) _##x
48#else
49typedef mode_t chmod_mode_t;
50typedef size_t getcwd_size_t;
51typedef ssize_t read_ssize_t;
52typedef ssize_t write_ssize_t;
53#define NAME(x) x
54#endif
55
56EXTERN_C_BEGIN
57
58void kernel_wrap_init(void);
59void kernel_wrap_uninit(void);
60
61int NAME(access)(const char* path, int amode) NOTHROW;
62int NAME(chdir)(const char* path) NOTHROW;
63int NAME(chmod)(const char* path, chmod_mode_t mode) NOTHROW;
64int chown(const char* path, uid_t owner, gid_t group) NOTHROW;
65int NAME(close)(int fd);
66int NAME(dup)(int oldfd) NOTHROW;
67int NAME(dup2)(int oldfd, int newfd) NOTHROW;
68int fchown(int fd, uid_t owner, gid_t group) NOTHROW;
69#if defined(WIN32)
70int _fstat32(int fd, struct _stat32* buf);
71int _fstat64(int fd, struct _stat64* buf);
72int _fstat32i64(int fd, struct _stat32i64* buf);
73int _fstat64i32(int fd, struct _stat64i32* buf);
74#elif !defined(__linux__)
75struct stat;
76extern int fstat(int fd, struct stat* buf) NOTHROW;
77#endif
78int fsync(int fd);
79int ftruncate(int fd, off_t length) NOTHROW;
80char* NAME(getcwd)(char* buf, getcwd_size_t size) NOTHROW;
81char* getwd(char* buf) NOTHROW;
82#if !defined(__BIONIC__)
83int getdents(int fd, void* buf, unsigned int count) NOTHROW;
84#else
85struct dirent;
86int getdents(unsigned int fd, struct dirent* buf, unsigned int count) NOTHROW;
87#endif
88int NAME(isatty)(int fd) NOTHROW;
89int lchown(const char* path, uid_t owner, gid_t group) NOTHROW;
90int link(const char* oldpath, const char* newpath) NOTHROW;
91off_t NAME(lseek)(int fd, off_t offset, int whence) NOTHROW;
92#if defined(WIN32)
93int _mkdir(const char* path);
94#else
95int mkdir(const char* path, mode_t mode) NOTHROW;
96#endif
97void* mmap(void* addr, size_t length, int prot, int flags, int fd,
98           off_t offset) NOTHROW;
99int mount(const char* source, const char* target, const char* filesystemtype,
100          unsigned long mountflags, const void* data) NOTHROW;
101int munmap(void* addr, size_t length) NOTHROW;
102int NAME(open)(const char* path, int oflag, ...);
103read_ssize_t NAME(read)(int fd, void* buf, size_t nbyte);
104int remove(const char* path) NOTHROW;
105int NAME(rmdir)(const char* path) NOTHROW;
106sighandler_t sigset(int sig, sighandler_t disp);
107#if defined(WIN32)
108int setenv(const char* name, const char* value, int overwrite);
109int _stat32(const char* path, struct _stat32* buf);
110int _stat64(const char* path, struct _stat64* buf);
111int _stat32i64(const char* path, struct _stat32i64* buf);
112int _stat64i32(const char* path, struct _stat64i32* buf);
113#elif !defined(__linux__)
114extern int stat(const char* path, struct stat* buf) NOTHROW;
115#endif
116int symlink(const char* oldpath, const char* newpath) NOTHROW;
117int umount(const char* path) NOTHROW;
118int NAME(unlink)(const char* path) NOTHROW;
119int utime(const char* filename, const struct utimbuf* times) NOTHROW;
120read_ssize_t NAME(write)(int fd, const void* buf, size_t nbyte);
121
122#ifdef PROVIDES_SOCKET_API
123// Socket Functions
124int accept(int fd, struct sockaddr* addr, socklen_t* len);
125int bind(int fd, const struct sockaddr* addr, socklen_t len);
126int connect(int fd, const struct sockaddr* addr, socklen_t len);
127struct hostent* gethostbyname(const char* name);
128int getpeername(int fd, struct sockaddr* addr, socklen_t* len);
129int getsockname(int fd, struct sockaddr* addr, socklen_t* len);
130int getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len);
131int listen(int fd, int backlog);
132ssize_t recv(int fd, void* buf, size_t len, int flags);
133ssize_t recvfrom(int fd,
134                 void* buf,
135                 size_t len,
136                 int flags,
137                 struct sockaddr* addr,
138                 socklen_t* addrlen);
139ssize_t recvmsg(int fd, struct msghdr* msg, int flags);
140ssize_t send(int fd, const void* buf, size_t len, int flags);
141ssize_t sendto(int fd,
142               const void* buf,
143               size_t len,
144               int flags,
145               const struct sockaddr* addr,
146               socklen_t addrlen);
147ssize_t sendmsg(int fd, const struct msghdr* msg, int flags);
148int setsockopt(int fd, int lvl, int optname, const void* optval, socklen_t len);
149int shutdown(int fd, int how);
150int socket(int domain, int type, int protocol);
151int socketpair(int domain, int type, int protocl, int* sv);
152#endif  // PROVIDES_SOCKET_API
153
154EXTERN_C_END
155
156#endif  // LIBRARIES_NACL_IO_KERNEL_WRAP_H_
157