1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LIBRARIES_NACL_IO_KERNEL_WRAP_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LIBRARIES_NACL_IO_KERNEL_WRAP_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <assert.h>
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <signal.h>
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <stdint.h>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <sys/fcntl.h>
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <sys/ioctl.h>
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <sys/types.h>
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ossocket.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "nacl_io/ostypes.h"
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "nacl_io/osutime.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/macros.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GLIBC__)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/cdefs.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NOTHROW __THROW
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NOTHROW
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Most kernel intercept functions (ki_*) return -1 and set the global errno.
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// However, the IRT wrappers are expected to return errno on failure. These
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// macros are used in the wrappers to check that the ki_ function actually
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// set errno and to its value.
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define RTN_ERRNO_IF(cond) \
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (cond) {              \
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    assert(errno != 0);    \
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return errno;          \
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define ERRNO_RTN(cond)   \
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RTN_ERRNO_IF(cond < 0); \
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return 0;
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int chmod_mode_t;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int getcwd_size_t;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int read_ssize_t;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int write_ssize_t;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NAME(x) _##x
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef mode_t chmod_mode_t;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef size_t getcwd_size_t;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ssize_t read_ssize_t;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ssize_t write_ssize_t;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NAME(x) x
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EXTERN_C_BEGIN
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void kernel_wrap_init(void);
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void kernel_wrap_uninit(void);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(access)(const char* path, int amode) NOTHROW;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(chdir)(const char* path) NOTHROW;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(chmod)(const char* path, chmod_mode_t mode) NOTHROW;
64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint chown(const char* path, uid_t owner, gid_t group) NOTHROW;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(close)(int fd);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(dup)(int oldfd) NOTHROW;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int NAME(dup2)(int oldfd, int newfd) NOTHROW;
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint fchown(int fd, uid_t owner, gid_t group) NOTHROW;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat32(int fd, struct _stat32* buf);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat64(int fd, struct _stat64* buf);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat32i64(int fd, struct _stat32i64* buf);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _fstat64i32(int fd, struct _stat64i32* buf);
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif !defined(__linux__)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct stat;
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern int fstat(int fd, struct stat* buf) NOTHROW;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int fsync(int fd);
7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int ftruncate(int fd, off_t length) NOTHROW;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* NAME(getcwd)(char* buf, getcwd_size_t size) NOTHROW;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* getwd(char* buf) NOTHROW;
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(__BIONIC__)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int getdents(int fd, void* buf, unsigned int count) NOTHROW;
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct dirent;
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint getdents(unsigned int fd, struct dirent* buf, unsigned int count) NOTHROW;
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(isatty)(int fd) NOTHROW;
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochint lchown(const char* path, uid_t owner, gid_t group) NOTHROW;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int link(const char* oldpath, const char* newpath) NOTHROW;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)off_t NAME(lseek)(int fd, off_t offset, int whence) NOTHROW;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _mkdir(const char* path);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int mkdir(const char* path, mode_t mode) NOTHROW;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void* mmap(void* addr, size_t length, int prot, int flags, int fd,
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           off_t offset) NOTHROW;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int mount(const char* source, const char* target, const char* filesystemtype,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          unsigned long mountflags, const void* data) NOTHROW;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int munmap(void* addr, size_t length) NOTHROW;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(open)(const char* path, int oflag, ...);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)read_ssize_t NAME(read)(int fd, void* buf, size_t nbyte);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int remove(const char* path) NOTHROW;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(rmdir)(const char* path) NOTHROW;
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)sighandler_t sigset(int sig, sighandler_t disp);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint setenv(const char* name, const char* value, int overwrite);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat32(const char* path, struct _stat32* buf);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat64(const char* path, struct _stat64* buf);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat32i64(const char* path, struct _stat32i64* buf);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int _stat64i32(const char* path, struct _stat64i32* buf);
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif !defined(__linux__)
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)extern int stat(const char* path, struct stat* buf) NOTHROW;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int symlink(const char* oldpath, const char* newpath) NOTHROW;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int umount(const char* path) NOTHROW;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NAME(unlink)(const char* path) NOTHROW;
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint utime(const char* filename, const struct utimbuf* times) NOTHROW;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)read_ssize_t NAME(write)(int fd, const void* buf, size_t nbyte);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifdef PROVIDES_SOCKET_API
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Socket Functions
124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int accept(int fd, struct sockaddr* addr, socklen_t* len);
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int bind(int fd, const struct sockaddr* addr, socklen_t len);
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int connect(int fd, const struct sockaddr* addr, socklen_t len);
127bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochstruct hostent* gethostbyname(const char* name);
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int getpeername(int fd, struct sockaddr* addr, socklen_t* len);
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int getsockname(int fd, struct sockaddr* addr, socklen_t* len);
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len);
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int listen(int fd, int backlog);
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t recv(int fd, void* buf, size_t len, int flags);
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t recvfrom(int fd,
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 void* buf,
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 size_t len,
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 int flags,
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 struct sockaddr* addr,
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 socklen_t* addrlen);
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t recvmsg(int fd, struct msghdr* msg, int flags);
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t send(int fd, const void* buf, size_t len, int flags);
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t sendto(int fd,
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               const void* buf,
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               size_t len,
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               int flags,
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               const struct sockaddr* addr,
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)               socklen_t addrlen);
147a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t sendmsg(int fd, const struct msghdr* msg, int flags);
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int setsockopt(int fd, int lvl, int optname, const void* optval, socklen_t len);
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int shutdown(int fd, int how);
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int socket(int domain, int type, int protocol);
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int socketpair(int domain, int type, int protocl, int* sv);
152bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif  // PROVIDES_SOCKET_API
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EXTERN_C_END
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // LIBRARIES_NACL_IO_KERNEL_WRAP_H_
157