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 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LIBRARIES_NACL_IO_KERNEL_HANDLE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LIBRARIES_NACL_IO_KERNEL_HANDLE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <fcntl.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pthread.h> 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <ppapi/c/pp_resource.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "nacl_io/error.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "nacl_io/filesystem.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "nacl_io/node.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "nacl_io/ossocket.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/ostypes.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/macros.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "sdk_util/ref_object.h" 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "sdk_util/scoped_ref.h" 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "sdk_util/simple_lock.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace nacl_io { 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SocketNode; 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// HandleAttr struct is passed the Node in calls 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// to Read and Write. It contains handle specific state 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// such as the file offset and the open flags. 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)struct HandleAttr { 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HandleAttr() : offs(0), flags(0) {} 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool IsBlocking() const { return !(flags & O_NONBLOCK); } 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) off_t offs; 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int flags; 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KernelHandle provides a reference counted container for the open 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// file information, such as it's filesystem, node, access type and offset. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KernelHandle can only be referenced when the KernelProxy lock is held. 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass KernelHandle : public sdk_util::RefObject { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch KernelHandle(); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) KernelHandle(const ScopedFilesystem& fs, const ScopedNode& node); 45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ~KernelHandle(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Error Init(int open_flags); 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error Accept(PP_Resource* new_sock, struct sockaddr* addr, socklen_t* len); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error Connect(const struct sockaddr* addr, socklen_t len); 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error Fcntl(int request, int* result, ...); 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error VFcntl(int request, int* result, va_list args); 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error GetDents(struct dirent* pdir, size_t count, int* bytes_written); 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error Read(void* buf, size_t nbytes, int* bytes_read); 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error Recv(void* buf, size_t len, int flags, int* out_len); 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error RecvFrom(void* buf, 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t len, 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int flags, 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) struct sockaddr* src_addr, 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) socklen_t* addrlen, 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int* out_len); 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Assumes |out_offset| is non-NULL. 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Error Seek(off_t offset, int whence, off_t* out_offset); 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error Send(const void* buf, size_t len, int flags, int* out_len); 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Error SendTo(const void* buf, 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t len, 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int flags, 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const struct sockaddr* dest_addr, 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) socklen_t addrlen, 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int* out_len); 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Error Write(const void* buf, size_t nbytes, int* bytes_written); 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ScopedNode& node() { return node_; } 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ScopedFilesystem& filesystem() { return filesystem_; } 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const HandleAttr& Attr() { return handle_attr_; } 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) int OpenMode() { return handle_attr_.flags & 3; } 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the SocketNode* if this node is a socket otherwise returns 823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // NULL. 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SocketNode* socket_node(); 843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedFilesystem filesystem_; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ScopedNode node_; 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) sdk_util::SimpleLock handle_lock_; 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) HandleAttr handle_attr_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class KernelProxy; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KernelHandle); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochtypedef sdk_util::ScopedRef<KernelHandle> ScopedKernelHandle; 95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace nacl_io 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // LIBRARIES_NACL_IO_KERNEL_HANDLE_H_ 99