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