kernel_intercept.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <errno.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "nacl_io/kernel_intercept.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "nacl_io/kernel_proxy.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "nacl_io/kernel_wrap.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nacl_io/osmman.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nacl_io/ossocket.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nacl_io/pepper_interface.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "nacl_io/pepper_interface.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "nacl_io/real_pepper_interface.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using namespace nacl_io; 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ON_NOSYS_RETURN(x) \ 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ki_is_initialized()) { \ 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) errno = ENOSYS; \ 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return x; \ 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static KernelProxy* s_kp; 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)static bool s_kp_owned; 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid ki_init(void* kp) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ki_init_ppapi(kp, 0, NULL); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ki_init_ppapi(void* kp, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_GetInterface get_browser_interface) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kernel_wrap_init(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kp == NULL) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s_kp = new KernelProxy(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s_kp_owned = true; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s_kp = static_cast<KernelProxy*>(kp); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s_kp_owned = false; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PepperInterface* ppapi = NULL; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (instance && get_browser_interface) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi = new RealPepperInterface(instance, get_browser_interface); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s_kp->Init(ppapi); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ki_is_initialized() { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return s_kp != NULL; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid ki_uninit() { 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch kernel_wrap_uninit(); 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (s_kp_owned) 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch delete s_kp; 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch s_kp = NULL; 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_chdir(const char* path) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_NOSYS_RETURN(-1); 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->chdir(path); 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochchar* ki_getcwd(char* buf, size_t size) { 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // gtest uses getcwd in a static initializer. If we haven't initialized the 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // kernel-intercept yet, just return ".". 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!ki_is_initialized()) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size < 2) { 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch errno = ERANGE; 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return NULL; 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch buf[0] = '.'; 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch buf[1] = 0; 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return buf; 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->getcwd(buf, size); 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochchar* ki_getwd(char* buf) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_NOSYS_RETURN(NULL); 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->getwd(buf); 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_dup(int oldfd) { 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->dup(oldfd); 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_dup2(int oldfd, int newfd) { 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->dup2(oldfd, newfd); 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_chmod(const char *path, mode_t mode) { 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->chmod(path, mode); 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_fchmod(int fd, mode_t mode) { 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->fchmod(fd, mode); 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_stat(const char *path, struct stat *buf) { 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->stat(path, buf); 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_mkdir(const char *path, mode_t mode) { 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->mkdir(path, mode); 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_rmdir(const char *path) { 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->rmdir(path); 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_mount(const char *source, const char *target, const char *filesystemtype, 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch unsigned long mountflags, const void *data) { 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->mount(source, target, filesystemtype, mountflags, data); 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_umount(const char *path) { 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->umount(path); 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_open(const char *path, int oflag) { 1350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->open(path, oflag); 1370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_pipe(int pipefds[2]) { 1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->pipe(pipefds); 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ssize_t ki_read(int fd, void *buf, size_t nbyte) { 1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->read(fd, buf, nbyte); 1470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochssize_t ki_write(int fd, const void *buf, size_t nbyte) { 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->write(fd, buf, nbyte); 1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)int ki_fstat(int fd, struct stat *buf){ 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_NOSYS_RETURN(-1); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return s_kp->fstat(fd, buf); 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_getdents(int fd, void *buf, unsigned int count) { 1600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->getdents(fd, buf, count); 1620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ki_ftruncate(int fd, off_t length) { 1650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->ftruncate(fd, length); 1670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_fsync(int fd) { 1700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->fsync(fd); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_isatty(int fd) { 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(0); 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->isatty(fd); 1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_close(int fd) { 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ON_NOSYS_RETURN(-1); 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return s_kp->close(fd); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochoff_t ki_lseek(int fd, off_t offset, int whence) { 1850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->lseek(fd, offset, whence); 1870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_remove(const char* path) { 1900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->remove(path); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ki_unlink(const char* path) { 1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->unlink(path); 1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_access(const char* path, int amode) { 2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->access(path, amode); 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_link(const char* oldpath, const char* newpath) { 2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->link(oldpath, newpath); 2070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_symlink(const char* oldpath, const char* newpath) { 2100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->symlink(oldpath, newpath); 2120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid* ki_mmap(void* addr, size_t length, int prot, int flags, int fd, 2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch off_t offset) { 2160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(MAP_FAILED); 2170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->mmap(addr, length, prot, flags, fd, offset); 2180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_munmap(void* addr, size_t length) { 2210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->munmap(addr, length); 2230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_open_resource(const char* file) { 2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); return s_kp->open_resource(file); 2270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ki_fcntl(int d, int request, va_list args) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_NOSYS_RETURN(-1); 2310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->fcntl(d, request, args); 2320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_ioctl(int d, int request, va_list args) { 2350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->ioctl(d, request, args); 2370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_chown(const char* path, uid_t owner, gid_t group) { 2400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->chown(path, owner, group); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_fchown(int fd, uid_t owner, gid_t group) { 2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->fchown(fd, owner, group); 2470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_lchown(const char* path, uid_t owner, gid_t group) { 2500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->lchown(path, owner, group); 2520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_utime(const char* filename, const struct utimbuf* times) { 2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->utime(filename, times); 2570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_poll(struct pollfd *fds, nfds_t nfds, int timeout) { 2600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->poll(fds, nfds, timeout); 2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_select(int nfds, fd_set* readfds, fd_set* writefds, 2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch fd_set* exceptfds, struct timeval* timeout) { 2650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->select(nfds, readfds, writefds, exceptfds, timeout); 2660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_tcflush(int fd, int queue_selector) { 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_NOSYS_RETURN(-1); 270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return s_kp->tcflush(fd, queue_selector); 2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ki_tcgetattr(int fd, struct termios* termios_p) { 2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->tcgetattr(fd, termios_p); 2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_tcsetattr(int fd, int optional_actions, 2790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const struct termios *termios_p) { 2800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->tcsetattr(fd, optional_actions, termios_p); 2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochint ki_kill(pid_t pid, int sig) { 2850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(-1); 2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->kill(pid, sig); 2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochsighandler_t ki_signal(int signum, sighandler_t handler) { 2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ON_NOSYS_RETURN(SIG_ERR); 2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->sigset(signum, handler); 2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochsighandler_t ki_sigset(int signum, sighandler_t handler) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_NOSYS_RETURN(SIG_ERR); 2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return s_kp->sigset(signum, handler); 2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 2980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifdef PROVIDES_SOCKET_API 3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Socket Functions 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ki_accept(int fd, struct sockaddr* addr, socklen_t* len) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return s_kp->accept(fd, addr, len); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 304 305int ki_bind(int fd, const struct sockaddr* addr, socklen_t len) { 306 return s_kp->bind(fd, addr, len); 307} 308 309int ki_connect(int fd, const struct sockaddr* addr, socklen_t len) { 310 return s_kp->connect(fd, addr, len); 311} 312 313struct hostent* ki_gethostbyname(const char* name) { 314 return s_kp->gethostbyname(name); 315} 316 317int ki_getpeername(int fd, struct sockaddr* addr, socklen_t* len) { 318 return s_kp->getpeername(fd, addr, len); 319} 320 321int ki_getsockname(int fd, struct sockaddr* addr, socklen_t* len) { 322 return s_kp->getsockname(fd, addr, len); 323} 324 325int ki_getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len) { 326 return s_kp->getsockopt(fd, lvl, optname, optval, len); 327} 328 329int ki_listen(int fd, int backlog) { 330 return s_kp->listen(fd, backlog); 331} 332 333ssize_t ki_recv(int fd, void* buf, size_t len, int flags) { 334 return s_kp->recv(fd, buf, len, flags); 335} 336 337ssize_t ki_recvfrom(int fd, void* buf, size_t len, int flags, 338 struct sockaddr* addr, socklen_t* addrlen) { 339 return s_kp->recvfrom(fd, buf, len, flags, addr, addrlen); 340} 341 342ssize_t ki_recvmsg(int fd, struct msghdr* msg, int flags) { 343 return s_kp->recvmsg(fd, msg, flags); 344} 345 346ssize_t ki_send(int fd, const void* buf, size_t len, int flags) { 347 return s_kp->send(fd, buf, len, flags); 348} 349 350ssize_t ki_sendto(int fd, const void* buf, size_t len, int flags, 351 const struct sockaddr* addr, socklen_t addrlen) { 352 return s_kp->sendto(fd, buf, len, flags, addr, addrlen); 353} 354 355ssize_t ki_sendmsg(int fd, const struct msghdr* msg, int flags) { 356 return s_kp->sendmsg(fd, msg, flags); 357} 358 359int ki_setsockopt(int fd, int lvl, int optname, const void* optval, 360 socklen_t len) { 361 return s_kp->setsockopt(fd, lvl, optname, optval, len); 362} 363 364int ki_shutdown(int fd, int how) { 365 return s_kp->shutdown(fd, how); 366} 367 368int ki_socket(int domain, int type, int protocol) { 369 return s_kp->socket(domain, type, protocol); 370} 371 372int ki_socketpair(int domain, int type, int protocol, int* sv) { 373 return s_kp->socketpair(domain, type, protocol, sv); 374} 375#endif // PROVIDES_SOCKET_API 376