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