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
58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "nacl_io/kernel_intercept.h"
68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <assert.h>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <errno.h>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string.h>
1058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_proxy.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_wrap.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "nacl_io/kernel_wrap_real.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "nacl_io/log.h"
1558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "nacl_io/osmman.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ossocket.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "nacl_io/ostime.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/pepper_interface.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/real_pepper_interface.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing namespace nacl_io;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#define ON_NOSYS_RETURN(x)    \
2458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  if (!ki_is_initialized()) { \
2558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    errno = ENOSYS;           \
2658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    return x;                 \
2758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  }
2858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct KernelInterceptState {
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  KernelProxy* kp;
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PepperInterface* ppapi;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool kp_owned;
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static KernelInterceptState s_state;
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The the test code we want to be able to save the previous kernel
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// proxy when intialising and restore it on uninit.
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static KernelInterceptState s_saved_state;
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int ki_push_state_for_testing() {
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  assert(s_saved_state.kp == NULL);
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (s_saved_state.kp != NULL)
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return 1;
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  s_saved_state = s_state;
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  s_state.kp = NULL;
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  s_state.ppapi = NULL;
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  s_state.kp_owned = false;
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return 0;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static void ki_pop_state() {
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Swap out the KernelProxy. This will normally reset the
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // proxy to NULL, aside from in test code that has called
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // ki_push_state_for_testing().
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  s_state = s_saved_state;
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  s_saved_state.kp = NULL;
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  s_saved_state.ppapi = NULL;
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  s_saved_state.kp_owned = false;
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)int ki_pop_state_for_testing() {
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ki_pop_state();
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return 0;
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int ki_init(void* kp) {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LOG_TRACE("ki_init: %p", kp);
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return ki_init_ppapi(kp, 0, NULL);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int ki_init_ppapi(void* kp,
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  PP_Instance instance,
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  PPB_GetInterface get_browser_interface) {
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  assert(!s_state.kp);
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (s_state.kp != NULL)
77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return 1;
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PepperInterface* ppapi = NULL;
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (instance && get_browser_interface) {
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ppapi = new RealPepperInterface(instance, get_browser_interface);
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    s_state.ppapi = ppapi;
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int rtn = ki_init_interface(kp, ppapi);
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return rtn;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int ki_init_interface(void* kp, void* pepper_interface) {
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LOG_TRACE("ki_init_interface: %p %p", kp, pepper_interface);
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  assert(!s_state.kp);
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (s_state.kp != NULL)
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return 1;
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PepperInterface* ppapi = static_cast<PepperInterface*>(pepper_interface);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  kernel_wrap_init();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (kp == NULL) {
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    s_state.kp = new KernelProxy();
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    s_state.kp_owned = true;
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  } else {
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    s_state.kp = static_cast<KernelProxy*>(kp);
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    s_state.kp_owned = false;
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (s_state.kp->Init(ppapi) != 0)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return 1;
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return 0;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_is_initialized() {
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp != NULL;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ki_uninit() {
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LOG_TRACE("ki_uninit");
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  assert(s_state.kp);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (s_state.kp == NULL)
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return 1;
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (s_saved_state.kp == NULL)
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    kernel_wrap_uninit();
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // If we are going to delete the KernelProxy don't do it
123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // until we've swapped it out.
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  KernelInterceptState state_to_delete = s_state;
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ki_pop_state();
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (state_to_delete.kp_owned)
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    delete state_to_delete.kp;
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  delete state_to_delete.ppapi;
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return 0;
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnacl_io::KernelProxy* ki_get_proxy() {
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return s_state.kp;
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_chdir(const char* path) {
14058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->chdir(path);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid ki_exit(int status) {
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ki_is_initialized())
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    s_state.kp->exit(status);
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  _real_exit(status);
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)char* ki_getcwd(char* buf, size_t size) {
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // gtest uses getcwd in a static initializer and expects it to always
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // succeed.  If we haven't initialized kernel-intercept yet, then try
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // the IRT's getcwd, and fall back to just returning ".".
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ki_is_initialized()) {
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int rtn = _real_getcwd(buf, size);
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (rtn != 0) {
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      if (rtn == ENOSYS) {
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        buf[0] = '.';
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        buf[1] = 0;
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      } else {
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        errno = rtn;
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        return NULL;
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      }
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return buf;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->getcwd(buf, size);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)char* ki_getwd(char* buf) {
17258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(NULL);
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->getwd(buf);
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_dup(int oldfd) {
17758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->dup(oldfd);
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_dup2(int oldfd, int newfd) {
18258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->dup2(oldfd, newfd);
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_chmod(const char* path, mode_t mode) {
18758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->chmod(path, mode);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_fchdir(int fd) {
1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->fchdir(fd);
1948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int ki_fchmod(int fd, mode_t mode) {
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->fchmod(fd, mode);
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_stat(const char* path, struct stat* buf) {
20258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->stat(path, buf);
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_mkdir(const char* path, mode_t mode) {
20758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->mkdir(path, mode);
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_rmdir(const char* path) {
21258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->rmdir(path);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_mount(const char* source,
21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             const char* target,
21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             const char* filesystemtype,
21946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             unsigned long mountflags,
22046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)             const void* data) {
22158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->mount(source, target, filesystemtype, mountflags, data);
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
22546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_umount(const char* path) {
22658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->umount(path);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ki_open(const char* path, int oflag, mode_t mode) {
23158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s_state.kp->open(path, oflag, mode);
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int ki_pipe(int pipefds[2]) {
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->pipe(pipefds);
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t ki_read(int fd, void* buf, size_t nbyte) {
24158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->read(fd, buf, nbyte);
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t ki_write(int fd, const void* buf, size_t nbyte) {
24658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->write(fd, buf, nbyte);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_fstat(int fd, struct stat* buf) {
25158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->fstat(fd, buf);
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_getdents(int fd, void* buf, unsigned int count) {
25658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->getdents(fd, buf, count);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int ki_ftruncate(int fd, off_t length) {
26158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->ftruncate(fd, length);
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_fsync(int fd) {
26658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
267a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->fsync(fd);
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_fdatasync(int fd) {
2718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
272a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->fdatasync(fd);
2738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_isatty(int fd) {
27658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(0);
277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->isatty(fd);
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_close(int fd) {
28158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->close(fd);
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)off_t ki_lseek(int fd, off_t offset, int whence) {
28658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->lseek(fd, offset, whence);
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_remove(const char* path) {
29158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->remove(path);
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_unlink(const char* path) {
29658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->unlink(path);
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_truncate(const char* path, off_t length) {
30158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->truncate(path, length);
3038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_lstat(const char* path, struct stat* buf) {
3068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
307a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->lstat(path, buf);
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_link(const char* oldpath, const char* newpath) {
31158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->link(oldpath, newpath);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_rename(const char* path, const char* newpath) {
3168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->rename(path, newpath);
3188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_symlink(const char* oldpath, const char* newpath) {
32158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->symlink(oldpath, newpath);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_access(const char* path, int amode) {
3268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->access(path, amode);
3288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
33046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_readlink(const char* path, char* buf, size_t count) {
3318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->readlink(path, buf, count);
3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_utimes(const char* path, const struct timeval times[2]) {
3368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Implement in terms of utimens.
3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct timespec ts[2];
3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[0].tv_sec = times[0].tv_sec;
3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[0].tv_nsec = times[0].tv_usec * 1000;
3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[1].tv_sec = times[1].tv_sec;
3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[1].tv_nsec = times[1].tv_usec * 1000;
3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s_state.kp->utimens(path, ts);
3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ki_futimes(int fd, const struct timeval times[2]) {
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ON_NOSYS_RETURN(-1);
3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Implement in terms of futimens.
3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct timespec ts[2];
3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[0].tv_sec = times[0].tv_sec;
3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[0].tv_nsec = times[0].tv_usec * 1000;
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[1].tv_sec = times[1].tv_sec;
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[1].tv_nsec = times[1].tv_usec * 1000;
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s_state.kp->futimens(fd, ts);
3558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
3568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
35746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void* ki_mmap(void* addr,
35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              size_t length,
35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              int prot,
36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              int flags,
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              int fd,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              off_t offset) {
36358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(MAP_FAILED);
364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->mmap(addr, length, prot, flags, fd, offset);
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_munmap(void* addr, size_t length) {
36858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
369a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->munmap(addr, length);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int ki_open_resource(const char* file) {
37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return s_state.kp->open_resource(file);
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int ki_fcntl(int d, int request, va_list args) {
37868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->fcntl(d, request, args);
38068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int ki_ioctl(int d, int request, va_list args) {
38358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->ioctl(d, request, args);
385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ki_chown(const char* path, uid_t owner, gid_t group) {
38858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->chown(path, owner, group);
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ki_fchown(int fd, uid_t owner, gid_t group) {
39358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
394a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->fchown(fd, owner, group);
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ki_lchown(const char* path, uid_t owner, gid_t group) {
39858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
399a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->lchown(path, owner, group);
400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochint ki_utime(const char* filename, const struct utimbuf* times) {
40358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ON_NOSYS_RETURN(-1);
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Implement in terms of utimens.
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct timespec ts[2];
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[0].tv_sec = times->actime;
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[0].tv_nsec = 0;
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[1].tv_sec = times->modtime;
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ts[1].tv_nsec = 0;
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s_state.kp->utimens(filename, ts);
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ki_futimens(int fd, const struct timespec times[2]) {
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ON_NOSYS_RETURN(-1);
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s_state.kp->futimens(fd, times);
416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
417a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_poll(struct pollfd* fds, nfds_t nfds, int timeout) {
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->poll(fds, nfds, timeout);
4203240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
4213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_select(int nfds,
42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              fd_set* readfds,
42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              fd_set* writefds,
42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              fd_set* exceptfds,
42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)              struct timeval* timeout) {
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->select(nfds, readfds, writefds, exceptfds, timeout);
4283240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
4293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
430bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochint ki_tcflush(int fd, int queue_selector) {
431bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  ON_NOSYS_RETURN(-1);
432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->tcflush(fd, queue_selector);
433bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
434bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
435bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochint ki_tcgetattr(int fd, struct termios* termios_p) {
436bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  ON_NOSYS_RETURN(-1);
437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->tcgetattr(fd, termios_p);
438bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
439bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
44046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_tcsetattr(int fd,
44146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 int optional_actions,
44246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 const struct termios* termios_p) {
443bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  ON_NOSYS_RETURN(-1);
444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->tcsetattr(fd, optional_actions, termios_p);
445bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
446bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)int ki_kill(pid_t pid, int sig) {
4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->kill(pid, sig);
4503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_killpg(pid_t pid, int sig) {
4538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  errno = ENOSYS;
4548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return -1;
4558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_sigaction(int signum,
45846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 const struct sigaction* action,
459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 struct sigaction* oaction) {
460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ON_NOSYS_RETURN(-1);
461a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->sigaction(signum, action, oaction);
4628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_sigpause(int sigmask) {
4658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  errno = ENOSYS;
4668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return -1;
4678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_sigpending(sigset_t* set) {
4708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  errno = ENOSYS;
4718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return -1;
4728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int ki_sigsuspend(const sigset_t* set) {
4758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  errno = ENOSYS;
4768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return -1;
4778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)sighandler_t ki_signal(int signum, sighandler_t handler) {
480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ki_sigset(signum, handler);
4813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)sighandler_t ki_sigset(int signum, sighandler_t handler) {
4843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ON_NOSYS_RETURN(SIG_ERR);
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Implement sigset(2) in terms of sigaction(2).
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct sigaction action;
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct sigaction oaction;
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(&action, 0, sizeof(action));
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  memset(&oaction, 0, sizeof(oaction));
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  action.sa_handler = handler;
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int rtn = s_state.kp->sigaction(signum, &action, &oaction);
492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (rtn)
493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return SIG_ERR;
494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return oaction.sa_handler;
4953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifdef PROVIDES_SOCKET_API
498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Socket Functions
499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_accept(int fd, struct sockaddr* addr, socklen_t* len) {
5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
501a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->accept(fd, addr, len);
502a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
503a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
504a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_bind(int fd, const struct sockaddr* addr, socklen_t len) {
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->bind(fd, addr, len);
507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_connect(int fd, const struct sockaddr* addr, socklen_t len) {
5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->connect(fd, addr, len);
512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
513a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
514bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochstruct hostent* ki_gethostbyname(const char* name) {
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(NULL);
516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->gethostbyname(name);
517bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
518bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint ki_getnameinfo(const struct sockaddr *sa,
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   socklen_t salen,
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   char *host,
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   size_t hostlen,
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   char *serv,
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   size_t servlen,
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   unsigned int flags) {
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ON_NOSYS_RETURN(EAI_SYSTEM);
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return s_state.kp->getnameinfo(sa, salen, host, hostlen, serv, servlen,
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 flags);
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
53146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_getaddrinfo(const char* node,
53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   const char* service,
53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   const struct addrinfo* hints,
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                   struct addrinfo** res) {
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(EAI_SYSTEM);
536a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->getaddrinfo(node, service, hints, res);
5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ki_freeaddrinfo(struct addrinfo* res) {
540a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  s_state.kp->freeaddrinfo(res);
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_getpeername(int fd, struct sockaddr* addr, socklen_t* len) {
5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
545a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->getpeername(fd, addr, len);
546a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
547a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
548a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_getsockname(int fd, struct sockaddr* addr, socklen_t* len) {
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->getsockname(fd, addr, len);
551a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len) {
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->getsockopt(fd, lvl, optname, optval, len);
556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_listen(int fd, int backlog) {
5595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->listen(fd, backlog);
561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
562a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
563a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t ki_recv(int fd, void* buf, size_t len, int flags) {
5645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->recv(fd, buf, len, flags);
566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
56846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t ki_recvfrom(int fd,
56946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    void* buf,
57046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    size_t len,
57146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    int flags,
57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    struct sockaddr* addr,
57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                    socklen_t* addrlen) {
5745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->recvfrom(fd, buf, len, flags, addr, addrlen);
576a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
577a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
578a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t ki_recvmsg(int fd, struct msghdr* msg, int flags) {
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
580a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->recvmsg(fd, msg, flags);
581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
582a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
583a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t ki_send(int fd, const void* buf, size_t len, int flags) {
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
585a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->send(fd, buf, len, flags);
586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ssize_t ki_sendto(int fd,
58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  const void* buf,
59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  size_t len,
59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  int flags,
59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  const struct sockaddr* addr,
59346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  socklen_t addrlen) {
5945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->sendto(fd, buf, len, flags, addr, addrlen);
596a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
597a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
598a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ssize_t ki_sendmsg(int fd, const struct msghdr* msg, int flags) {
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
600a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->sendmsg(fd, msg, flags);
601a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
602a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)int ki_setsockopt(int fd,
60446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  int lvl,
60546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  int optname,
60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  const void* optval,
607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                  socklen_t len) {
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
609a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->setsockopt(fd, lvl, optname, optval, len);
610a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
611a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_shutdown(int fd, int how) {
6135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->shutdown(fd, how);
615a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
616a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_socket(int domain, int type, int protocol) {
6185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->socket(domain, type, protocol);
620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)int ki_socketpair(int domain, int type, int protocol, int* sv) {
6235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ON_NOSYS_RETURN(-1);
624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return s_state.kp->socketpair(domain, type, protocol, sv);
625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
626bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#endif  // PROVIDES_SOCKET_API
627