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